Example #1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="semantic"></param>
        /// <param name="triangles"></param>
        /// <param name="values"></param>
        public void AddSourceData(string name, Input_Semantic semantic, float[] values, int set = 0)
        {
            var src = _optimizers.Find(e => e.Semantic == semantic && e.Set == set);

            if (src == null)
            {
                src     = new SourceOptimizer(name, semantic, values, set);
                src.Set = set;
                _optimizers.Add(src);
            }
        }
Example #2
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="semantic"></param>
        /// <returns></returns>
        public string GetID(Input_Semantic semantic, int set = 0)
        {
            var src = _optimizers.Find(e => e.Semantic == semantic && e.Set == set);

            if (src == null)
            {
                return("");
            }
            else
            {
                return(src.Name);
            }
        }
Example #3
0
            /// <summary>
            ///
            /// </summary>
            /// <param name="name"></param>
            /// <param name="sem"></param>
            public SourceOptimizer(string name, Input_Semantic sem, float[] values, int set)
            {
                Name     = name + "-" + sem.ToString() + (set != 0 ? set.ToString() : "");
                Semantic = sem;
                Set      = set;

                if (Semantic == Input_Semantic.POSITION)
                {
                    // do not optimize position
                    newVertices.AddRange(values);
                }
                else
                {
                    // optimize and generate remapping
                    Dictionary <string, int> valueToIndex = new Dictionary <string, int>();

                    for (int i = 0; i < values.Length; i += Stride)
                    {
                        StringBuilder sb = new StringBuilder();
                        for (int j = 0; j < Stride; j++)
                        {
                            sb.Append(values[i + j] + " ");
                        }
                        var val = sb.ToString();

                        if (!valueToIndex.ContainsKey(val))
                        {
                            valueToIndex.Add(val, newVertices.Count / Stride);
                            for (int j = 0; j < Stride; j++)
                            {
                                newVertices.Add(values[i + j]);
                            }
                        }

                        remap.Add(i / Stride, valueToIndex[val]);
                    }
                }
            }
Example #4
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="semantic"></param>
        /// <param name="values"></param>
        /// <param name="vertex"></param>
        /// <param name="vertices"></param>
        private void ProcessInput(Input_Semantic semantic, string source, int set, IOVertex vertex, Vertices vertices, int index, SourceManager srcs, List <IOEnvelope> vertexEnvelopes)
        {
            var values = srcs.GetFloatValue(source, index);

            switch (semantic)
            {
            case Input_Semantic.VERTEX:
                // process per vertex input
                foreach (var vertInput in vertices.Input)
                {
                    ProcessInput(vertInput.Semantic, vertInput.source, 0, vertex, vertices, index, srcs, vertexEnvelopes);
                }

                // load envelopes if availiable
                if (vertexEnvelopes != null && index < vertexEnvelopes.Count)
                {
                    // copy bone weights
                    var en = vertexEnvelopes[index];
                    for (int i = 0; i < en.Weights.Count; i++)
                    {
                        vertex.Envelope.Weights.Add(new IOBoneWeight()
                        {
                            BoneName   = en.Weights[i].BoneName,
                            Weight     = en.Weights[i].Weight,
                            BindMatrix = en.Weights[i].BindMatrix
                        });
                    }

                    // make the bind matrix as being used
                    vertex.Envelope.UseBindMatrix = true;
                }
                break;

            case Input_Semantic.POSITION:
                vertex.Position = new Vector3(
                    values.Length > 0 ? values[0] : 0,
                    values.Length > 1 ? values[1] : 0,
                    values.Length > 2 ? values[2] : 0);
                break;

            case Input_Semantic.NORMAL:
                vertex.Normal = new Vector3(
                    values.Length > 0 ? values[0] : 0,
                    values.Length > 1 ? values[1] : 0,
                    values.Length > 2 ? values[2] : 0);
                break;

            case Input_Semantic.TANGENT:
                vertex.Tangent = new Vector3(
                    values.Length > 0 ? values[0] : 0,
                    values.Length > 1 ? values[1] : 0,
                    values.Length > 2 ? values[2] : 0);
                break;

            case Input_Semantic.BINORMAL:
                vertex.Binormal = new Vector3(
                    values.Length > 0 ? values[0] : 0,
                    values.Length > 1 ? values[1] : 0,
                    values.Length > 2 ? values[2] : 0);
                break;

            case Input_Semantic.TEXCOORD:
                vertex.SetUV(
                    values.Length > 0 ? values[0] : 0,
                    values.Length > 1 ? values[1] : 0,
                    set);
                break;

            case Input_Semantic.COLOR:
                vertex.SetColor(
                    values.Length > 0 ? values[0] : 0,
                    values.Length > 1 ? values[1] : 0,
                    values.Length > 2 ? values[2] : 0,
                    values.Length > 3 ? values[3] : 0,
                    set);
                break;
            }
        }