/// <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); } }
/// <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); } }
/// <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]); } } }
/// <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; } }