示例#1
0
 VertexBuffers.BufferRenderer IModel.GetPositionBufferRenderer(string varNameInShader)
 {
     using (var buffer = new PositionBuffer(varNameInShader))
     {
         buffer.Alloc(positionArray.Length);
         unsafe
         {
             vec3 *array = (vec3 *)buffer.FirstElement();
             for (int i = 0; i < positionArray.Length; i++)
             {
                 array[i] = positionArray[i];
             }
         }
         return(buffer.GetRenderer());
     }
 }
示例#2
0
        CSharpGL.Objects.VertexBuffers.BufferRenderer IModel.GetNormalBufferRenderer(string varNameInShader)
        {
            using (var buffer = new SphereModelNormalBuffer(varNameInShader))
            {
                buffer.Alloc(normals.Length);
                unsafe
                {
                    vec3 *array = (vec3 *)buffer.FirstElement();
                    for (int i = 0; i < normals.Length; i++)
                    {
                        array[i] = normals[i];
                    }
                }

                return(buffer.GetRenderer());
            }
        }
示例#3
0
        CSharpGL.Objects.VertexBuffers.BufferPointer IModel.GetNormalBufferRenderer(string varNameInShader)
        {
            using (var buffer = new ObjModelNormalBuffer(varNameInShader))
            {
                buffer.Alloc(model.normalList.Count);
                unsafe
                {
                    vec3 *array = (vec3 *)buffer.FirstElement();
                    for (int i = 0; i < model.normalList.Count; i++)
                    {
                        array[i] = model.normalList[i];
                    }
                }

                return(buffer.GetRenderer());
            }
        }
示例#4
0
        VertexBuffers.BufferPointer IModel.GetNormalBufferRenderer(string varNameInShader)
        {
            using (var buffer = new NormalBuffer(varNameInShader))
            {
                buffer.Alloc(this.normals.Length);
                unsafe
                {
                    vec3 *array = (vec3 *)buffer.FirstElement();
                    for (int i = 0; i < this.normals.Length; i++)
                    {
                        array[i] = this.normals[i];
                    }
                }

                return(buffer.GetRenderer());
            }
        }
示例#5
0
        CSharpGL.Objects.VertexBuffers.BufferRenderer IModel.GetPositionBufferRenderer(string varNameInShader)
        {
            using (var buffer = new ObjModelPositionBuffer(varNameInShader))
            {
                buffer.Alloc(positions.Count);
                unsafe
                {
                    vec3 *array = (vec3 *)buffer.FirstElement();
                    for (int i = 0; i < positions.Count; i++)
                    {
                        array[i] = positions[i];
                    }
                }

                return(buffer.GetRenderer());
            }
        }
示例#6
0
        CSharpGL.Objects.VertexBuffers.BufferPointer IModel.GetColorBufferRenderer(string varNameInShader)
        {
            using (var colorBuffer = new IceCreamModelColorBuffer(varNameInShader))
            {
                colorBuffer.Alloc(colors.Length);
                unsafe
                {
                    vec3 *array = (vec3 *)colorBuffer.FirstElement();
                    for (int i = 0; i < colors.Length; i++)
                    {
                        array[i] = colors[i];
                    }
                }

                return(colorBuffer.GetRenderer());
            }
        }
示例#7
0
        CSharpGL.Objects.VertexBuffers.BufferPointer IModel.GetPositionBufferRenderer(string varNameInShader)
        {
            using (var positionBuffer = new IceCreamModelPositionBuffer(varNameInShader))
            {
                positionBuffer.Alloc(positions.Length);
                unsafe
                {
                    vec3 *array = (vec3 *)positionBuffer.FirstElement();
                    for (int i = 0; i < positions.Length; i++)
                    {
                        array[i] = positions[i];
                    }
                }

                return(positionBuffer.GetRenderer());
            }
        }
示例#8
0
        public CSharpGL.Objects.VertexBuffers.BufferRenderer GetColorBufferRenderer(string varNameInShader)
        {
            using (var buffer = new ColorBuffer(varNameInShader))
            {
                vec3[] colors = this.model.colors;
                buffer.Alloc(colors.Length);
                unsafe
                {
                    vec3 *header = (vec3 *)buffer.FirstElement();
                    for (int i = 0; i < colors.Length; i++)
                    {
                        header[i] = colors[i];
                    }
                }

                return(buffer.GetRenderer());
            }
        }
