internal void CompileDataOfThisObject(Component_Mesh.CompiledData compiledData) // Component_Mesh mesh, Component_Mesh.CompiledData result ) { VertexElement[] vertexStructureV = VertexStructure; UnwrappedUVEnum unwrappedUVV = UnwrappedUV; byte[] verticesV = Vertices; int[] indicesV = Indices; Component_Material materialV = Material; Component_Mesh.StructureClass structure = null; OnGetDataOfThisObject(ref vertexStructureV, ref verticesV, ref indicesV, ref materialV, ref structure); GetDataOfThisObjectEvent?.Invoke(this, ref vertexStructureV, ref verticesV, ref indicesV, ref materialV, ref structure); //add to result if (vertexStructureV != null && vertexStructureV.Length != 0 && verticesV != null && verticesV.Length != 0 && (indicesV == null || indicesV.Length != 0)) { vertexStructureV.GetInfo(out var vertexSize, out var holes); //if( !holes ) { int vertexCount = verticesV.Length / vertexSize; var op = new Component_RenderingPipeline.RenderSceneData.MeshDataRenderOperation(this); op.VertexStructure = vertexStructureV; op.VertexStructureContainsColor = op.VertexStructure.Any(e => e.Semantic == VertexElementSemantic.Color0); op.UnwrappedUV = unwrappedUVV; var vertexDeclaration = op.VertexStructure.CreateVertexDeclaration(0); op.VertexBuffers = new GpuVertexBuffer[] { GpuBufferManager.CreateVertexBuffer(verticesV, vertexDeclaration) }; op.VertexStartOffset = 0; op.VertexCount = vertexCount; if (indicesV != null) { op.IndexBuffer = GpuBufferManager.CreateIndexBuffer(indicesV); op.IndexStartOffset = 0; op.IndexCount = indicesV.Length; } //!!!!так? op.Material = materialV; compiledData.MeshData.RenderOperations.Add(op); //!!!!может мержить когда несколько. индексы MeshGeometry в RawVertices if (compiledData.MeshData.Structure == null) { compiledData.MeshData.Structure = structure; } } //else //{ // //!!!!!error //} } }
internal void CompileDataOfThisObject(Component_Mesh.CompiledData compiledData) // Component_Mesh mesh, Component_Mesh.CompiledData result ) { VertexElement[] vertexStructureV = VertexStructure; UnwrappedUVEnum unwrappedUVV = UnwrappedUV; byte[] verticesV = Vertices; int[] indicesV = Indices; Component_Material materialV = Material; Component_Mesh.StructureClass structure = null; OnGetDataOfThisObject(ref vertexStructureV, ref verticesV, ref indicesV, ref materialV, ref structure); GetDataOfThisObjectEvent?.Invoke(this, ref vertexStructureV, ref verticesV, ref indicesV, ref materialV, ref structure); //add to result if (vertexStructureV != null && vertexStructureV.Length != 0 && verticesV != null && verticesV.Length != 0 && (indicesV == null || indicesV.Length != 0)) { //!!!!еще чтобы был с позициями? vertexStructureV.GetInfo(out var vertexSize, out var holes); //if( !holes ) { int vertexCount = verticesV.Length / vertexSize; var op = new Component_RenderingPipeline.RenderSceneData.MeshDataRenderOperation(this); op.VertexStructure = vertexStructureV; op.VertexStructureContainsColor = op.VertexStructure.Any(e => e.Semantic == VertexElementSemantic.Color0); ////disable if all data equal zero. it is means no data. //if( op.VertexStructureContainsColor ) //{ // if( vertexStructureV.GetElementBySemantic( VertexElementSemantic.Color0, out var element ) ) // { // var size = element.GetSizeInBytes(); // int vertexOffset = element.Offset; // for( int nVertex = 0; nVertex < vertexCount; nVertex++ ) // { // for( int n = 0; n < size; n++ ) // { // if( verticesV[ vertexOffset + n ] != 0 ) // { // //found non zero // goto exit; // } // } // vertexOffset += vertexSize; // } // op.VertexStructureContainsColor = false; // exit:; // } //} op.UnwrappedUV = unwrappedUVV; var vertexDeclaration = op.VertexStructure.CreateVertexDeclaration(0); op.VertexBuffers = new GpuVertexBuffer[] { GpuBufferManager.CreateVertexBuffer(verticesV, vertexDeclaration) }; op.VertexStartOffset = 0; op.VertexCount = vertexCount; if (indicesV != null) { op.IndexBuffer = GpuBufferManager.CreateIndexBuffer(indicesV); op.IndexStartOffset = 0; op.IndexCount = indicesV.Length; } //!!!!так? op.Material = materialV; compiledData.MeshData.RenderOperations.Add(op); //!!!!может мержить когда несколько. индексы MeshGeometry в RawVertices if (compiledData.MeshData.Structure == null) { compiledData.MeshData.Structure = structure; } //var op = new Component_Mesh.CompiledData.RenderOperation(); //op.creator = this; //op.vertexStructure = vertexStructureV; //List<GpuVertexBuffer> l = new List<GpuVertexBuffer>(); ////!!!!make copy of arrays? //var vertexDeclaration = op.vertexStructure.CreateVertexDeclaration( 0 ); //l.Add( GpuBufferManager.CreateVertexBuffer( verticesV, vertexDeclaration, false ) ); //op.vertexBuffers = l; //op.vertexStartOffset = 0; //op.vertexCount = vertexCount; //if( indicesV != null ) //{ // op.indexBuffer = GpuBufferManager.CreateIndexBuffer( indicesV, false ); // op.indexStartOffset = 0; // op.indexCount = indicesV.Length; //} ////!!!!так? //op.material = materialV; //var item = new Component_Mesh.CompiledData.RenderOperationItem(); //item.operation = op; ////!!!! ////item.transform = TransformOfData;//TransformRelativeToParent; //compiledData.RenderOperations.Add( item ); ////op.transform = Transform; ////compiledData.RenderOperations.Add( op ); } //else //{ // //!!!!!error //} } }