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++; } }
private void ApplyMap(Model.SubModel sub, Model.SourceAccessor sourceData, int offset) { if (sourceData.map == null) { return; } for (int i = 0; i < sub.VertexMap.Count; i += sub.indexStride) { sub.VertexMap[i + offset] = sourceData.map[sub.VertexMap[i + offset]]; } }
private void ReadAccessor(Model model, XElement xSource) { XElement accessor = xSource.Element(parent.ns + "technique_common"); if (accessor == null) { return; } accessor = accessor.Element(parent.ns + "accessor"); if (accessor == null) { return; } string dataName = ((string)accessor.Attribute("source")).Substring(1); Model.SourceData dataItem = model.dataList.FirstOrDefault((d) => d.name == dataName); if (dataItem == null) { return; } Model.SourceAccessor source = new Model.SourceAccessor(); source.name = (string)xSource.Attribute("id"); source.count = (int)accessor.Attribute("count"); int offset = (accessor.Attribute("offset") == null)?0:(int)accessor.Attribute("offset"); int stride = (accessor.Attribute("stride") == null)?1:(int)accessor.Attribute("stride"); foreach (XElement param in accessor.Elements(parent.ns + "param")) { if (param.Attribute("name") != null) { Model.SourceDataRef sourceRef = new Model.SourceDataRef(); sourceRef.data = dataItem; sourceRef.offset = offset; sourceRef.stride = stride; source.dataRefs.Add(sourceRef); } offset++; } model.accessorList.Add(source); }