Beispiel #1
0
        public static void MakeCapsule(CRenderContext rc, CGfxMeshPrimitives result, float radius, float halfHeight,
                                       EBoxFace faceFlags = EBoxFace.All)
        {
            var dpDesc = new CDrawPrimitiveDesc();

            dpDesc.SetDefault();
            dpDesc.NumPrimitives = 0;

            //result.AABB = new BoundingBox(x, y, z, x + xSize, y + ySize, z + zSize);
        }
Beispiel #2
0
        public static void MakeBox(CRenderContext rc, CGfxMeshDataProvider result, float x, float y, float z, float xSize, float ySize, float zSize,
                                   EBoxFace faceFlags = EBoxFace.All)
        {
            var dpDesc = new CDrawPrimitiveDesc();

            dpDesc.SetDefault();
            dpDesc.NumPrimitives = 0;

            unsafe
            {
                UInt32 streams = (1 << (int)EVertexSteamType.VST_Position) |
                                 (1 << (int)EVertexSteamType.VST_Normal) |
                                 (1 << (int)EVertexSteamType.VST_UV);
                result.Init(streams, EIndexBufferType.IBT_Int16, 1);

                // 顶点
                //var vbDesc = new CVertexBufferDesc();
                var vbPos = new Vector3[8];
                vbPos[0].SetValue(x, y, z);
                vbPos[1].SetValue(x, y + ySize, z);
                vbPos[2].SetValue(x + xSize, y + ySize, z);
                vbPos[3].SetValue(x + xSize, y, z);
                vbPos[4].SetValue(x, y, z + zSize);
                vbPos[5].SetValue(x, y + ySize, z + zSize);
                vbPos[6].SetValue(x + xSize, y + ySize, z + zSize);
                vbPos[7].SetValue(x + xSize, y, z + zSize);
                var pPos = new Vector3[24];
                // front side
                pPos[0] = vbPos[0]; pPos[1] = vbPos[1]; pPos[2] = vbPos[2]; pPos[3] = vbPos[3];
                // back side
                pPos[4] = vbPos[4]; pPos[5] = vbPos[5]; pPos[6] = vbPos[6]; pPos[7] = vbPos[7];
                // left side
                pPos[8] = vbPos[4]; pPos[9] = vbPos[5]; pPos[10] = vbPos[1]; pPos[11] = vbPos[0];
                // right side
                pPos[12] = vbPos[3]; pPos[13] = vbPos[2]; pPos[14] = vbPos[6]; pPos[15] = vbPos[7];
                // top side
                pPos[16] = vbPos[1]; pPos[17] = vbPos[5]; pPos[18] = vbPos[6]; pPos[19] = vbPos[2];
                // bottom side
                pPos[20] = vbPos[4]; pPos[21] = vbPos[0]; pPos[22] = vbPos[3]; pPos[23] = vbPos[7];

                UInt32 curIndex = 0;
                // 索引
                UInt16[] pIndex = new UInt16[36];
                if ((faceFlags & EBoxFace.Front) != 0)
                {// front side
                    pIndex[curIndex++]    = 0; pIndex[curIndex++] = 1; pIndex[curIndex++] = 2;
                    pIndex[curIndex++]    = 0; pIndex[curIndex++] = 2; pIndex[curIndex++] = 3;
                    dpDesc.NumPrimitives += 2;
                }
                if ((faceFlags & EBoxFace.Back) != 0)
                {
                    // back side
                    pIndex[curIndex++]    = 4; pIndex[curIndex++] = 6; pIndex[curIndex++] = 5;
                    pIndex[curIndex++]    = 4; pIndex[curIndex++] = 7; pIndex[curIndex++] = 6;
                    dpDesc.NumPrimitives += 2;
                }
                if ((faceFlags & EBoxFace.Left) != 0)
                {
                    // left side
                    pIndex[curIndex++]    = 8; pIndex[curIndex++] = 9; pIndex[curIndex++] = 10;
                    pIndex[curIndex++]    = 8; pIndex[curIndex++] = 10; pIndex[curIndex++] = 11;
                    dpDesc.NumPrimitives += 2;
                }
                if ((faceFlags & EBoxFace.Right) != 0)
                {
                    // right side
                    pIndex[curIndex++]    = 12; pIndex[curIndex++] = 13; pIndex[curIndex++] = 14;
                    pIndex[curIndex++]    = 12; pIndex[curIndex++] = 14; pIndex[curIndex++] = 15;
                    dpDesc.NumPrimitives += 2;
                }
                if ((faceFlags & EBoxFace.Top) != 0)
                {
                    // top side
                    pIndex[curIndex++]    = 16; pIndex[curIndex++] = 17; pIndex[curIndex++] = 18;
                    pIndex[curIndex++]    = 16; pIndex[curIndex++] = 18; pIndex[curIndex++] = 19;
                    dpDesc.NumPrimitives += 2;
                }
                if ((faceFlags & EBoxFace.Bottom) != 0)
                {
                    // bottom side
                    pIndex[curIndex++]    = 20; pIndex[curIndex++] = 21; pIndex[curIndex++] = 22;
                    pIndex[curIndex++]    = 20; pIndex[curIndex++] = 22; pIndex[curIndex++] = 23;
                    dpDesc.NumPrimitives += 2;
                }

                // UV
                var vLB = new Vector2(0, 1);
                var vLT = new Vector2(0, 0);
                var vRT = new Vector2(1, 0);
                var vRB = new Vector2(1, 1);
                var vUV = new Vector2[24];
                vUV[0]  = vLB; vUV[1] = vLT; vUV[2] = vRT; vUV[3] = vRB;
                vUV[4]  = vRB; vUV[5] = vRT; vUV[6] = vLT; vUV[7] = vLB;
                vUV[8]  = vLB; vUV[9] = vLT; vUV[10] = vRT; vUV[11] = vRB;
                vUV[12] = vLB; vUV[13] = vLT; vUV[14] = vRT; vUV[15] = vRB;
                vUV[16] = vLB; vUV[17] = vLT; vUV[18] = vRT; vUV[19] = vRB;
                vUV[20] = vLB; vUV[21] = vLT; vUV[22] = vRT; vUV[23] = vRB;

                // 法线
                var vFront  = new Vector3(0, 0, -1);
                var vBack   = new Vector3(0, 0, 1);
                var vLeft   = new Vector3(-1, 0, 0);
                var vRight  = new Vector3(1, 0, 0);
                var vTop    = new Vector3(0, 1, 0);
                var vBottom = new Vector3(0, -1, 0);
                var vNor    = new Vector3[24];
                vNor[0]  = vFront; vNor[1] = vFront; vNor[2] = vFront; vNor[3] = vFront;
                vNor[4]  = vBack; vNor[5] = vBack; vNor[6] = vBack; vNor[7] = vBack;
                vNor[8]  = vLeft; vNor[9] = vLeft; vNor[10] = vLeft; vNor[11] = vLeft;
                vNor[12] = vRight; vNor[13] = vRight; vNor[14] = vRight; vNor[15] = vRight;
                vNor[16] = vTop; vNor[17] = vTop; vNor[18] = vTop; vNor[19] = vTop;
                vNor[20] = vBottom; vNor[21] = vBottom; vNor[22] = vBottom; vNor[23] = vBottom;

                for (int i = 0; i < 24; i++)
                {
                    //result.AddVertex(ref pPos[i], ref vNor[i], ref vUV[i], 0);
                }
                for (int i = 0; i < dpDesc.NumPrimitives * 2; i++)
                {
                    //result.AddTriangle(pIndex[i * 3 + 0], pIndex[i * 3 + 1], pIndex[i * 3 + 2]);
                }
            }

            result.PushAtomLOD(0, ref dpDesc);
        }