示例#9
0
        public CSharpGL.Objects.VertexBuffers.BufferRenderer GetPositionBufferRenderer(string varNameInShader)
        {
            using (var buffer = new PositionBuffer(varNameInShader))
            {
                vec3[] positions = this.model.positions;
                buffer.Alloc(positions.Length);
                unsafe
                {
                    vec3 *header = (vec3 *)buffer.FirstElement();
                    for (int i = 0; i < positions.Length; i++)
                    {
                        header[i] = positions[i];
                    }
                }

                return(buffer.GetRenderer());
            }
        }
        public static void TypicalScene()
        {
            const int count = 1000000;

            long startTick = 0;
            long interval, interval2;

            // 测试float类型
            {
                var floatArray = new UnmanagedArray <float>(count);
                startTick = DateTime.Now.Ticks;
                for (int i = 0; i < count; i++)
                {
                    floatArray[i] = i;
                }
                for (int i = 0; i < count; i++)
                {
                    var item = floatArray[i];
                    if (item != i)
                    {
                        throw new Exception();
                    }
                }
                interval = DateTime.Now.Ticks - startTick;

                unsafe
                {
                    startTick = DateTime.Now.Ticks;
                    float *header      = (float *)floatArray.FirstElement();
                    float *last        = (float *)floatArray.LastElement();
                    float *tailAddress = (float *)floatArray.TailAddress();
                    int    value       = 0;
                    for (float *ptr = header; ptr <= last /*or: ptr < tailAddress*/; ptr++)
                    {
                        *ptr = value++;
                    }
                    int i = 0;
                    for (float *ptr = header; ptr <= last /*or: ptr < tailAddress*/; ptr++, i++)
                    {
                        var item = *ptr;
                        if (item != i)
                        {
                            throw new Exception();
                        }
                    }
                    interval2 = DateTime.Now.Ticks - startTick;
                }
                Console.WriteLine("Ticks: safe: {0} vs unsafe: {1}", interval, interval2);
            }


            // 测试decimal类型
            {
                var decimalArray = new UnmanagedArray <decimal>(count);
                startTick = DateTime.Now.Ticks;
                for (int i = 0; i < count; i++)
                {
                    decimalArray[i] = i;
                }
                for (int i = 0; i < count; i++)
                {
                    var item = decimalArray[i];
                    if (item != i)
                    {
                        throw new Exception();
                    }
                }
                interval = DateTime.Now.Ticks - startTick;

                unsafe
                {
                    startTick = DateTime.Now.Ticks;
                    decimal *header      = (decimal *)decimalArray.FirstElement();
                    decimal *last        = (decimal *)decimalArray.LastElement();
                    decimal *tailAddress = (decimal *)decimalArray.TailAddress();
                    int      value       = 0;
                    for (decimal *ptr = header; ptr <= last /*or: ptr < tailAddress*/; ptr++)
                    {
                        *ptr = value++;
                    }
                    int i = 0;
                    for (decimal *ptr = header; ptr <= last /*or: ptr < tailAddress*/; ptr++, i++)
                    {
                        var item = *ptr;
                        if (item != i)
                        {
                            throw new Exception();
                        }
                    }
                    interval2 = DateTime.Now.Ticks - startTick;
                }
                Console.WriteLine("Ticks: safe: {0} vs unsafe: {1}", interval, interval2);
            }


            // 测试int类型
            {
                var intArray = new UnmanagedArray <int>(count);
                startTick = DateTime.Now.Ticks;
                for (int i = 0; i < count; i++)
                {
                    intArray[i] = i;
                }
                for (int i = 0; i < count; i++)
                {
                    var item = intArray[i];
                    if (item != i)
                    {
                        throw new Exception();
                    }
                }
                interval = DateTime.Now.Ticks - startTick;

                unsafe
                {
                    startTick = DateTime.Now.Ticks;
                    int *header      = (int *)intArray.FirstElement();
                    int *last        = (int *)intArray.LastElement();
                    int *tailAddress = (int *)intArray.TailAddress();
                    int  value       = 0;
                    for (int *ptr = header; ptr <= last /*or: ptr < tailAddress*/; ptr++)
                    {
                        *ptr = value++;
                    }
                    int i = 0;
                    for (int *ptr = header; ptr <= last /*or: ptr < tailAddress*/; ptr++, i++)
                    {
                        var item = *ptr;
                        if (item != i)
                        {
                            throw new Exception();
                        }
                    }
                    interval2 = DateTime.Now.Ticks - startTick;
                }
                Console.WriteLine("Ticks: safe: {0} vs unsafe: {1}", interval, interval2);
            }


            // 测试bool类型
            {
                var boolArray = new UnmanagedArray <bool>(count);
                startTick = DateTime.Now.Ticks;
                for (int i = 0; i < count; i++)
                {
                    boolArray[i] = i % 2 == 0;
                }
                for (int i = 0; i < count; i++)
                {
                    var item = boolArray[i];
                    if (item != (i % 2 == 0))
                    {
                        throw new Exception();
                    }
                }
                interval = DateTime.Now.Ticks - startTick;

                unsafe
                {
                    startTick = DateTime.Now.Ticks;
                    bool *header      = (bool *)boolArray.FirstElement();
                    bool *last        = (bool *)boolArray.LastElement();
                    bool *tailAddress = (bool *)boolArray.TailAddress();
                    int   value       = 0;
                    for (bool *ptr = header; ptr <= last /*or: ptr < tailAddress*/; ptr++)
                    {
                        *ptr = (value % 2 == 0);
                        value++;
                    }
                    int i = 0;
                    for (bool *ptr = header; ptr <= last /*or: ptr < tailAddress*/; ptr++, i++)
                    {
                        var item = *ptr;
                        if (item != (i % 2 == 0))
                        {
                            throw new Exception();
                        }
                    }
                    interval2 = DateTime.Now.Ticks - startTick;
                }
                Console.WriteLine("Ticks: safe: {0} vs unsafe: {1}", interval, interval2);
            }

            // 测试vec3类型
            {
                var vec3Array = new UnmanagedArray <vec3>(count);
                startTick = DateTime.Now.Ticks;
                for (int i = 0; i < count; i++)
                {
                    vec3Array[i] = new vec3(i * 3 + 0, i * 3 + 1, i * 3 + 2);
                }
                for (int i = 0; i < count; i++)
                {
                    var item = vec3Array[i];
                    var old  = new vec3(i * 3 + 0, i * 3 + 1, i * 3 + 2);
                    if (item.x != old.x || item.y != old.y || item.z != old.z)
                    {
                        throw new Exception();
                    }
                }
                interval = DateTime.Now.Ticks - startTick;

                unsafe
                {
                    startTick = DateTime.Now.Ticks;
                    vec3 *header      = (vec3 *)vec3Array.FirstElement();
                    vec3 *last        = (vec3 *)vec3Array.LastElement();
                    vec3 *tailAddress = (vec3 *)vec3Array.TailAddress();
                    int   i           = 0;
                    for (vec3 *ptr = header; ptr <= last /*or: ptr < tailAddress*/; ptr++)
                    {
                        *ptr = new vec3(i * 3 + 0, i * 3 + 1, i * 3 + 2);
                        i++;
                    }
                    i = 0;
                    for (vec3 *ptr = header; ptr <= last /*or: ptr < tailAddress*/; ptr++, i++)
                    {
                        var item = *ptr;
                        var old  = new vec3(i * 3 + 0, i * 3 + 1, i * 3 + 2);
                        if (item.x != old.x || item.y != old.y || item.z != old.z)
                        {
                            throw new Exception();
                        }
                    }
                    interval2 = DateTime.Now.Ticks - startTick;
                }
                Console.WriteLine("Ticks: safe: {0} vs unsafe: {1}", interval, interval2);
            }

            // 测试mat4类型
            {
                var vec3Array = new UnmanagedArray <mat4>(count);
                startTick = DateTime.Now.Ticks;
                for (int i = 0; i < count; i++)
                {
                    vec3Array[i] = new mat4(new vec4(i, i + 1, i + 2, i + 3), new vec4(i, i + 1, i + 2, i + 3), new vec4(i, i + 1, i + 2, i + 3), new vec4(i, i + 1, i + 2, i + 3));
                }
                for (int i = 0; i < count; i++)
                {
                    var item = vec3Array[i];
                    var old  = new mat4(new vec4(i, i + 1, i + 2, i + 3), new vec4(i, i + 1, i + 2, i + 3), new vec4(i, i + 1, i + 2, i + 3), new vec4(i, i + 1, i + 2, i + 3));
                    for (int col = 0; col < 4; col++)
                    {
                        for (int row = 0; row < 4; row++)
                        {
                            if (item[col][row] != old[col][row])
                            {
                                throw new Exception();
                            }
                        }
                    }
                }
                interval = DateTime.Now.Ticks - startTick;

                unsafe
                {
                    startTick = DateTime.Now.Ticks;
                    mat4 *header      = (mat4 *)vec3Array.FirstElement();
                    mat4 *last        = (mat4 *)vec3Array.LastElement();
                    mat4 *tailAddress = (mat4 *)vec3Array.TailAddress();
                    int   i           = 0;
                    for (mat4 *ptr = header; ptr <= last /*or: ptr < tailAddress*/; ptr++)
                    {
                        *ptr = new mat4(new vec4(i, i + 1, i + 2, i + 3), new vec4(i, i + 1, i + 2, i + 3), new vec4(i, i + 1, i + 2, i + 3), new vec4(i, i + 1, i + 2, i + 3));
                        i++;
                    }
                    i = 0;
                    for (mat4 *ptr = header; ptr <= last /*or: ptr < tailAddress*/; ptr++, i++)
                    {
                        var item = *ptr;
                        var old  = new mat4(new vec4(i, i + 1, i + 2, i + 3), new vec4(i, i + 1, i + 2, i + 3), new vec4(i, i + 1, i + 2, i + 3), new vec4(i, i + 1, i + 2, i + 3));
                        for (int col = 0; col < 4; col++)
                        {
                            for (int row = 0; row < 4; row++)
                            {
                                if (item[col][row] != old[col][row])
                                {
                                    throw new Exception();
                                }
                            }
                        }
                    }
                    interval2 = DateTime.Now.Ticks - startTick;
                }
                Console.WriteLine("Ticks: safe: {0} vs unsafe: {1}", interval, interval2);
            }

            // 立即释放所有非托管数组占用的内存,任何之前创建的UnmanagedBase数组都不再可用了。
            UnmanagedArray <int> .FreeAll();
        }
