/** 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 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; }
void Canvas_setColorRGB(int red, int green, int blue) { CHECK_DRAWING(1); if (IN_BOUNDS(red, 0, 255) && IN_BOUNDS(green, 0, 255) && IN_BOUNDS(blue, 0, 255)) { currentColor = EncodeColor(red, green, blue); } }
/** 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; }
/** 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; }