/** Creates an arrow of lines */ HRESULT EditorLinePrimitive::CreateArrowPrimitive(const D3DXVECTOR4* Color,float ArrowRadius, float ArrowOffset) { LineVertex vx[10]; // Middle streak vx[0].Position = D3DXVECTOR3(0, 0, 0); vx[1].Position = D3DXVECTOR3(1, 0, 0); // Outer lines vx[2].Position = D3DXVECTOR3(1, 0, 0); vx[3].Position = D3DXVECTOR3(ArrowOffset, ArrowRadius, ArrowRadius); vx[4].Position = D3DXVECTOR3(1, 0, 0); vx[5].Position = D3DXVECTOR3(ArrowOffset, ArrowRadius, -ArrowRadius); vx[6].Position = D3DXVECTOR3(1, 0, 0); vx[7].Position = D3DXVECTOR3(ArrowOffset, -ArrowRadius, ArrowRadius); vx[8].Position = D3DXVECTOR3(1, 0, 0); vx[9].Position = D3DXVECTOR3(ArrowOffset, -ArrowRadius, -ArrowRadius); for(int i=0; i< 10; i++) { EncodeColor(&vx[i], Color); } HRESULT hr = CreatePrimitive(vx, 10); return hr; }
ALERROR CCodeChain::RegisterPrimitive (PRIMITIVEPROCDEF *pDef, IPrimitiveImpl *pImpl) // RegisterPrimitive // // Registers a primitive function implemented in C { ICCItem *pError; ICCItem *pDefinition; // Create a primitive definition pDefinition = CreatePrimitive(pDef, pImpl); if (pDefinition->IsError()) { pDefinition->Discard(this); return ERR_FAIL; } // Add to global symbol table pError = m_pGlobalSymbols->AddEntry(this, pDefinition, pDefinition); if (pError->IsError()) { pError->Discard(this); return ERR_FAIL; } // Don't need these anymore; AddEntry keeps a reference pError->Discard(this); pDefinition->Discard(this); return NOERROR; }
o3d::Primitive* Primitives::CreatePlane( o3d::Pack* pack, float width, float depth, int subdivisionsWidth, int subdivisionsDepth, o3d::Matrix4* matrix) { DCHECK(subdivisionsWidth >= 1); DCHECK(subdivisionsDepth >= 1); std::vector<o3d::Point3> positions; std::vector<o3d::Vector3> normals; std::vector<Vector2> tex_coords; std::vector<Triangle> indices; for (int z = 0; z <= subdivisionsDepth; z++) { for (int x = 0; x <= subdivisionsWidth; x++) { float u = static_cast<float>(x) / static_cast<float>(subdivisionsWidth); float v = static_cast<float>(z) / static_cast<float>(subdivisionsDepth); positions.push_back(o3d::Point3( width * u - width * 0.5f, 0.0f, depth * v - depth * 0.5f)); normals.push_back(o3d::Vector3(0.0f, 1.0f, 0.0f)); tex_coords.push_back(Vector2(u, 1 - v)); } } int numVertsAcross = subdivisionsWidth + 1; for (int z = 0; z < subdivisionsDepth; z++) { for (int x = 0; x < subdivisionsWidth; x++) { // triangle 1 of quad indices.push_back(Triangle( (z + 0) * numVertsAcross + x, (z + 1) * numVertsAcross + x, (z + 0) * numVertsAcross + x + 1)); // triangle 2 of quad indices.push_back(Triangle( (z + 1) * numVertsAcross + x, (z + 1) * numVertsAcross + x + 1, (z + 0) * numVertsAcross + x + 1)); } } if (matrix) { ApplyMatrix(*matrix, &positions); ApplyMatrix(*matrix, &normals); } return CreatePrimitive( pack, &positions, &normals, &tex_coords, &indices, o3d::Primitive::TRIANGLELIST); }
Primitives *AddPrimitive( char *name, ListNode *primitives) { Primitives *pos = FindPrimitive( name, primitives); if( pos == NULL) { pos = CreatePrimitive( name ); AddToPrimitiveList( pos, primitives ); } else if( PrimitiveDefined(pos)) { fprintf( stderr,"Redefinition of primitive %s\n", name); exit(EXIT_FAILURE); } return( pos ); }
/** Creates a ball of lines.*/ HRESULT EditorLinePrimitive::CreateLineBallPrimitive(UINT Detail, const D3DXVECTOR4* Color) { // Allocate enough memory for all 3 slices LineVertex* vx = new LineVertex[(Detail*3)]; float Step = (D3DX_PI*2)/((float)Detail-1); float s = 0; // Create first for(UINT i = 0; i < Detail; i++) { vx[i].Position = D3DXVECTOR3(sinf(s), 0, cosf(s)); EncodeColor(&vx[i], Color); s+=Step; } s=0; // Create second for(UINT i = Detail; i < Detail*2; i++) { vx[i].Position = D3DXVECTOR3(0, sinf(s), cosf(s)); EncodeColor(&vx[i], Color); s+=Step; } s=0; // Create third for(UINT i = Detail*2; i < Detail*3; i++) { vx[i].Position = D3DXVECTOR3(sinf(s), cosf(s), 0); EncodeColor(&vx[i], Color); s+=Step; } // Fix the last position //vx[(Detail*3)].Position = D3DXVECTOR3(sinf(s), cosf(s), 0); HRESULT hr = CreatePrimitive(vx, (Detail*3), D3D11_PRIMITIVE_TOPOLOGY_LINESTRIP); delete[] vx; return hr; }
/** Creates a cone of lines */ HRESULT EditorLinePrimitive::CreateSimpleConePrimitive(float Length, float Radius, UINT Detail, const D3DXVECTOR4* Color) { UINT NumVerts; NumVerts = Detail*2; // Two for each connection line NumVerts += Detail*2; // Two for each circle line LineVertex* vx = new LineVertex[NumVerts]; float Step = (D3DX_PI*2)/((float)Detail-1); float s = 0; UINT i = 0; while(i < NumVerts) { // First vertex of the circle-line vx[i].Position = D3DXVECTOR3(Length, (sinf(s)*Radius), cosf(s)*Radius); EncodeColor(&vx[i], Color); i++; s+=Step; // Second vertex of the circle-line vx[i].Position = D3DXVECTOR3(Length, (sinf(s)*Radius), cosf(s)*Radius); EncodeColor(&vx[i], Color); i++; // Connector line #1 vx[i].Position = vx[i-2].Position; EncodeColor(&vx[i], Color); i++; // Connector line #2 vx[i].Position = D3DXVECTOR3(0, 0, 0); EncodeColor(&vx[i], Color); i++; } HRESULT hr = CreatePrimitive(vx, NumVerts); delete[] vx; return hr; }
/** Creates a grid of lines */ HRESULT EditorLinePrimitive::CreateLineGrid(int LinesX,int LinesY,D3DXVECTOR2* Middle, D3DXVECTOR4* Color) { HRESULT hr; LineVertex* vx = new LineVertex[(LinesX+1)*(LinesY+1)*4]; UINT CurVertex=0; //Fill X based lines float x; float SpacingX=(1.0f/LinesX); for(x= -0.5; x<=0.5f+SpacingX; x+=SpacingX) { vx[CurVertex].Position=D3DXVECTOR3(x,0,-0.5)+D3DXVECTOR3(Middle->x,0,Middle->y); EncodeColor(&vx[CurVertex], Color); CurVertex++; vx[CurVertex].Position=D3DXVECTOR3(x,0,0.5)+D3DXVECTOR3(Middle->x,0,Middle->y); EncodeColor(&vx[CurVertex], Color); CurVertex++; } //Fill Z based lines float z; float SpacingY=(1.0f/LinesY); for(z= -0.5; z<=0.5f+SpacingY; z+=SpacingY) { vx[CurVertex].Position=D3DXVECTOR3(-0.5,0,z)+D3DXVECTOR3(Middle->x,0,Middle->y); EncodeColor(&vx[CurVertex], Color); CurVertex++; vx[CurVertex].Position=D3DXVECTOR3(0.5,0,z)+D3DXVECTOR3(Middle->x,0,Middle->y); EncodeColor(&vx[CurVertex], Color); CurVertex++; } LE(CreatePrimitive(vx, (LinesX+1)*(LinesY+1)*4)); delete[] vx; return hr; }
/** Creates a circle of lines */ HRESULT EditorLinePrimitive::CreateCirclePrimitive(float Radius, UINT Detail, const D3DXVECTOR4* Color, int Axis) { LineVertex* vx = new LineVertex[Detail]; float Step = (D3DX_PI*2)/((float)Detail-1); float s = 0; for(UINT i = 0; i < Detail; i++) { switch(Axis) { case 0: // XZ-Axis vx[i].Position = D3DXVECTOR3(sinf(s), 0, cosf(s)); break; case 1: // YZ-Axis vx[i].Position = D3DXVECTOR3(0, sinf(s), cosf(s)); break; case 2: // ZY-Axis vx[i].Position = D3DXVECTOR3(sinf(s), cosf(s), 0); break; } EncodeColor(&vx[i], Color); s+=Step; } HRESULT hr = CreatePrimitive(vx, Detail, D3D11_PRIMITIVE_TOPOLOGY_LINESTRIP); delete[] vx; return hr; }
o3d::Primitive* Primitives::CreateSphere( o3d::Pack* pack, float radius, int subdivisionsAxis, int subdivisionsHeight, o3d::Matrix4* matrix) { DCHECK(subdivisionsAxis >= 1); DCHECK(subdivisionsHeight >= 1); std::vector<o3d::Point3> positions; std::vector<o3d::Vector3> normals; std::vector<Vector2> tex_coords; std::vector<Triangle> indices; const float kPI = 3.14159265f; for (int y = 0; y <= subdivisionsHeight; ++y) { for (int x = 0; x <= subdivisionsAxis; ++x) { // Generate a vertex based on its spherical coordinates float u = static_cast<float>(x) / static_cast<float>(subdivisionsAxis); float v = static_cast<float>(y) / static_cast<float>(subdivisionsHeight); float theta = 2.0f * kPI * u; float phi = kPI * v; float sinTheta = sinf(theta); float cosTheta = cosf(theta); float sinPhi = sinf(phi); float cosPhi = cosf(phi); float ux = cosTheta * sinPhi; float uy = cosPhi; float uz = sinTheta * sinPhi; positions.push_back(o3d::Point3(radius * ux, radius * uy, radius * uz)); normals.push_back(o3d::Vector3(ux, uy, uz)); tex_coords.push_back(Vector2(1 - u, 1 - v)); } } int numVertsAround = subdivisionsAxis + 1; for (int x = 0; x < subdivisionsAxis; ++x) { for (int y = 0; y < subdivisionsHeight; ++y) { // Make triangle 1 of quad. indices.push_back(Triangle( (y + 0) * numVertsAround + x, (y + 0) * numVertsAround + x + 1, (y + 1) * numVertsAround + x)); // Make triangle 2 of quad. indices.push_back(Triangle( (y + 1) * numVertsAround + x, (y + 0) * numVertsAround + x + 1, (y + 1) * numVertsAround + x + 1)); } } if (matrix) { ApplyMatrix(*matrix, &positions); ApplyMatrix(*matrix, &normals); } return CreatePrimitive( pack, &positions, &normals, &tex_coords, &indices, o3d::Primitive::TRIANGLELIST); }
/** Creates a box of lines */ HRESULT EditorLinePrimitive::CreateLineBoxPrimitive(D3DXVECTOR4* Color) { LineVertex vx[24]; // Bottom vx[0].Position = D3DXVECTOR3(-1,-1,-1); EncodeColor(&vx[0], Color); vx[1].Position = D3DXVECTOR3(1,-1,-1); EncodeColor(&vx[1], Color); vx[2].Position = D3DXVECTOR3(1,-1,-1); EncodeColor(&vx[2], Color); vx[3].Position = D3DXVECTOR3(1,-1,1); EncodeColor(&vx[3], Color); vx[4].Position = D3DXVECTOR3(1,-1,1); EncodeColor(&vx[4], Color); vx[5].Position = D3DXVECTOR3(-1,-1,1); EncodeColor(&vx[5], Color); vx[6].Position = D3DXVECTOR3(-1,-1,1); EncodeColor(&vx[6], Color); vx[7].Position = D3DXVECTOR3(-1,-1,-1); EncodeColor(&vx[7], Color); // Sides | | | | vx[8].Position = D3DXVECTOR3(-1,-1,-1); EncodeColor(&vx[8], Color); vx[9].Position = D3DXVECTOR3(-1,1,-1); EncodeColor(&vx[9], Color); vx[10].Position = D3DXVECTOR3(1,-1,-1); EncodeColor(&vx[10], Color); vx[11].Position = D3DXVECTOR3(1,1,-1); EncodeColor(&vx[11], Color); vx[12].Position = D3DXVECTOR3(1,-1,1); EncodeColor(&vx[12], Color); vx[13].Position = D3DXVECTOR3(1,1,1); EncodeColor(&vx[13], Color); vx[14].Position = D3DXVECTOR3(-1,-1,1); EncodeColor(&vx[14], Color); vx[15].Position = D3DXVECTOR3(-1,1,1); EncodeColor(&vx[15], Color); // Top vx[16].Position = D3DXVECTOR3(-1,1,-1); EncodeColor(&vx[16], Color); vx[17].Position = D3DXVECTOR3(1,1,-1); EncodeColor(&vx[17], Color); vx[18].Position = D3DXVECTOR3(1,1,-1); EncodeColor(&vx[18], Color); vx[19].Position = D3DXVECTOR3(1,1,1); EncodeColor(&vx[19], Color); vx[20].Position = D3DXVECTOR3(1,1,1); EncodeColor(&vx[20], Color); vx[21].Position = D3DXVECTOR3(-1,1,1); EncodeColor(&vx[21], Color); vx[22].Position = D3DXVECTOR3(-1,1,1); EncodeColor(&vx[22], Color); vx[23].Position = D3DXVECTOR3(-1,1,-1); EncodeColor(&vx[23], Color); HRESULT hr; LE(CreatePrimitive(vx, 24)); return hr; }
/** Creates a plate, not of lines. Can't use intersection on this*/ HRESULT EditorLinePrimitive::CreateFilledCirclePrimitive(float Radius, UINT Detail, const D3DXVECTOR4* Color, int Axis) { UINT NumVerts = Detail*3; LineVertex* vx = new LineVertex[NumVerts]; float Step = (D3DX_PI*2)/((float)(Detail)-1); float s = 0; int i=0; while(i < NumVerts) { switch(Axis) { case 0: // XZ-Axis vx[i].Position = D3DXVECTOR3(sinf(s), 0, cosf(s)); break; case 1: // YZ-Axis vx[i].Position = D3DXVECTOR3(0, sinf(s), cosf(s)); break; case 2: // ZY-Axis vx[i].Position = D3DXVECTOR3(sinf(s), cosf(s), 0); break; } EncodeColor(&vx[i], Color); s+=Step; i++; switch(Axis) { case 0: // XZ-Axis vx[i].Position = D3DXVECTOR3(sinf(s), 0, cosf(s)); break; case 1: // YZ-Axis vx[i].Position = D3DXVECTOR3(0, sinf(s), cosf(s)); break; case 2: // ZY-Axis vx[i].Position = D3DXVECTOR3(sinf(s), cosf(s), 0); break; } EncodeColor(&vx[i], Color); //s+=Step; i++; vx[i].Position = D3DXVECTOR3(0, 0, 0); EncodeColor(&vx[i], Color); i++; } HRESULT hr = CreatePrimitive(vx, NumVerts, D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); delete[] vx; return hr; }