public void Begin(MyVoxelMap voxelMap, ref MyMwcVector3Int cellCoord) { VoxelMap = voxelMap; CellCoord = cellCoord; Center = voxelMap.GetRenderCellCenterPositionAbsolute(ref cellCoord); Contains = true; MyVoxelCacheCellRenderHelper.Begin(); }
public void End() { foreach (MySingleMaterialHelper materialHelper in MyVoxelCacheCellRenderHelper.GetSingleMaterialHelpers()) { if (materialHelper != null && materialHelper.IndexCount > 0) { EndSingleMaterial(materialHelper); } } foreach (var pair in MyVoxelCacheCellRenderHelper.GetMultiMaterialHelpers()) { if (pair.Value.VertexCount > 0) { EndMultiMaterial(pair.Value); } } //if (materialHelper.IndexCount > 0) EndMultiMaterial(materialHelper.Material); // SortForSAP batches by type and material Batches.Sort(); }
// This method adds triangles from one data cell into this render cell. Single-texture triangles are added using indices (so we use m_notCompressedIndex buffer). // For this we need to find indices. We use lookup array for it. // Now we support only 16-bit indices, so vertex buffer can't have more then short.MaxValue vertices. public void AddTriangles(List <MyVoxelCacheCellData> cacheDataArray) { // MyPerformanceTimer.VoxelGpuBuffersBuild.Start(); //MyMwcVoxelMaterialsEnum? CurrentSingleMaterial = null; // bool triangleAdded = true; // while (triangleAdded) // { // triangleAdded = false; //CurrentSingleMaterial = null; foreach (var cacheData in cacheDataArray) { // Increase lookup count, so we will think that all vertexes in helper arrays are new for (int i = 0; i < MyVoxelCacheCellRenderHelper.SingleMaterialIndicesLookupCount.Length; i++) { MyVoxelCacheCellRenderHelper.SingleMaterialIndicesLookupCount[i]++; } for (int i = 0; i < cacheData.VoxelTrianglesCount; i++) { MyVoxelTriangle triangle = cacheData.VoxelTriangles[i]; MyVoxelVertex vertex0 = cacheData.VoxelVertices[triangle.VertexIndex0]; MyVoxelVertex vertex1 = cacheData.VoxelVertices[triangle.VertexIndex1]; MyVoxelVertex vertex2 = cacheData.VoxelVertices[triangle.VertexIndex2]; if ((vertex0.Material == vertex1.Material) && (vertex0.Material == vertex2.Material)) { int matIndex = (int)vertex0.Material; // This is single-texture triangleVertexes, so we can choose material from any edge MySingleMaterialHelper materialHelper = MyVoxelCacheCellRenderHelper.GetForMaterial(vertex0.Material); // Add vertex0 to vertex buffer AddVertexToBuffer(materialHelper, ref vertex0, matIndex, triangle.VertexIndex0); // Add vertex1 to vertex buffer AddVertexToBuffer(materialHelper, ref vertex1, matIndex, triangle.VertexIndex1); // Add vertex2 to vertex buffer AddVertexToBuffer(materialHelper, ref vertex2, matIndex, triangle.VertexIndex2); //triangleAdded = true; // Add indices int nextTriangleIndex = materialHelper.IndexCount; materialHelper.Indices[nextTriangleIndex + 0] = MyVoxelCacheCellRenderHelper.SingleMaterialIndicesLookup[matIndex][triangle.VertexIndex0].VertexIndex; materialHelper.Indices[nextTriangleIndex + 1] = MyVoxelCacheCellRenderHelper.SingleMaterialIndicesLookup[matIndex][triangle.VertexIndex1].VertexIndex; materialHelper.Indices[nextTriangleIndex + 2] = MyVoxelCacheCellRenderHelper.SingleMaterialIndicesLookup[matIndex][triangle.VertexIndex2].VertexIndex; materialHelper.IndexCount += 3; if ((materialHelper.VertexCount >= MyVoxelCacheCellRenderHelper.MAX_VERTICES_COUNT_STOP) || (materialHelper.IndexCount >= MyVoxelCacheCellRenderHelper.MAX_INDICES_COUNT_STOP)) { // If this batch is almost full (or is full), we end it and start with new one EndSingleMaterial(materialHelper); } } else { int id = GetMultimaterialId(vertex0.Material, vertex1.Material, vertex2.Material); // Assign current material MyMultiMaterialHelper multiMaterialHelper = MyVoxelCacheCellRenderHelper.GetForMultimaterial(vertex0.Material, vertex1.Material, vertex2.Material); //triangleAdded = true; #if PACKED_VERTEX_FORMAT // Copy packed normals multiMaterialHelper.Vertices[multiMaterialHelper.VertexCount + 0].PackedNormal = vertex0.PackedNormal; multiMaterialHelper.Vertices[multiMaterialHelper.VertexCount + 1].PackedNormal = vertex0.PackedNormal; multiMaterialHelper.Vertices[multiMaterialHelper.VertexCount + 2].PackedNormal = vertex0.PackedNormal; #endif multiMaterialHelper.AddVertex(ref vertex0); multiMaterialHelper.AddVertex(ref vertex1); multiMaterialHelper.AddVertex(ref vertex2); if (multiMaterialHelper.VertexCount >= MyVoxelCacheCellRenderHelper.MAX_VERTICES_COUNT_STOP) { EndMultiMaterial(multiMaterialHelper); } } } /* * if (multiMaterialHelper != null) * { * int id = GetMultimaterialId(multiMaterialHelper.Material0, multiMaterialHelper.Material1, multiMaterialHelper.Material2); * MyVoxelCacheCellRenderHelper.FinishedMultiMaterials[id] = true; * EndMultimaterial(multiMaterialHelper); * } * * if (singleMaterialHelper != null) * { * MyVoxelCacheCellRenderHelper.FinishedSingleMaterials[(int)singleMaterialHelper.Material] = true; * EndSingleMaterial(singleMaterialHelper); * } */ } // } //MyPerformanceTimer.VoxelGpuBuffersBuild.End(); }