示例#11
0
        /// <summary>
        /// 用随机颜色更新当前的颜色。
        /// </summary>
        public void UpdateColorBuffer()
        {
            {
                // update buffer object.
                GL.BindBuffer(BufferTarget.ArrayBuffer, this.colorBuffer[0]);

                IntPtr destColors = GL.MapBuffer(BufferTarget.ArrayBuffer, MapBufferAccess.ReadWrite);

                //colorArray.CopyTo(destColors);
                unsafe
                {
                    vec3 *array = (vec3 *)destColors.ToPointer();
                    int   index = 0;
                    for (int i = 0; i < size; i++)
                    {
                        for (int j = 0; j < size; j++)
                        {
                            for (int k = 0; k < size; k++)
                            {
                                //vec3 color = new vec3((float)random.NextDouble(), (float)random.NextDouble(), (float)random.NextDouble());
                                for (int cubeIndex = 0; cubeIndex < 8; cubeIndex++)
                                {
                                    vec3 color = new vec3((float)random.NextDouble(), (float)random.NextDouble(), (float)random.NextDouble());
                                    array[index++] = color;
                                }
                            }
                        }
                    }
                }

                GL.UnmapBuffer(BufferTarget.ArrayBuffer);
            }

            //// This do the same thing: update buffer object
            //using (var mappingBuffer = new MappingBuffer(BufferTarget.ArrayBuffer, this.colorBuffer[0], MapBufferAccess.ReadWrite))
            //{
            //    //colorArray.CopyTo(mappingBuffer.BufferPointer);
            //    unsafe
            //    {
            //        vec3* array = (vec3*)mappingBuffer.BufferPointer.ToPointer();
            //        int index = 0;
            //        for (int i = 0; i < size; i++)
            //        {
            //            for (int j = 0; j < size; j++)
            //            {
            //                for (int k = 0; k < size; k++)
            //                {
            //                    //vec3 color = new vec3((float)random.NextDouble(), (float)random.NextDouble(), (float)random.NextDouble());
            //                    for (int cubeIndex = 0; cubeIndex < 8; cubeIndex++)
            //                    {
            //                        vec3 color = new vec3((float)random.NextDouble(), (float)random.NextDouble(), (float)random.NextDouble());
            //                        array[index++] = color;
            //                    }
            //                }
            //            }
            //        }
            //    }
            //}

            //colorArray.Dispose();
        }
