private unsafe DynamicUnstructureGeometry DoCreateMesh(DynamicUnstructuredGridderSource src) { MatrixPositionBuffer matrixPositions = null; IndexBuffer matrixIndicesBuffer = null; FracturePositionBuffer fractionPositionsBuffer = null; //生成母体 if (src.ElementFormat == DynamicUnstructuredGridderSource.MATRIX_FORMAT4_TETRAHEDRON) { matrixPositions = new TetrahedronMatrixPositionBuffer(); //matrixPositions.Shape = MatrixPositionBufferData.SHAPE_TETRAHEDRON; //int memSize = src.ElementNum * sizeof(TetrahedronPositions); //matrixPositions.AllocMem(memSize); matrixPositions.AllocMem(src.ElementNum); TetrahedronPosition* tets = (TetrahedronPosition*)matrixPositions.Data; int[][] matrixIndices = src.Elements; vec3[] positions = src.Nodes; for (int i = 0; i < src.ElementNum; i++) { tets[i].p1 = src.TranslateMatrix*positions[matrixIndices[i][0]-1]; tets[i].p2 = src.TranslateMatrix*positions[matrixIndices[i][1]-1]; tets[i].p3 = src.TranslateMatrix*positions[matrixIndices[i][2]-1]; tets[i].p4 = src.TranslateMatrix*positions[matrixIndices[i][3]-1]; } matrixIndicesBuffer = new TetrahedronMatrixIndexBuffer(); //int triangleCount = src.ElementNum * 4; //matrixIndicesBuffer.AllocMem(triangleCount * sizeof(TriangleIndex)); matrixIndicesBuffer.AllocMem(src.ElementNum); TetrahedronIndex* header = (TetrahedronIndex*)matrixIndicesBuffer.Data; for (int i = 0; i < src.ElementNum; i++) { header[i].dot0 = (uint)(i * 4 + 0); header[i].dot1 = (uint)(i * 4 + 1); header[i].dot2 = (uint)(i * 4 + 2); header[i].dot3 = (uint)(i * 4 + 3); header[i].dot4 = (uint)(i * 4 + 0); header[i].dot5 = (uint)(i * 4 + 1); header[i].restartIndex = uint.MaxValue; } } if (src.ElementFormat == DynamicUnstructuredGridderSource.MATRIX_FORMAT3_TRIANGLE) { matrixPositions = new TriangleMatrixPositionBuffer(); //matrixPositions.Shape = MatrixPositionBufferData.SHAPE_TRIANGLE; matrixPositions.AllocMem(src.ElementNum); int[][] matrixIndices = src.Elements; vec3[] positions = src.Nodes; var triangles = (TrianglePosition*)matrixPositions.Data; for (int i = 0; i < src.ElementNum; i++) { triangles[i].P1 = src.TranslateMatrix*positions[matrixIndices[i][0]-1]; triangles[i].P2 = src.TranslateMatrix*positions[matrixIndices[i][1]-1]; triangles[i].P3 = src.TranslateMatrix*positions[matrixIndices[i][2]-1]; } } if (src.ElementFormat == DynamicUnstructuredGridderSource.MATRIX_FORMAT6_TRIANGULAR_PRISM) { matrixPositions = new TriangularPrismMatrixPositionBuffer(); //matrixPositions.Shape = MatrixPositionBufferData.SHAPE_TRIANGLE; matrixPositions.AllocMem(src.ElementNum); int[][] matrixIndices = src.Elements; vec3[] positions = src.Nodes; TriangularPrismPosition* prism = (TriangularPrismPosition*)matrixPositions.Data; for (int i = 0; i < src.ElementNum; i++) { try { prism[i].P1 = src.TranslateMatrix*positions[matrixIndices[i][0]-1]; prism[i].P2 = src.TranslateMatrix*positions[matrixIndices[i][1]-1]; prism[i].P3 = src.TranslateMatrix*positions[matrixIndices[i][2]-1]; prism[i].P4 = src.TranslateMatrix*positions[matrixIndices[i][3]-1]; prism[i].P5 = src.TranslateMatrix*positions[matrixIndices[i][4]-1]; prism[i].P6 = src.TranslateMatrix*positions[matrixIndices[i][5]-1]; } catch (IndexOutOfRangeException e) { throw new IndexOutOfRangeException(String.Format("Maxtrix positions row:{0},out of range", i + 1)); } } matrixIndicesBuffer = new TetrahedronMatrixTriangularPrismIndexBuffer(); //int triangleCount = src.ElementNum * 4; //matrixIndicesBuffer.AllocMem(triangleCount * sizeof(TriangleIndex)); matrixIndicesBuffer.AllocMem(src.ElementNum); TetrahedronTriangularPrismIndex* indexes = (TetrahedronTriangularPrismIndex*)matrixIndicesBuffer.Data; for (int i = 0; i < src.ElementNum; i++) { indexes[i].dot0 = (uint)(i * 6 + 0); indexes[i].dot1 = (uint)(i * 6 + 3); indexes[i].dot2 = (uint)(i * 6 + 1); indexes[i].dot3 = (uint)(i * 6 + 4); indexes[i].dot4 = (uint)(i * 6 + 2); indexes[i].dot5 = (uint)(i * 6 + 5); indexes[i].dot6 = (uint)(i * 6 + 0); indexes[i].dot7 = (uint)(i * 6 + 3); indexes[i].restartIndex = uint.MaxValue; } } //生成裂缝 if (src.FractureFormat == DynamicUnstructuredGridderSource.FRACTURE_FORMAT3_TRIANGLE) { fractionPositionsBuffer = new TriangleFracturePositionBuffer(); //fractionPositionsBuffer.Shape = FracturePositionBufferData.SHAPE_TRIANGLE; int triangleCount = src.FractureNum; //fractionPositionsBuffer.AllocMem(triangleCount * sizeof(TrianglePositions)); fractionPositionsBuffer.AllocMem(triangleCount); int[][] triangleIndices = src.Fractures; vec3[] positions = src.Nodes; TrianglePosition* triangles = (TrianglePosition*)fractionPositionsBuffer.Data; for (int i = 0; i < triangleCount; i++) { triangles[i].P1 = src.TranslateMatrix*positions[triangleIndices[i][0]-1]; triangles[i].P2 = src.TranslateMatrix*positions[triangleIndices[i][1]-1]; triangles[i].P3 = src.TranslateMatrix*positions[triangleIndices[i][2]-1]; } } if (src.FractureFormat == DynamicUnstructuredGridderSource.FRACTURE_FORMAT2_LINE) { fractionPositionsBuffer = new LineFracturePositionBuffer(); //fractionPositionsBuffer.Shape = FracturePositionBufferData.SHAPE_LINE; int lineCount = src.FractureNum; //fractionPositionsBuffer.AllocMem(lineCount * sizeof(LinePositions)); fractionPositionsBuffer.AllocMem(lineCount); LinePosition* lines = (LinePosition*)fractionPositionsBuffer.Data; vec3[] positions = src.Nodes; int[][] lineIndices = src.Fractures; for (int i = 0; i < lineCount; i++) { lines[i].P1 = src.TranslateMatrix*positions[lineIndices[i][0]-1]; lines[i].P2 = src.TranslateMatrix*positions[lineIndices[i][1]-1]; } } if (src.FractureFormat == DynamicUnstructuredGridderSource.FRACTURE_FORMAT4_QUAD) { fractionPositionsBuffer = new QuadFracturePositionBuffer(); int fractureCount = src.FractureNum; fractionPositionsBuffer.AllocMem(fractureCount); QuadPosition* quad = (QuadPosition*)fractionPositionsBuffer.Data; vec3[] positions = src.Nodes; int[][] quadIndices = src.Fractures; for (int i = 0; i < fractureCount; i++) { quad[i].P1 = src.TranslateMatrix*positions[quadIndices[i][0]-1]; quad[i].P2 = src.TranslateMatrix*positions[quadIndices[i][1]-1]; quad[i].P3 = src.TranslateMatrix*positions[quadIndices[i][3]-1]; quad[i].P4 = src.TranslateMatrix*positions[quadIndices[i][2]-1]; } } DynamicUnstructureGeometry geometry = new DynamicUnstructureGeometry(matrixPositions); geometry.MatrixIndices = matrixIndicesBuffer; geometry.FracturePositions = fractionPositionsBuffer; geometry.Min = src.TransformedActiveBounds.Min; geometry.Max = src.TransformedActiveBounds.Max; return geometry; }
private unsafe DynamicUnstructureGeometry DoCreateMesh(DynamicUnstructuredGridderSource src) { MatrixPositionBuffer matrixPositions = null; IndexBuffer matrixIndicesBuffer = null; FracturePositionBuffer fractionPositionsBuffer = null; //生成母体 if (src.ElementFormat == DynamicUnstructuredGridderSource.MATRIX_FORMAT4_TETRAHEDRON) { matrixPositions = new TetrahedronMatrixPositionBuffer(); //matrixPositions.Shape = MatrixPositionBufferData.SHAPE_TETRAHEDRON; //int memSize = src.ElementNum * sizeof(TetrahedronPositions); //matrixPositions.AllocMem(memSize); matrixPositions.AllocMem(src.ElementNum); TetrahedronPosition *tets = (TetrahedronPosition *)matrixPositions.Data; int[][] matrixIndices = src.Elements; Vertex[] positions = src.Nodes; for (int i = 0; i < src.ElementNum; i++) { tets[i].p1 = src.Transform * positions[matrixIndices[i][0] - 1]; tets[i].p2 = src.Transform * positions[matrixIndices[i][1] - 1]; tets[i].p3 = src.Transform * positions[matrixIndices[i][2] - 1]; tets[i].p4 = src.Transform * positions[matrixIndices[i][3] - 1]; } matrixIndicesBuffer = new TetrahedronMatrixIndexBuffer(); //int triangleCount = src.ElementNum * 4; //matrixIndicesBuffer.AllocMem(triangleCount * sizeof(TriangleIndex)); matrixIndicesBuffer.AllocMem(src.ElementNum); TetrahedronIndex *header = (TetrahedronIndex *)matrixIndicesBuffer.Data; for (int i = 0; i < src.ElementNum; i++) { header[i].dot0 = (uint)(i * 4 + 0); header[i].dot1 = (uint)(i * 4 + 1); header[i].dot2 = (uint)(i * 4 + 2); header[i].dot3 = (uint)(i * 4 + 3); header[i].dot4 = (uint)(i * 4 + 0); header[i].dot5 = (uint)(i * 4 + 1); header[i].restartIndex = uint.MaxValue; } } if (src.ElementFormat == DynamicUnstructuredGridderSource.MATRIX_FORMAT3_TRIANGLE) { matrixPositions = new TriangleMatrixPositionBuffer(); //matrixPositions.Shape = MatrixPositionBufferData.SHAPE_TRIANGLE; matrixPositions.AllocMem(src.ElementNum); int[][] matrixIndices = src.Elements; Vertex[] positions = src.Nodes; TrianglePosition *triangles = (TrianglePosition *)matrixPositions.Data; for (int i = 0; i < src.ElementNum; i++) { triangles[i].P1 = src.Transform * positions[matrixIndices[i][0] - 1]; triangles[i].P2 = src.Transform * positions[matrixIndices[i][1] - 1]; triangles[i].P3 = src.Transform * positions[matrixIndices[i][2] - 1]; } } if (src.ElementFormat == DynamicUnstructuredGridderSource.MATRIX_FORMAT6_TRIANGULAR_PRISM) { matrixPositions = new TriangularPrismMatrixPositionBuffer(); //matrixPositions.Shape = MatrixPositionBufferData.SHAPE_TRIANGLE; matrixPositions.AllocMem(src.ElementNum); int[][] matrixIndices = src.Elements; Vertex[] positions = src.Nodes; TriangularPrismPosition *prism = (TriangularPrismPosition *)matrixPositions.Data; for (int i = 0; i < src.ElementNum; i++) { try { prism[i].P1 = src.Transform * positions[matrixIndices[i][0] - 1]; prism[i].P2 = src.Transform * positions[matrixIndices[i][1] - 1]; prism[i].P3 = src.Transform * positions[matrixIndices[i][2] - 1]; prism[i].P4 = src.Transform * positions[matrixIndices[i][3] - 1]; prism[i].P5 = src.Transform * positions[matrixIndices[i][4] - 1]; prism[i].P6 = src.Transform * positions[matrixIndices[i][5] - 1]; } catch (IndexOutOfRangeException e) { throw new IndexOutOfRangeException(String.Format("Maxtrix positions row:{0},out of range", i + 1)); } } matrixIndicesBuffer = new TetrahedronMatrixTriangularPrismIndexBuffer(); //int triangleCount = src.ElementNum * 4; //matrixIndicesBuffer.AllocMem(triangleCount * sizeof(TriangleIndex)); matrixIndicesBuffer.AllocMem(src.ElementNum); TetrahedronTriangularPrismIndex *indexes = (TetrahedronTriangularPrismIndex *)matrixIndicesBuffer.Data; for (int i = 0; i < src.ElementNum; i++) { indexes[i].dot0 = (uint)(i * 6 + 0); indexes[i].dot1 = (uint)(i * 6 + 3); indexes[i].dot2 = (uint)(i * 6 + 1); indexes[i].dot3 = (uint)(i * 6 + 4); indexes[i].dot4 = (uint)(i * 6 + 2); indexes[i].dot5 = (uint)(i * 6 + 5); indexes[i].dot6 = (uint)(i * 6 + 0); indexes[i].dot7 = (uint)(i * 6 + 3); indexes[i].restartIndex = uint.MaxValue; } } //生成裂缝 if (src.FractureFormat == DynamicUnstructuredGridderSource.FRACTURE_FORMAT3_TRIANGLE) { fractionPositionsBuffer = new TriangleFracturePositionBuffer(); //fractionPositionsBuffer.Shape = FracturePositionBufferData.SHAPE_TRIANGLE; int triangleCount = src.FractureNum; //fractionPositionsBuffer.AllocMem(triangleCount * sizeof(TrianglePositions)); fractionPositionsBuffer.AllocMem(triangleCount); int[][] triangleIndices = src.Fractures; Vertex[] positions = src.Nodes; TrianglePosition *triangles = (TrianglePosition *)fractionPositionsBuffer.Data; for (int i = 0; i < triangleCount; i++) { triangles[i].P1 = src.Transform * positions[triangleIndices[i][0] - 1]; triangles[i].P2 = src.Transform * positions[triangleIndices[i][1] - 1]; triangles[i].P3 = src.Transform * positions[triangleIndices[i][2] - 1]; } } if (src.FractureFormat == DynamicUnstructuredGridderSource.FRACTURE_FORMAT2_LINE) { fractionPositionsBuffer = new LineFracturePositionBuffer(); //fractionPositionsBuffer.Shape = FracturePositionBufferData.SHAPE_LINE; int lineCount = src.FractureNum; //fractionPositionsBuffer.AllocMem(lineCount * sizeof(LinePositions)); fractionPositionsBuffer.AllocMem(lineCount); LinePosition *lines = (LinePosition *)fractionPositionsBuffer.Data; Vertex[] positions = src.Nodes; int[][] lineIndices = src.Fractures; for (int i = 0; i < lineCount; i++) { lines[i].P1 = src.Transform * positions[lineIndices[i][0] - 1]; lines[i].P2 = src.Transform * positions[lineIndices[i][1] - 1]; } } if (src.FractureFormat == DynamicUnstructuredGridderSource.FRACTURE_FORMAT4_QUAD) { fractionPositionsBuffer = new QuadFracturePositionBuffer(); int fractureCount = src.FractureNum; fractionPositionsBuffer.AllocMem(fractureCount); QuadPosition *quad = (QuadPosition *)fractionPositionsBuffer.Data; Vertex[] positions = src.Nodes; int[][] quadIndices = src.Fractures; for (int i = 0; i < fractureCount; i++) { quad[i].P1 = src.Transform * positions[quadIndices[i][0] - 1]; quad[i].P2 = src.Transform * positions[quadIndices[i][1] - 1]; quad[i].P3 = src.Transform * positions[quadIndices[i][3] - 1]; quad[i].P4 = src.Transform * positions[quadIndices[i][2] - 1]; } } DynamicUnstructureGeometry geometry = new DynamicUnstructureGeometry(matrixPositions); geometry.MatrixIndices = matrixIndicesBuffer; geometry.FracturePositions = fractionPositionsBuffer; geometry.Min = src.TransformedActiveBounds.Min; geometry.Max = src.TransformedActiveBounds.Max; return(geometry); }
//TODO: param type not defined yet public void Init(DynamicUnstructureGeometry geometry) { base.Init(geometry); this.FractionType = geometry.FracturePositions.Shape; this.MatrixType = geometry.MatrixPositions.Shape; if (geometry.MatrixIndices != null) { this.matrixIndexBuffer = new uint[1]; this.matrixIndexBuffer[0] = CreateVertexBufferObject(OpenGL.GL_ELEMENT_ARRAY_BUFFER, geometry.MatrixIndices, OpenGL.GL_STATIC_DRAW); this.MatrixVertexOrIndexCount = geometry.MatrixIndices.SizeInBytes / sizeof(uint); this.matrixRenderMode = geometry.MatrixIndices.Mode; } else { unsafe { int elementSize = sizeof(Vertex); this.MatrixVertexOrIndexCount = geometry.Positions.SizeInBytes / elementSize; this.matrixRenderMode = OpenGL.GL_TRIANGLES; } } this.fractionPositionBuffer = new uint[1]; this.fractionPositionBuffer[0] = CreateVertexBufferObject(OpenGL.GL_ARRAY_BUFFER, geometry.FracturePositions, OpenGL.GL_STATIC_DRAW); unsafe { int elementSize = sizeof(Vertex); this.FractionVertexCount = geometry.FracturePositions.SizeInBytes / elementSize; } }
private unsafe DynamicUnstructureGeometry DoCreateMesh(DynamicUnstructuredGridderSource src) { MatrixPositionBuffer matrixPositions = null; TetrahedronMatrixIndexBuffer matrixIndicesBuffer = null; FracturePositionBuffer fractionPositionsBuffer = null; //生成母体 if (src.ElementFormat == DynamicUnstructuredGridderSource.MATRIX_FORMAT4_TETRAHEDRON) { matrixPositions = new TetrahedronMatrixPositionBuffer(); //matrixPositions.Shape = MatrixPositionBufferData.SHAPE_TETRAHEDRON; //int memSize = src.ElementNum * sizeof(TetrahedronPositions); //matrixPositions.AllocMem(memSize); matrixPositions.AllocMem(src.ElementNum); TetrahedronPosition *tets = (TetrahedronPosition *)matrixPositions.Data; int[][] matrixIndices = src.Elements; Vertex[] positions = src.Nodes; for (int i = 0; i < src.ElementNum; i++) { tets[i].p1 = positions[matrixIndices[i][0] - 1]; tets[i].p2 = positions[matrixIndices[i][1] - 1]; tets[i].p3 = positions[matrixIndices[i][2] - 1]; tets[i].p4 = positions[matrixIndices[i][3] - 1]; } matrixIndicesBuffer = new TetrahedronMatrixIndexBuffer(); //int triangleCount = src.ElementNum * 4; //matrixIndicesBuffer.AllocMem(triangleCount * sizeof(TriangleIndex)); matrixIndicesBuffer.AllocMem(src.ElementNum); TetrahedronIndex *header = (TetrahedronIndex *)matrixIndicesBuffer.Data; for (int i = 0; i < src.ElementNum; i++) { header[i].dot0 = (uint)(i * 4 + 0); header[i].dot1 = (uint)(i * 4 + 1); header[i].dot2 = (uint)(i * 4 + 2); header[i].dot3 = (uint)(i * 4 + 3); header[i].dot4 = (uint)(i * 4 + 0); header[i].dot5 = (uint)(i * 4 + 1); header[i].restartIndex = uint.MaxValue; } } if (src.ElementFormat == DynamicUnstructuredGridderSource.MATRIX_FORMAT3_TRIANGLE) { matrixPositions = new TriangleMatrixPositionBuffer(); //matrixPositions.Shape = MatrixPositionBufferData.SHAPE_TRIANGLE; matrixPositions.AllocMem(src.ElementNum); int[][] matrixIndices = src.Elements; Vertex[] positions = src.Nodes; TrianglePosition *triangles = (TrianglePosition *)matrixPositions.Data; for (int i = 0; i < src.ElementNum; i++) { triangles[i].P1 = positions[matrixIndices[i][0] - 1]; triangles[i].P2 = positions[matrixIndices[i][1] - 1]; triangles[i].P3 = positions[matrixIndices[i][2] - 1]; } } //生成裂缝 if (src.FractureFormat == DynamicUnstructuredGridderSource.FRACTURE_FORMAT3_TRIANGLE) { fractionPositionsBuffer = new TriangleFracturePositionBuffer(); //fractionPositionsBuffer.Shape = FracturePositionBufferData.SHAPE_TRIANGLE; int triangleCount = src.FractureNum; //fractionPositionsBuffer.AllocMem(triangleCount * sizeof(TrianglePositions)); fractionPositionsBuffer.AllocMem(triangleCount); int[][] triangleIndices = src.Fractures; Vertex[] positions = src.Nodes; TrianglePosition *triangles = (TrianglePosition *)fractionPositionsBuffer.Data; for (int i = 0; i < triangleCount; i++) { triangles[i].P1 = positions[triangleIndices[i][0] - 1]; triangles[i].P2 = positions[triangleIndices[i][1] - 1]; triangles[i].P3 = positions[triangleIndices[i][2] - 1]; } } if (src.FractureFormat == DynamicUnstructuredGridderSource.FRACTURE_FORMAT2_LINE) { fractionPositionsBuffer = new LineFracturePositionBuffer(); //fractionPositionsBuffer.Shape = FracturePositionBufferData.SHAPE_LINE; int lineCount = src.FractureNum; //fractionPositionsBuffer.AllocMem(lineCount * sizeof(LinePositions)); fractionPositionsBuffer.AllocMem(lineCount); LinePosition *lines = (LinePosition *)fractionPositionsBuffer.Data; Vertex[] positions = src.Nodes; int[][] lineIndices = src.Fractures; for (int i = 0; i < lineCount; i++) { lines[i].P1 = positions[lineIndices[i][0] - 1]; lines[i].P2 = positions[lineIndices[i][1] - 1]; } } DynamicUnstructureGeometry geometry = new DynamicUnstructureGeometry(matrixPositions); geometry.MatrixIndices = matrixIndicesBuffer; geometry.FracturePositions = fractionPositionsBuffer; geometry.Min = src.Min; geometry.Max = src.Max; return(geometry); }
private void CreateCatesianGridVisual3D(object sender, EventArgs e) { try { string fileName = @"geometry.txt"; DynamicUnstructureGeometryLoader loader = new DynamicUnstructureGeometryLoader(); // use CatesianGridderSource to fill HexahedronGridderElement's content. DynamicUnstructuredGridderSource source = loader.LoadSource(fileName); source.Init(); int nx = source.NX; int ny = source.NY; int nz = source.NZ; int dimenSize = nx * ny * nz; float step = System.Convert.ToSingle(tbColorIndicatorStep.Text); //float radius = System.Convert.ToSingle(this.tbRadius.Text); float propMin = System.Convert.ToSingle(this.tbxPropertyMinValue.Text, CultureInfo.InvariantCulture); float propMax = System.Convert.ToSingle(this.tbxPropertyMaxValue.Text, CultureInfo.InvariantCulture); float dx = System.Convert.ToSingle(this.tbDX.Text); float dy = System.Convert.ToSingle(this.gbDY.Text); float dz = System.Convert.ToSingle(this.tbDZ.Text); float[] dxArray = initArray(dimenSize, dx); float[] dyArray = initArray(dimenSize, dy); float[] dzArray = initArray(dimenSize, dz); InitPropertiesAndSelectDefault(dimenSize, propMin, propMax); ///模拟获得网格属性 ///获得当前选中的属性 float minValue = this.CurrentProperty.MinValue; float maxValue = this.CurrentProperty.MaxValue; step = (maxValue * 1.0f - minValue * 1.0f) / 10; int[] gridIndexes = this.CurrentProperty.GridIndexes; float[] gridValues = this.CurrentProperty.Values; //设置色标的范围 this.sim3D.SetColorIndicator(minValue, maxValue, step); // use HexahedronGridderElement DateTime t0 = DateTime.Now; DynamicUnstructureGeometry geometry = source.CreateMesh() as DynamicUnstructureGeometry; TexCoordBuffer matrixTextureCoordinates = source.CreateTextureCoordinates(gridIndexes, gridValues, minValue, maxValue); TexCoordBuffer fractureTextureCoordindates = source.CreateFractureTextureCoordinates(gridIndexes, gridValues, minValue, maxValue); Bitmap texture = ColorPaletteHelper.GenBitmap(this.sim3D.uiColorIndicator.Data.ColorPalette); //geometry.Positions.Dump(); //geometry.TriangleIndices.Dump(); //MeshGeometry mesh = HexahedronGridderHelper.CreateMesh(source); DynamicUnstructureGrid gridder = new DynamicUnstructureGrid(this.sim3D.OpenGL, this.sim3D.Scene.CurrentCamera); gridder.Init(geometry); gridder.RenderGrid = true; gridder.RenderGridWireframe = this.IsShowWireframe; gridder.SetTexture(texture); gridder.SetMatrixTextureCoords(matrixTextureCoordinates); gridder.SetFractionTextureCoords(fractureTextureCoordindates); this.element = gridder; //textureCoodinates.Dump(); DateTime t1 = DateTime.Now; TimeSpan ts1 = t1 - t0; //mesh.VertexColors = HexahedronGridderHelper.FromColors(source, gridIndexes, colors, mesh.Visibles); //this.DebugMesh(mesh); //HexahedronGridderElement gridderElement = new HexahedronGridderElement(source, this.scientificVisual3DControl.Scene.CurrentCamera); //gridderElement.renderWireframe = false; //method1 //gridderElement.Initialize(this.scientificVisual3DControl.OpenGL); //method2 //gridderElement.Initialize(this.scientificVisual3DControl.OpenGL, mesh); DateTime t2 = DateTime.Now; //gridderElement.SetBoundingBox(mesh.Min, mesh.Max); this.sim3D.Tag = source; //gridderElement.Name = string.Format("element {0}", elementCounter++); //this.scientificVisual3DControl.AddModelElement(gridderElement); DateTime t3 = DateTime.Now; // update ModelContainer's BoundingBox. BoundingBox boundingBox = this.sim3D.ModelContainer.BoundingBox; boundingBox.SetBounds(geometry.Min, geometry.Max); // update ViewType to UserView. this.sim3D.ViewType = ViewTypes.UserView; this.sim3D.AddModelElement(gridder); //mesh.Dispose(); StringBuilder msgBuilder = new StringBuilder(); msgBuilder.AppendLine(String.Format("create mesh in {0} secs", (t1 - t0).TotalSeconds)); msgBuilder.AppendLine(String.Format("init SceneElement in {0} secs", (t2 - t1).TotalSeconds)); msgBuilder.AppendLine(String.Format("total load in {0} secs", (t2 - t0).TotalSeconds)); String msg = msgBuilder.ToString(); MessageBox.Show(msg, "Summary", MessageBoxButtons.OK, MessageBoxIcon.Information); } catch (Exception error) { MessageBox.Show(error.ToString()); } }