Пример #1
0
        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;
        }
Пример #2
0
        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]);
                        }
                    }
                }
            }
        }
Пример #3
0
        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);
        }
Пример #4
0
        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));
            }
        }
Пример #5
0
        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);
        }
Пример #6
0
 public void Clone(ModelSettings to)
 {
     to.optimise     = optimise;
     to.toleranceMap = new Dictionary <string, float>(toleranceMap);
     to.channels     = new List <Channel>(channels);
     to.outputTypes  = outputTypes;
 }
Пример #7
0
        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++;
            }
        }
Пример #8
0
        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);
        }
Пример #9
0
        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());
        }