示例#12
0
        unsafe void InitializeVAO()
        {
            vec3[] colors = new vec3[] { new vec3(1, 0, 0), new vec3(0, 1, 0), new vec3(0, 0, 1) };
            // 计算三个坐标轴
            for (int axisIndex = 0; axisIndex < 3; axisIndex++)
            {
                var axisVertexCount = faceCount * 2;

                //  Create a vertex buffer for the vertex data.
                using (var positionBuffer = new AxisPositionBuffer(strin_Position, BufferUsage.StaticDraw))
                {
                    positionBuffer.Alloc(axisVertexCount);
                    vec3 *positionArray = (vec3 *)positionBuffer.FirstElement();
                    for (int i = 0; i < axisVertexCount; i++)
                    {
                        int     face       = i / 2;
                        float[] components = new float[] {
                            i % 2 == 1 ? 0 : this.axisLength,
                            (float)(this.radius * Math.Cos(face * (Math.PI * 2) / faceCount)),
                            (float)(this.radius * Math.Sin(face * (Math.PI * 2) / faceCount))
                        };
                        positionArray[i] = new vec3(
                            components[(0 + axisIndex) % 3], components[(2 + axisIndex) % 3], components[(4 + axisIndex) % 3]);
                    }
                    this.positionBufferRenderers[axisIndex] = positionBuffer.GetRenderer();
                }

                //  Now do the same for the color data.
                using (var colorBuffer = new AxisColorBuffer(strin_Color, BufferUsage.StaticDraw))
                {
                    colorBuffer.Alloc(axisVertexCount);
                    vec3 *colorArray = (vec3 *)colorBuffer.FirstElement();
                    for (int i = 0; i < axisVertexCount; i++)
                    {
                        colorArray[i] = colors[axisIndex];
                    }
                    this.colorBufferRenderers[axisIndex] = colorBuffer.GetRenderer();
                }

                // Now for the index data.
                using (var indexBuffer = new AxisIndexBuffer())
                {
                    int indexLength = axisVertexCount + 2;
                    indexBuffer.Alloc(indexLength);
                    byte *cylinderIndex = (byte *)indexBuffer.FirstElement();
                    for (int i = 0; i < indexLength - 2; i++)
                    {
                        cylinderIndex[i] = (byte)i;
                    }
                    cylinderIndex[indexLength - 2]       = 0;
                    cylinderIndex[indexLength - 1]       = 1;
                    this.indexBufferRenderers[axisIndex] = indexBuffer.GetRenderer() as IndexBufferPointerBase;
                }
            }
            // 计算XZ平面
            {
                int planVertexCount = 4;

                //  Create a vertex buffer for the vertex data.
                using (var positionBuffer = new AxisPositionBuffer(strin_Position, BufferUsage.StaticDraw))
                {
                    positionBuffer.Alloc(planVertexCount);
                    vec3 *plan = (vec3 *)positionBuffer.FirstElement();
                    {
                        float length = this.axisLength;
                        plan[0] = new vec3(-length, 0, -length);
                        plan[1] = new vec3(-length, 0, length);
                        plan[2] = new vec3(length, 0, length);
                        plan[3] = new vec3(length, 0, -length);
                    }
                    this.planPositionBufferRenderer = positionBuffer.GetRenderer();
                }

                //  Now do the same for the colour data.
                using (var colorBuffer = new AxisColorBuffer(strin_Color, BufferUsage.StaticDraw))
                {
                    colorBuffer.Alloc(planVertexCount);
                    vec3 *colorArray = (vec3 *)colorBuffer.FirstElement();
                    {
                        for (int i = 0; i < planVertexCount; i++)
                        {
                            colorArray[i] = this.planColor;
                        }
                    }
                    this.planColorBufferRenderer = colorBuffer.GetRenderer();
                }

                using (var indexBuffer = new ZeroIndexBuffer(DrawMode.LineLoop, 0, planVertexCount))
                {
                    indexBuffer.Alloc(planVertexCount);//这句话实际上什么都没有做。
                    this.planIndexBufferRenderer = indexBuffer.GetRenderer() as IndexBufferPointerBase;
                }
            }
        }
