internal void BuildDrawInfo(PathGraph graph) { FreeVBs(); List <Vector3> verts = new List <Vector3>(); List <Vector3> norms = new List <Vector3>(); List <UInt32> indexes = new List <UInt32>(); List <int> vertCounts = new List <int>(); graph.GetNodePolys(verts, indexes, norms, vertCounts); if (verts.Count == 0) { return; } VPosNormCol0 [] nodeVerts = new VPosNormCol0[verts.Count]; for (int i = 0; i < nodeVerts.Length; i++) { nodeVerts[i].Position = verts[i] + Vector3.UnitY; //boost up 1 nodeVerts[i].Normal.X = norms[i].X; nodeVerts[i].Normal.Y = norms[i].Y; nodeVerts[i].Normal.Z = norms[i].Z; nodeVerts[i].Normal.W = 1f; } int idx = 0; for (int i = 0; i < vertCounts.Count; i++) { Color col = Mathery.RandomColor(mRand); for (int j = 0; j < vertCounts[i]; j++) { nodeVerts[idx + j].Color0 = col; } idx += vertCounts[i]; } mVBNodes = VertexTypes.BuildABuffer(mGD.GD, nodeVerts, VertexTypes.GetIndex(nodeVerts[0].GetType())); mIBNodes = VertexTypes.BuildAnIndexBuffer(mGD.GD, indexes.ToArray()); mVBBNodes = VertexTypes.BuildAVBB(VertexTypes.GetIndex(nodeVerts[0].GetType()), mVBNodes); mNodeIndexCount = indexes.Count; //connexions List <PathGraph.LineSeg> segz = graph.GetNodeConnections(); if (segz.Count <= 0) { return; } VPosNormCol0 [] segVerts = new VPosNormCol0[segz.Count * 3]; UInt32 index = 0; indexes.Clear(); foreach (PathGraph.LineSeg seg in segz) { Color col = Mathery.RandomColor(mRand); //endpoint segVerts[index].Position = seg.mB; Vector3 lineVec = seg.mB - seg.mA; //get a perpindicular axis to the a to b axis //so the back side of the connection can flare out a bit Vector3 crossVec = Vector3.Cross(lineVec, Vector3.UnitY); crossVec.Normalize(); Vector3 normVec = Vector3.Cross(crossVec, lineVec); normVec.Normalize(); crossVec *= 2f; segVerts[index + 1].Position = seg.mA - crossVec + Mathery.RandomDirectionXZ(mRand); segVerts[index + 2].Position = seg.mA + crossVec + Mathery.RandomDirectionXZ(mRand); segVerts[index].Color0 = col; segVerts[index + 1].Color0 = col; segVerts[index + 2].Color0 = col; //adjust up segVerts[index].Position += Vector3.UnitY * 2f; segVerts[index + 1].Position += Vector3.UnitY * 1.7f; segVerts[index + 2].Position += Vector3.UnitY * 1.7f; Half4 norm; norm.X = normVec.X; norm.Y = normVec.Y; norm.Z = normVec.Z; norm.W = 1f; segVerts[index].Normal = norm; segVerts[index + 1].Normal = norm; segVerts[index + 2].Normal = norm; indexes.Add(index); indexes.Add(index + 1); indexes.Add(index + 2); index += 3; } mVBCons = VertexTypes.BuildABuffer(mGD.GD, segVerts, VertexTypes.GetIndex(segVerts[0].GetType())); mIBCons = VertexTypes.BuildAnIndexBuffer(mGD.GD, indexes.ToArray()); mVBBCons = VertexTypes.BuildAVBB(VertexTypes.GetIndex(segVerts[0].GetType()), mVBCons); mConIndexCount = indexes.Count; }
void OnMapToStatic(object sender, EventArgs ea) { string fileName = sender as string; if (fileName == null) { return; } mMap = new Map(); mMap.LoadBrushFile(fileName, mBSPForm.BSPParameters); List <Vector3> verts = new List <Vector3>(); List <UInt16> inds = new List <UInt16>(); List <Vector3> norms = new List <Vector3>(); List <Color> cols = new List <Color>(); mMap.GetTriangles(verts, norms, cols, inds, Map.DebugDrawChoice.MapBrushes); if (verts.Count <= 0) { mOutForm.Print(fileName + " didn't have anything usable.\n"); mMap = null; return; } //convert normals to half4 List <Half4> h4norms = new List <Half4>(); foreach (Vector3 norm in norms) { Half4 h4norm; h4norm.X = norm.X; h4norm.Y = norm.Y; h4norm.Z = norm.Z; h4norm.W = 1f; h4norms.Add(h4norm); } //convert to funky max coordinate system List <Vector3> maxVerts = new List <Vector3>(); foreach (Vector3 vert in verts) { Vector3 maxVert; maxVert.X = vert.X; maxVert.Y = vert.Y; maxVert.Z = vert.Z; maxVerts.Add(maxVert); } EditorMesh em = new EditorMesh("MapMesh"); Type vtype = VertexTypes.GetMatch(true, true, false, false, false, false, 0, 1); Array varray = Array.CreateInstance(vtype, maxVerts.Count); for (int i = 0; i < maxVerts.Count; i++) { VertexTypes.SetArrayField(varray, i, "Position", maxVerts[i]); VertexTypes.SetArrayField(varray, i, "Normal", h4norms[i]); VertexTypes.SetArrayField(varray, i, "Color0", cols[i]); } SharpDX.Direct3D11.Buffer vb = VertexTypes.BuildABuffer(mGD.GD, varray, vtype); int vertSize = VertexTypes.GetSizeForType(vtype); em.SetVertSize(vertSize); em.SetNumVerts(maxVerts.Count); em.SetNumTriangles(inds.Count / 3); em.SetTypeIndex(VertexTypes.GetIndex(vtype)); em.SetVertexBuffer(vb); UInt16 [] iarray = inds.ToArray(); SharpDX.Direct3D11.Buffer ib = VertexTypes.BuildAnIndexBuffer(mGD.GD, iarray); em.SetIndexBuffer(ib); em.SetData(varray, iarray); mOutForm.Print(fileName + " opened and " + maxVerts.Count + " verts converted.\n"); IArch saveArch = new StaticArch(); em.SetTransform(Matrix.RotationX((float)(Math.PI / 4))); saveArch.AddPart(em); saveArch.SaveToFile(FileUtil.StripExtension(fileName) + ".Static"); mMap = null; }
internal void BuildPathDrawInfo(List <Vector3> path, Vector3 boxMiddleOffset) { if (mVBPath != null) { mVBPath.Dispose(); } if (mIBPath != null) { mIBPath.Dispose(); } if (path.Count < 2) { return; } VPosNormCol0 [] segVerts = new VPosNormCol0[(path.Count - 1) * 3]; UInt32 index = 0; List <UInt32> indexes = new List <UInt32>(); for (int i = 0; i < (path.Count - 1); i++) { Color col = Mathery.RandomColor(mRand); col = Color.Red; //endpoint segVerts[index].Position = path[i + 1]; Vector3 lineVec = path[i + 1] - path[i]; //get a perpindicular axis to the a to b axis //so the back side of the connection can flare out a bit Vector3 crossVec = Vector3.Cross(lineVec, Vector3.UnitY); crossVec.Normalize(); Vector3 normVec = Vector3.Cross(crossVec, lineVec); normVec.Normalize(); crossVec *= 2f; segVerts[index + 1].Position = path[i] - crossVec + Mathery.RandomDirectionXZ(mRand); segVerts[index + 2].Position = path[i] + crossVec + Mathery.RandomDirectionXZ(mRand); segVerts[index].Color0 = col; segVerts[index + 1].Color0 = col; segVerts[index + 2].Color0 = col; //adjust up segVerts[index].Position += boxMiddleOffset; segVerts[index + 1].Position += boxMiddleOffset; segVerts[index + 2].Position += boxMiddleOffset; Half4 norm; norm.X = normVec.X; norm.Y = normVec.Y; norm.Z = normVec.Z; norm.W = 1f; segVerts[index].Normal = norm; segVerts[index + 1].Normal = norm; segVerts[index + 2].Normal = norm; indexes.Add(index); indexes.Add(index + 1); indexes.Add(index + 2); index += 3; } mVBPath = VertexTypes.BuildABuffer(mGD.GD, segVerts, VertexTypes.GetIndex(segVerts[0].GetType())); mIBPath = VertexTypes.BuildAnIndexBuffer(mGD.GD, indexes.ToArray()); mVBBPath = VertexTypes.BuildAVBB(VertexTypes.GetIndex(segVerts[0].GetType()), mVBPath); mPathIndexCount = indexes.Count; }
internal void BuildRayDrawInfo(List <Vector3> rays, List <Vector3> hits, float polySize) { if (mVBRays != null) { mVBRays.Dispose(); } if (mIBRays != null) { mIBRays.Dispose(); } if (mHits != null) { mHits.Free(); } if (rays.Count < 2) { return; } VPosNormCol0 [] segVerts = new VPosNormCol0[rays.Count * 3]; VPosNormCol0 [] hitVerts = new VPosNormCol0[hits.Count * 8]; UInt32 index = 0; List <UInt32> indexes = new List <UInt32>(); for (int i = 0; i < rays.Count; i += 2) { Color col = Mathery.RandomColor(mRand); //endpoint segVerts[index].Position = rays[i + 1]; Vector3 lineVec = rays[i + 1] - rays[i]; //get a perpindicular axis to the a to b axis //so the back side of the connection can flare out a bit Vector3 crossVec = Vector3.Cross(lineVec, Vector3.UnitY); crossVec.Normalize(); Vector3 normVec = Vector3.Cross(crossVec, lineVec); normVec.Normalize(); //crossVec *=.2f; segVerts[index + 1].Position = rays[i] - crossVec; segVerts[index + 2].Position = rays[i] + crossVec; //scale up to visible segVerts[index].Position.X *= polySize; segVerts[index].Position.Z *= polySize; segVerts[index + 1].Position.X *= polySize; segVerts[index + 1].Position.Z *= polySize; segVerts[index + 2].Position.X *= polySize; segVerts[index + 2].Position.Z *= polySize; //upside down tri segVerts[index + 3].Position = segVerts[index + 2].Position; segVerts[index + 4].Position = segVerts[index + 1].Position; segVerts[index + 5].Position = segVerts[index].Position; segVerts[index].Color0 = col; segVerts[index + 1].Color0 = col; segVerts[index + 2].Color0 = col; segVerts[index + 3].Color0 = col; segVerts[index + 4].Color0 = col; segVerts[index + 5].Color0 = col; Half4 norm; norm.X = normVec.X; norm.Y = normVec.Y; norm.Z = normVec.Z; norm.W = 1f; segVerts[index].Normal = norm; segVerts[index + 1].Normal = norm; segVerts[index + 2].Normal = norm; norm.X = -normVec.X; norm.Y = -normVec.Y; norm.Z = -normVec.Z; segVerts[index + 3].Normal = norm; segVerts[index + 4].Normal = norm; segVerts[index + 5].Normal = norm; indexes.Add(index); indexes.Add(index + 1); indexes.Add(index + 2); indexes.Add(index + 3); indexes.Add(index + 4); indexes.Add(index + 5); index += 6; } mVBRays = VertexTypes.BuildABuffer(mGD.GD, segVerts, VertexTypes.GetIndex(segVerts[0].GetType())); mIBRays = VertexTypes.BuildAnIndexBuffer(mGD.GD, indexes.ToArray()); mVBBRays = VertexTypes.BuildAVBB(VertexTypes.GetIndex(segVerts[0].GetType()), mVBRays); mRaysIndexCount = indexes.Count; indexes.Clear(); mHits = PrimFactory.CreateCubes(mGD.GD, hits, 5f); }