private static void CloneVertices(List <Segment> segments, int segIndex, GeneratingModel model, List <int> output, ref int wrapPoint) { var input = output.ToArray(); output.Clear(); var seg = segments[segIndex]; bool wrapProcessed = false; for (int i = 0; i < input.Length; ++i) { var rdv = model.rdv[input[i]]; var deg = seg.Rotation0Fraction + seg.RotationStepFraction * i; if (deg >= 1) { if (i != input.Length - 1) { continue; //should never happen } deg = 0; } rdv.Normal = CalculateNormal(segments, segIndex, deg, true); output.Add(model.AddRDV(rdv)); if (rdv.UV.Y == 0 && wrapPoint != -1) { if (wrapProcessed) { throw new Exception(); } var rdv2 = new ModelVertex { Position = model.rdv[wrapPoint].Position, Normal = rdv.Normal, UV = model.rdv[wrapPoint].UV, }; wrapPoint = model.AddRDV(rdv2); wrapProcessed = true; } } if (!wrapProcessed && wrapPoint != -1) { throw new Exception(); } }
private static int GetVertexIndex(ObjModel model, string str) { if (!model.ModelVertexString.TryGetValue(str, out var index)) { ModelVertex mv = new ModelVertex(); var ci = str.Split('/'); mv.Position = model.Position[int.Parse(ci[0]) - 1]; if (ci.Length >= 2 && ci[1].Length > 0) { mv.UV = model.TexCoord[int.Parse(ci[1]) - 1]; } if (ci.Length >= 3 && ci[2].Length > 0) { mv.Normal = model.Normal[int.Parse(ci[2]) - 1]; } index = model.ModelVertices.Count; model.ModelVertices.Add(mv); model.ModelVertexString.Add(str, index); } return(index); }