示例#13
0
        /// <summary>
        /// main slicing function
        /// </summary>
        private unsafe void SliceVolume(vec3 viewDir, int num_slices)
        {
            //get the max and min distance of each vertex of the unit cube
            //in the viewing direction
            float max_dist  = viewDir.dot(vertexList[0]);
            float min_dist  = max_dist;
            int   max_index = 0;
            int   count     = 0;

            for (int i = 1; i < 8; i++)
            {
                //get the distance between the current unit cube vertex and
                //the view vector by dot product
                float dist = viewDir.dot(vertexList[i]);

                //if distance is > max_dist, store the value and index
                if (dist > max_dist)
                {
                    max_dist  = dist;
                    max_index = i;
                }

                //if distance is < min_dist, store the value
                if (dist < min_dist)
                {
                    min_dist = dist;
                }
            }
            //find tha abs maximum of the view direction vector
            int max_dim = FindAbsMax(viewDir);

            //expand it a little bit
            min_dist -= EPSILON;
            max_dist += EPSILON;

            //local variables to store the start, direction vectors,
            //lambda intersection values
            vec3[]  vecStart   = new vec3[12];
            vec3[]  vecDir     = new vec3[12];
            float[] lambda     = new float[12];
            float[] lambda_inc = new float[12];
            float   denom      = 0;

            //set the minimum distance as the plane_dist
            //subtract the max and min distances and divide by the
            //total number of slices to get the plane increment
            float plane_dist     = min_dist;
            float plane_dist_inc = (max_dist - min_dist) / ((float)num_slices);

            //for all edges
            for (int i = 0; i < 12; i++)
            {
                //get the start position vertex by table lookup
                vecStart[i] = vertexList[edges[edgeList[max_index][i]][0]];

                //get the direction by table lookup
                vecDir[i] = vertexList[edges[edgeList[max_index][i]][1]] - vecStart[i];

                //do a dot of vecDir with the view direction vector
                denom = vecDir[i].dot(viewDir);

                //determine the plane intersection parameter (lambda) and
                //plane intersection parameter increment (lambda_inc)
                if (1.0 + denom != 1.0)
                {
                    lambda_inc[i] = plane_dist_inc / denom;
                    lambda[i]     = (plane_dist - vecStart[i].dot(viewDir)) / denom;
                }
                else
                {
                    lambda[i]     = -1.0f;
                    lambda_inc[i] = 0.0f;
                }
            }

            //local variables to store the intesected points
            //note that for a plane and sub intersection, we can have
            //a minimum of 3 and a maximum of 6 vertex polygon
            vec3[]  intersection = new vec3[6];
            float[] dL           = new float[12];

            vec3 *vTextureSlices = (vec3 *)this.vVertexBuffer.MapBuffer(MapBufferAccess.WriteOnly);

            //loop through all slices
            for (int i = num_slices - 1; i >= 0; i--)
            {
                //determine the lambda value for all edges
                for (int e = 0; e < 12; e++)
                {
                    dL[e] = lambda[e] + i * lambda_inc[e];
                }

                //if the values are between 0-1, we have an intersection at the current edge
                //repeat the same for all 12 edges
                if ((dL[0] >= 0.0) && (dL[0] < 1.0))
                {
                    intersection[0] = vecStart[0] + dL[0] * vecDir[0];
                }
                else if ((dL[1] >= 0.0) && (dL[1] < 1.0))
                {
                    intersection[0] = vecStart[1] + dL[1] * vecDir[1];
                }
                else if ((dL[3] >= 0.0) && (dL[3] < 1.0))
                {
                    intersection[0] = vecStart[3] + dL[3] * vecDir[3];
                }
                else
                {
                    continue;
                }

                if ((dL[2] >= 0.0) && (dL[2] < 1.0))
                {
                    intersection[1] = vecStart[2] + dL[2] * vecDir[2];
                }
                else if ((dL[0] >= 0.0) && (dL[0] < 1.0))
                {
                    intersection[1] = vecStart[0] + dL[0] * vecDir[0];
                }
                else if ((dL[1] >= 0.0) && (dL[1] < 1.0))
                {
                    intersection[1] = vecStart[1] + dL[1] * vecDir[1];
                }
                else
                {
                    intersection[1] = vecStart[3] + dL[3] * vecDir[3];
                }

                if ((dL[4] >= 0.0) && (dL[4] < 1.0))
                {
                    intersection[2] = vecStart[4] + dL[4] * vecDir[4];
                }
                else if ((dL[5] >= 0.0) && (dL[5] < 1.0))
                {
                    intersection[2] = vecStart[5] + dL[5] * vecDir[5];
                }
                else
                {
                    intersection[2] = vecStart[7] + dL[7] * vecDir[7];
                }
                if ((dL[6] >= 0.0) && (dL[6] < 1.0))
                {
                    intersection[3] = vecStart[6] + dL[6] * vecDir[6];
                }
                else if ((dL[4] >= 0.0) && (dL[4] < 1.0))
                {
                    intersection[3] = vecStart[4] + dL[4] * vecDir[4];
                }
                else if ((dL[5] >= 0.0) && (dL[5] < 1.0))
                {
                    intersection[3] = vecStart[5] + dL[5] * vecDir[5];
                }
                else
                {
                    intersection[3] = vecStart[7] + dL[7] * vecDir[7];
                }
                if ((dL[8] >= 0.0) && (dL[8] < 1.0))
                {
                    intersection[4] = vecStart[8] + dL[8] * vecDir[8];
                }
                else if ((dL[9] >= 0.0) && (dL[9] < 1.0))
                {
                    intersection[4] = vecStart[9] + dL[9] * vecDir[9];
                }
                else
                {
                    intersection[4] = vecStart[11] + dL[11] * vecDir[11];
                }

                if ((dL[10] >= 0.0) && (dL[10] < 1.0))
                {
                    intersection[5] = vecStart[10] + dL[10] * vecDir[10];
                }
                else if ((dL[8] >= 0.0) && (dL[8] < 1.0))
                {
                    intersection[5] = vecStart[8] + dL[8] * vecDir[8];
                }
                else if ((dL[9] >= 0.0) && (dL[9] < 1.0))
                {
                    intersection[5] = vecStart[9] + dL[9] * vecDir[9];
                }
                else
                {
                    intersection[5] = vecStart[11] + dL[11] * vecDir[11];
                }

                //after all 6 possible intersection vertices are obtained,
                //we calculated the proper polygon indices by using indices of a triangular fan
                int[] indices = new int[] { 0, 1, 2, 0, 2, 3, 0, 3, 4, 0, 4, 5 };

                //Using the indices, pass the intersection vertices to the vTextureSlices vector
                for (int t = 0; t < 12; t++)
                {
                    vTextureSlices[count++] = intersection[indices[t]];
                }
            }

            ////update buffer object with the new vertices
            this.vVertexBuffer.UnmapBuffer();
        }
