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); }
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); }
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; }