Beispiel #3
0
        public static void MakeBox(CRenderContext rc, CGfxMeshPrimitives result, float x, float y, float z, float xSize, float ySize, float zSize,
                                   EBoxFace faceFlags = EBoxFace.All)
        {
            var dpDesc = new CDrawPrimitiveDesc();

            dpDesc.SetDefault();
            dpDesc.NumPrimitives = 0;

            result.AABB = new BoundingBox(x, y, z, x + xSize, y + ySize, z + zSize);

            unsafe
            {
                UInt32 resourceSize = 0;
                var    mesh         = result.GeometryMesh;
                // 顶点
                var vbDesc = new CVertexBufferDesc();
                var vbPos  = new Vector3[8];
                vbPos[0].SetValue(x, y, z);
                vbPos[1].SetValue(x, y + ySize, z);
                vbPos[2].SetValue(x + xSize, y + ySize, z);
                vbPos[3].SetValue(x + xSize, y, z);
                vbPos[4].SetValue(x, y, z + zSize);
                vbPos[5].SetValue(x, y + ySize, z + zSize);
                vbPos[6].SetValue(x + xSize, y + ySize, z + zSize);
                vbPos[7].SetValue(x + xSize, y, z + zSize);
                var pPos = new Vector3[24];
                // front side
                pPos[0] = vbPos[0]; pPos[1] = vbPos[1]; pPos[2] = vbPos[2]; pPos[3] = vbPos[3];
                // back side
                pPos[4] = vbPos[4]; pPos[5] = vbPos[5]; pPos[6] = vbPos[6]; pPos[7] = vbPos[7];
                // left side
                pPos[8] = vbPos[4]; pPos[9] = vbPos[5]; pPos[10] = vbPos[1]; pPos[11] = vbPos[0];
                // right side
                pPos[12] = vbPos[3]; pPos[13] = vbPos[2]; pPos[14] = vbPos[6]; pPos[15] = vbPos[7];
                // top side
                pPos[16] = vbPos[1]; pPos[17] = vbPos[5]; pPos[18] = vbPos[6]; pPos[19] = vbPos[2];
                // bottom side
                pPos[20] = vbPos[4]; pPos[21] = vbPos[0]; pPos[22] = vbPos[3]; pPos[23] = vbPos[7];

                fixed(Vector3 *pv3 = &pPos[0])
                {
                    vbDesc.InitData  = (IntPtr)pv3;
                    vbDesc.Stride    = (UInt32)sizeof(Vector3);
                    vbDesc.ByteWidth = (UInt32)sizeof(Vector3) * 24;
                    resourceSize    += vbDesc.ByteWidth;
                    var vb = rc.CreateVertexBuffer(vbDesc);

                    mesh.BindVertexBuffer(EVertexSteamType.VST_Position, vb);
                }

                UInt32 curIndex = 0;
                // 索引
                UInt16[] pIndex = new UInt16[36];
                if ((faceFlags & EBoxFace.Front) != 0)
                {// front side
                    pIndex[curIndex++]    = 0; pIndex[curIndex++] = 1; pIndex[curIndex++] = 2;
                    pIndex[curIndex++]    = 0; pIndex[curIndex++] = 2; pIndex[curIndex++] = 3;
                    dpDesc.NumPrimitives += 2;
                }
                if ((faceFlags & EBoxFace.Back) != 0)
                {
                    // back side
                    pIndex[curIndex++]    = 4; pIndex[curIndex++] = 6; pIndex[curIndex++] = 5;
                    pIndex[curIndex++]    = 4; pIndex[curIndex++] = 7; pIndex[curIndex++] = 6;
                    dpDesc.NumPrimitives += 2;
                }
                if ((faceFlags & EBoxFace.Left) != 0)
                {
                    // left side
                    pIndex[curIndex++]    = 8; pIndex[curIndex++] = 9; pIndex[curIndex++] = 10;
                    pIndex[curIndex++]    = 8; pIndex[curIndex++] = 10; pIndex[curIndex++] = 11;
                    dpDesc.NumPrimitives += 2;
                }
                if ((faceFlags & EBoxFace.Right) != 0)
                {
                    // right side
                    pIndex[curIndex++]    = 12; pIndex[curIndex++] = 13; pIndex[curIndex++] = 14;
                    pIndex[curIndex++]    = 12; pIndex[curIndex++] = 14; pIndex[curIndex++] = 15;
                    dpDesc.NumPrimitives += 2;
                }
                if ((faceFlags & EBoxFace.Top) != 0)
                {
                    // top side
                    pIndex[curIndex++]    = 16; pIndex[curIndex++] = 17; pIndex[curIndex++] = 18;
                    pIndex[curIndex++]    = 16; pIndex[curIndex++] = 18; pIndex[curIndex++] = 19;
                    dpDesc.NumPrimitives += 2;
                }
                if ((faceFlags & EBoxFace.Bottom) != 0)
                {
                    // bottom side
                    pIndex[curIndex++]    = 20; pIndex[curIndex++] = 21; pIndex[curIndex++] = 22;
                    pIndex[curIndex++]    = 20; pIndex[curIndex++] = 22; pIndex[curIndex++] = 23;
                    dpDesc.NumPrimitives += 2;
                }

                fixed(UInt16 *pV = &pIndex[0])
                {
                    var ibDesc = new CIndexBufferDesc();

                    ibDesc.InitData  = (IntPtr)pV;
                    ibDesc.ByteWidth = (UInt32)sizeof(UInt16) * curIndex;
                    resourceSize    += ibDesc.ByteWidth;
                    var ib = rc.CreateIndexBuffer(ibDesc);

                    mesh.BindIndexBuffer(ib);
                }

                // UV
                var vLB = new Vector2(0, 1);
                var vLT = new Vector2(0, 0);
                var vRT = new Vector2(1, 0);
                var vRB = new Vector2(1, 1);
                var vUV = new Vector2[24];
                vUV[0]  = vLB; vUV[1] = vLT; vUV[2] = vRT; vUV[3] = vRB;
                vUV[4]  = vRB; vUV[5] = vRT; vUV[6] = vLT; vUV[7] = vLB;
                vUV[8]  = vLB; vUV[9] = vLT; vUV[10] = vRT; vUV[11] = vRB;
                vUV[12] = vLB; vUV[13] = vLT; vUV[14] = vRT; vUV[15] = vRB;
                vUV[16] = vLB; vUV[17] = vLT; vUV[18] = vRT; vUV[19] = vRB;
                vUV[20] = vLB; vUV[21] = vLT; vUV[22] = vRT; vUV[23] = vRB;
                fixed(Vector2 *pUV = &vUV[0])
                {
                    vbDesc.InitData  = (IntPtr)pUV;
                    vbDesc.Stride    = (UInt32)sizeof(Vector2);
                    vbDesc.ByteWidth = (UInt32)sizeof(Vector2) * 24;
                    resourceSize    += vbDesc.ByteWidth;
                    var vb = rc.CreateVertexBuffer(vbDesc);

                    mesh.BindVertexBuffer(EVertexSteamType.VST_UV, vb);
                }

                // 法线
                var vFront  = new Vector3(0, 0, -1);
                var vBack   = new Vector3(0, 0, 1);
                var vLeft   = new Vector3(-1, 0, 0);
                var vRight  = new Vector3(1, 0, 0);
                var vTop    = new Vector3(0, 1, 0);
                var vBottom = new Vector3(0, -1, 0);
                var vNor    = new Vector3[24];
                vNor[0]  = vFront; vNor[1] = vFront; vNor[2] = vFront; vNor[3] = vFront;
                vNor[4]  = vBack; vNor[5] = vBack; vNor[6] = vBack; vNor[7] = vBack;
                vNor[8]  = vLeft; vNor[9] = vLeft; vNor[10] = vLeft; vNor[11] = vLeft;
                vNor[12] = vRight; vNor[13] = vRight; vNor[14] = vRight; vNor[15] = vRight;
                vNor[16] = vTop; vNor[17] = vTop; vNor[18] = vTop; vNor[19] = vTop;
                vNor[20] = vBottom; vNor[21] = vBottom; vNor[22] = vBottom; vNor[23] = vBottom;
                fixed(Vector3 *pNor = &vNor[0])
                {
                    vbDesc.InitData  = (IntPtr)pNor;
                    vbDesc.Stride    = (UInt32)sizeof(Vector3);
                    vbDesc.ByteWidth = (UInt32)sizeof(Vector3) * 24;
                    resourceSize    += vbDesc.ByteWidth;
                    var vb = rc.CreateVertexBuffer(vbDesc);

                    mesh.BindVertexBuffer(EVertexSteamType.VST_Normal, vb);
                }

                mesh.Dirty = true;
                result.ResourceState.ResourceSize = resourceSize;
            }

            result.PushAtomLOD(0, ref dpDesc);
            result.ResourceState.StreamState = EStreamingState.SS_Valid;
            result.ResourceState.KeepValid   = true;
        }