private void RemapInputs(Model.SubModel sub, ModelSettings settings) { if (settings.channels.Count <= 0) { return; } List <Model.SourceInput> newInputs = new List <Model.SourceInput>(); foreach (ModelSettings.Channel channel in settings.channels) { Model.SourceInput input = sub.inputList.FirstOrDefault((i) => i.semantic == channel.semantic && i.set == channel.set); if (input == null && !channel.useDefault) { continue; } Model.SourceInput newInput = new Model.SourceInput(); newInput.name = channel.name; newInput.data = (input != null)?input.data:null; newInput.semantic = channel.semantic; newInput.set = channel.set; newInput.offset = (input != null)?input.offset:channel.def; if (newInput.data != null) { newInput.data.semantic = newInput.name; } newInputs.Add(newInput); } sub.inputList = newInputs; }
private void BuildVertexData(Model.SubModel sub, ModelSettings settings) { sub.vertexStride = 0; foreach (Model.SourceInput input in sub.inputList) { if (input.data != null) { sub.vertexStride += input.data.dataRefs.Count; } } for (int i = 0; i < sub.VertexMap.Count / sub.indexStride; i++) { foreach (Model.SourceInput input in sub.inputList) { if (input.data != null) { for (int j = 0; j < input.data.dataRefs.Count; j++) { sub.VertexList.Add(input.data.data[sub.VertexMap[i * sub.indexStride + input.offset] * input.data.dataRefs.Count + j]); } } } } }
private void Process(Model.SubModel sub, ModelSettings settings) { RemapInputs(sub, settings); RemapOffsets(sub); foreach (Model.SourceInput input in sub.inputList) { if (input.data != null) { ApplyMap(sub, input.data, input.offset); } } if (settings.optimise) { Remap(sub); } if ((sub.type & settings.outputTypes) != sub.type) { Converter conv = converters.FirstOrDefault((c) => c.source == sub.type && (c.dest & settings.outputTypes) == c.dest); if (conv != null) { conv.converter(sub); } else { mgr.Error(string.Format("Cannot convert {0} to a suitible format", sub.type)); } } BuildVertexData(sub, settings); }
public static void ProcessSettings(ModelSettings model, XElement item) { if (item.Attribute("optimise") != null) { model.optimise = (bool)item.Attribute("optimise"); } foreach (XElement tol in item.Elements("tolerance")) { model.toleranceMap[(string)tol.Attribute("name")] = (float)tol.Attribute("value"); } if (item.Attribute("outputtypes") != null) { foreach (Model.IndexType type in ((string)item.Attribute("outputtypes")).Split(',').Select((s) => Enum.Parse(typeof(Model.IndexType), s))) { model.outputTypes |= type; } } foreach (XElement channel in item.Elements("channel")) { model.channels.Add(ProcessChannel(channel)); } }
protected override void Process(XElement item) { string name = (string)item.Attribute("name"); if (name == null) { name = mgr.name; } else { name = mgr.name + "." + name; } Model model = mgr.GetData <Model>(name, GetterType.Create); if (model == null) { return; } ModelSettings settings = mgr.GetData <ModelSettings>("model.settings"); model.settings = new ModelSettings(); settings.Clone(model.settings); ProcessSettings(model.settings, item); }
public void Clone(ModelSettings to) { to.optimise = optimise; to.toleranceMap = new Dictionary <string, float>(toleranceMap); to.channels = new List <Channel>(channels); to.outputTypes = outputTypes; }
private void Remap(Model.SourceAccessor source, string semantic, ModelSettings settings) { float tolerance = 0.01f; if (settings.toleranceMap.ContainsKey(semantic)) { tolerance = settings.toleranceMap[semantic]; } if (!settings.optimise) { tolerance = 0; } source.data = new List <float>(); source.map = new List <int>(); int stride = source.dataRefs.Count; int num = 0; for (int i = 0; i < source.count; i++) { List <float> item = new List <float>(); foreach (Model.SourceDataRef dataRef in source.dataRefs) { item.Add(dataRef.data.data[dataRef.stride * i + dataRef.offset]); } if (tolerance != 0) { bool found = false; for (int j = 0; j < num; j++) { found = true; for (int k = 0; k < stride; k++) { if (Math.Abs(item[k] - source.data[j * stride + k]) > tolerance) { found = false; break; } } if (found) { source.map.Add(j); break; } } if (found) { continue; } } source.data.AddRange(item); source.map.Add(num); num++; } }
protected void ReadModelSettings(XElement root) { XElement xSet = root.Element("model"); if (xSet == null) { return; } ModelSettings settings = mgr.GetData <ModelSettings>("model.settings", GetterType.Create); settings.MakeDefault(); ConfigureModel.ProcessSettings(settings, xSet); }
protected virtual void Setup() { ModelSettings model = mgr.GetData <ModelSettings>("model.settings", GetterType.Create); model.MakeDefault(); model.outputTypes = Model.IndexType.Lines | Model.IndexType.LineStrips | Model.IndexType.Triangles | Model.IndexType.TriStrip | Model.IndexType.TriFans; NodeSettings node = mgr.GetData <NodeSettings>("node.settings", GetterType.Create); node.MakeDefault(); // project description file mgr.SetHandler(new ConfigureProject(), mgr.configure); // level description file mgr.SetHandler(new ConfigureLevel(), mgr.configure); //texture handlers mgr.SetHandler(new ConfigureTexture(), mgr.configure); mgr.SetHandler(new TextureFile()); mgr.SetHandler(new ProcessTexture()); mgr.AddExtension(".bmp", "texture"); mgr.AddExtension(".dds", "texture"); mgr.AddExtension(".gif", "texture"); mgr.AddExtension(".jpg", "texture"); mgr.AddExtension(".jpeg", "texture"); mgr.AddExtension(".png", "texture"); mgr.AddExtension(".psd", "texture"); mgr.AddExtension(".psp", "texture"); mgr.AddExtension(".tga", "texture"); mgr.AddExtension(".tif", "texture"); mgr.AddExtension(".tiff", "texture"); //effect handlers mgr.SetHandler(new ConfigureEffect(), mgr.configure); mgr.SetHandler(new ProcessEffect()); //collada handlers mgr.SetHandler(new ProcessModel()); mgr.SetHandler(new ConfigureModel(), mgr.configure); mgr.SetHandler(new ColladaModel(), mgr.collada); mgr.SetHandler(new ColladaMaterial(), mgr.collada); mgr.SetHandler(new ColladaTexture(), mgr.collada); //node handlers mgr.SetHandler(new ColladaNode(), mgr.collada); mgr.SetHandler(new ConfigureGameObject(), mgr.configure); mgr.SetHandler(new ProcessGameObject()); mgr.SetHandler(new ConfigureScene(), mgr.configure); mgr.SetHandler(new ProcessScene()); //module handlers mgr.SetModuleFactory("model", () => new ModelModule()); mgr.SetModuleFactory("dummy", () => new DummyModule()); mgr.SetModuleFactory("camera", () => new CameraModule()); mgr.SetModuleFactory("frameM", () => new FrameMModule()); mgr.SetModuleFactory("framePQS", () => new FramePQSModule()); mgr.SetModuleFactory("framePRS", () => new FramePRSModule()); mgr.SetModuleFactory("frameIdent", () => new FrameIdentModule()); mgr.SetModuleFactory("scene.simple", () => new SimpleSceneModule()); }