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);
        }
Exemplo n.º 3
0
        //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;
            }
        }
Exemplo n.º 4
0
        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);
        }
Exemplo n.º 5
0
        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());
            }
        }