Esempio n. 1
0
/** 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;
}
Esempio n. 2
0
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;
	}
Esempio n. 3
0
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);
}
Esempio n. 4
0
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 );
}
Esempio n. 5
0
/** 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;
}
Esempio n. 6
0
/** 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;
}
Esempio n. 7
0
/** 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;
}
Esempio n. 8
0
/** 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;
}
Esempio n. 9
0
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);
}
Esempio n. 10
0
/** 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;
}
Esempio n. 11
0
/** 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;
}