示例#14
0
        /// <summary>
        /// main slicing function
        /// </summary>
        private unsafe void SliceVolume(vec3 cameraFront, int num_slices)
        {
            float maxCos, minCos; int maxCosIndex;
            FindMaxMin(out maxCos, out minCos, out maxCosIndex);

            //local variables to store the start, direction vectors, 
            //lambda intersection values
            vec3[] vStart = new vec3[12];
            vec3[] vDirection = new vec3[12];
            float[] lambda = new float[12];
            float[] lambda_inc = new float[12];
            float denom = 0;

            //set the minimum distance as the plane_dist
            //subtract the max and min distances and divide by the 
            //total number of slices to get the plane increment
            float plane_dist_inc = (maxCos - minCos) / ((float)num_slices);

            //for all edges
            for (int i = 0; i < 12; i++)
            {
                //get the start position vertex by table lookup
                int[] group = edgeGroups[maxCosIndex];
                int edgeIndex = group[i];
                int[] edge = edgeList[edgeIndex];
                int v0Index = edge[0];
                vStart[i] = vertexList[v0Index];

                //get the direction by table lookup
                int v1Index = edge[1];
                vDirection[i] = vertexList[v1Index] - vertexList[v0Index];

                //do a dot of vDirection with the view direction vector
                denom = vDirection[i].dot(cameraFront);

                //determine the plane intwction parameter (lambda) and 
                //plane intersection parameter increment (lambda_inc)
                if (1.0 + denom != 1.0)
                {
                    lambda_inc[i] = plane_dist_inc / denom;
                    lambda[i] = (minCos - vStart[i].dot(cameraFront)) / denom;
                }
                else
                {
                    lambda[i] = -1.0f;
                    lambda_inc[i] = 0.0f;
                }
            }

            //local variables to store the intesected points
            //note that for a plane and sub intersection, we can have 
            //a minimum of 3 and a maximum of 6 vertex polygon
            vec3[] intersection = new vec3[6];
            float[] dL = new float[12];

            int count = 0;
            vec3* vTextureSlices = (vec3*)this.vVertexBuffer.MapBuffer(MapBufferAccess.WriteOnly);
            //loop through all slices
            for (int i = num_slices - 1; i >= 0; i--)
            {
                //determine the lambda value for all edges
                for (int e = 0; e < 12; e++)
                {
                    dL[e] = lambda[e] + i * lambda_inc[e];
                }

                //if the values are between 0-1, we have an intersection at the current edge
                //repeat the same for all 12 edges
                if ((dL[0] >= 0.0) && (dL[0] < 1.0))
                {
                    intersection[0] = vStart[0] + dL[0] * vDirection[0];
                }
                else if ((dL[1] >= 0.0) && (dL[1] < 1.0))
                {
                    intersection[0] = vStart[1] + dL[1] * vDirection[1];
                }
                else if ((dL[3] >= 0.0) && (dL[3] < 1.0))
                {
                    intersection[0] = vStart[3] + dL[3] * vDirection[3];
                }
                else continue;

                if ((dL[2] >= 0.0) && (dL[2] < 1.0))
                {
                    intersection[1] = vStart[2] + dL[2] * vDirection[2];
                }
                else if ((dL[0] >= 0.0) && (dL[0] < 1.0))
                {
                    intersection[1] = vStart[0] + dL[0] * vDirection[0];
                }
                else if ((dL[1] >= 0.0) && (dL[1] < 1.0))
                {
                    intersection[1] = vStart[1] + dL[1] * vDirection[1];
                }
                else
                {
                    intersection[1] = vStart[3] + dL[3] * vDirection[3];
                }

                if ((dL[4] >= 0.0) && (dL[4] < 1.0))
                {
                    intersection[2] = vStart[4] + dL[4] * vDirection[4];
                }
                else if ((dL[5] >= 0.0) && (dL[5] < 1.0))
                {
                    intersection[2] = vStart[5] + dL[5] * vDirection[5];
                }
                else
                {
                    intersection[2] = vStart[7] + dL[7] * vDirection[7];
                }
                if ((dL[6] >= 0.0) && (dL[6] < 1.0))
                {
                    intersection[3] = vStart[6] + dL[6] * vDirection[6];
                }
                else if ((dL[4] >= 0.0) && (dL[4] < 1.0))
                {
                    intersection[3] = vStart[4] + dL[4] * vDirection[4];
                }
                else if ((dL[5] >= 0.0) && (dL[5] < 1.0))
                {
                    intersection[3] = vStart[5] + dL[5] * vDirection[5];
                }
                else
                {
                    intersection[3] = vStart[7] + dL[7] * vDirection[7];
                }
                if ((dL[8] >= 0.0) && (dL[8] < 1.0))
                {
                    intersection[4] = vStart[8] + dL[8] * vDirection[8];
                }
                else if ((dL[9] >= 0.0) && (dL[9] < 1.0))
                {
                    intersection[4] = vStart[9] + dL[9] * vDirection[9];
                }
                else
                {
                    intersection[4] = vStart[11] + dL[11] * vDirection[11];
                }

                if ((dL[10] >= 0.0) && (dL[10] < 1.0))
                {
                    intersection[5] = vStart[10] + dL[10] * vDirection[10];
                }
                else if ((dL[8] >= 0.0) && (dL[8] < 1.0))
                {
                    intersection[5] = vStart[8] + dL[8] * vDirection[8];
                }
                else if ((dL[9] >= 0.0) && (dL[9] < 1.0))
                {
                    intersection[5] = vStart[9] + dL[9] * vDirection[9];
                }
                else
                {
                    intersection[5] = vStart[11] + dL[11] * vDirection[11];
                }

                //after all 6 possible intersection vertices are obtained,
                //we calculated the proper polygon indices by using indices of a triangular fan
                int[] indices = new int[] { 0, 1, 2, 0, 2, 3, 0, 3, 4, 0, 4, 5 };

                //Using the indices, pass the intersection vertices to the vTextureSlices vector
                for (int t = 0; t < 12; t++)
                {
                    vTextureSlices[count++] = intersection[indices[t]];
                }
            }

            ////update buffer object with the new vertices
            this.vVertexBuffer.UnmapBuffer();
        }