Exemplo n.º 1
0
	void Mesh::createTorus(Number radius, Number tubeRadius, int rSegments, int tSegments) {
	
		setMeshType(Mesh::TRI_MESH);
			
		Vector3 **grid = (Vector3 **) malloc(sizeof(Vector3*) * rSegments);
		for (int i=0 ; i < rSegments; i++) {
			grid[i] = (Vector3*) malloc(sizeof(Vector3) * tSegments);		
		}
		
		for (int i=0 ; i < rSegments; i++) {
			for (int j = 0; j < tSegments; ++j) {
				Number u = ((Number)i) / rSegments * 2.0 * PI;
				Number v = ((Number)j) / tSegments * 2.0 * PI;	

				grid[i][j] = Vector3((radius + tubeRadius*cos(v))*cos(u), tubeRadius*sin(v), (radius + tubeRadius*cos(v))*sin(u));							
													
			}
		}	
		
		for (int i=0 ; i < rSegments; i++) {
			for (int j = 0; j < tSegments; ++j) {

				int ip = (i+1) % rSegments;
				int jp = (j+1) % tSegments;
					
				Vector3 a = grid[i ][j];
				Vector3 b = grid[ip][j];
				Vector3 c = grid[i ][jp];
				Vector3 d = grid[ip][jp];

				Vector2 uva = Vector2(((Number)i)     / ((Number)rSegments), ((Number)j)     / ((Number)tSegments));
				Vector2 uvb = Vector2((((Number)i)+1.0) / ((Number)rSegments), ((Number)j)     / ((Number)tSegments));
				Vector2 uvc = Vector2(((Number)i)    / ((Number)rSegments), (((Number)j)+1.0) / ((Number)tSegments));
				Vector2 uvd = Vector2((((Number)i)+1.0) / ((Number)rSegments), (((Number)j)+1.0) / ((Number)tSegments));


				Polygon *polygon = new Polygon();
				polygon->addVertex(c.x, c.y, c.z, uvc.x ,uvc.y);
				polygon->addVertex(b.x, b.y, b.z, uvb.x ,uvb.y);							
				polygon->addVertex(a.x, a.y, a.z, uva.x ,uva.y);
				addPolygon(polygon);	

				polygon = new Polygon();
				polygon->addVertex(b.x, b.y, b.z, uvb.x ,uvb.y);
				polygon->addVertex(c.x, c.y, c.z, uvc.x ,uvc.y);					
				polygon->addVertex(d.x, d.y, d.z, uvd.x ,uvd.y);				
				addPolygon(polygon);	
			}
		}
		
		for (int i=0 ; i < rSegments; i++) {
			free(grid[i]);
		}		
		free(grid);
		
	
		calculateNormals();
		calculateTangents();
		arrayDirtyMap[RenderDataArray::VERTEX_DATA_ARRAY] = true;		
		arrayDirtyMap[RenderDataArray::COLOR_DATA_ARRAY] = true;				
		arrayDirtyMap[RenderDataArray::TEXCOORD_DATA_ARRAY] = true;						
		arrayDirtyMap[RenderDataArray::NORMAL_DATA_ARRAY] = true;										
		arrayDirtyMap[RenderDataArray::TANGENT_DATA_ARRAY] = true;				
	}
Exemplo n.º 2
0
	void Mesh::createCylinder(Number height, Number radius, int numSegments, bool capped) {
	
		setMeshType(Mesh::TRI_MESH);
		Number lastx = 0;
		Number lastz = 0;
		Number lastv = 0;		
		for (int i=0 ; i < numSegments+1; i++) {
			Number v = ((Number)i)/((Number)numSegments);
			Number pos = ((PI*2.0)/((Number)numSegments)) * i;
			Number x = sin(pos) * radius;
			Number z = cos(pos) * radius;
			
			if(i > 0) {
				Polygon *polygon = new Polygon();
				polygon->addVertex(lastx,0,lastz,lastv,0);				
				polygon->addVertex(x,0,z, v, 0);
				polygon->addVertex(x,height,z, v, 1);				
				addPolygon(polygon);							

				polygon = new Polygon();	
				polygon->addVertex(x,height,z, v, 1);							
				polygon->addVertex(lastx,height,lastz, lastv, 1);
				polygon->addVertex(lastx,0,lastz,lastv,0);												
				addPolygon(polygon);	
				
				if(capped) {
				polygon = new Polygon();	
				polygon->addVertex(lastx,height,lastz, 0.5+(lastz/radius*0.5), 0.5+(lastx/radius*0.5));			
				polygon->addVertex(x,height,z, 0.5+(z/radius*0.5), 0.5+(x/radius*0.5));														
				polygon->addVertex(0,height,0,0.5,0.5);							
				addPolygon(polygon);			

				polygon = new Polygon();	
				polygon->addVertex(lastx,0,lastz, 0.5+(lastz/radius*0.5), 0.5+(lastx/radius*0.5));						
				polygon->addVertex(0,0,0,0.5,0.5);																																					
				polygon->addVertex(x,0,z, 0.5+(z/radius*0.5), 0.5+(x/radius*0.5));								
				addPolygon(polygon);			
				}
								
			}
			lastx = x;
			lastz = z;			
			lastv = v;
		/*
			Polygon *polygon = new Polygon();
			polygon->addVertex(w,0,h, 1, 1);
			polygon->addVertex(0,0,h, 1, 0);
			polygon->addVertex(0,0,0,0,0);
			polygon->addVertex(w,0,0,0,1);
			addPolygon(polygon);			
			*/
        }
		
		for(int i=0; i < polygons.size(); i++) {
			for(int j=0; j < polygons[i]->getVertexCount(); j++) {
//				polygons[i]->getVertex(j)->x = polygons[i]->getVertex(j)->x - (radius/2.0f);
				polygons[i]->getVertex(j)->y = polygons[i]->getVertex(j)->y - (height/2.0f);
//				polygons[i]->getVertex(j)->z = polygons[i]->getVertex(j)->z - (radius/2.0f);	
			}
		}
		
		
		calculateNormals();
		calculateTangents();
		arrayDirtyMap[RenderDataArray::VERTEX_DATA_ARRAY] = true;		
		arrayDirtyMap[RenderDataArray::COLOR_DATA_ARRAY] = true;				
		arrayDirtyMap[RenderDataArray::TEXCOORD_DATA_ARRAY] = true;						
		arrayDirtyMap[RenderDataArray::NORMAL_DATA_ARRAY] = true;										
		arrayDirtyMap[RenderDataArray::TANGENT_DATA_ARRAY] = true;		
	}
Exemplo n.º 3
0
	void Mesh::createSphere(Number _radius, int _segmentsH, int _segmentsW) {

		setMeshType(Mesh::TRI_MESH);


		Vector3 **grid = (Vector3 **) malloc(sizeof(Vector3*) * (_segmentsH+1));
		for (int i=0 ; i < _segmentsH+1; i++) {
			grid[i] = (Vector3*) malloc(sizeof(Vector3) * _segmentsW+1);		
		}
		
	
		for (int i = 0; i < _segmentsW; i++) {
			grid[0][i] = Vector3(0,-_radius,0);
		}
			
		for (int j = 1; j < _segmentsH; j++) {
			Number horangle = ((float)j) / ((float)_segmentsH) * PI;
			Number z = -_radius * cos(horangle);
			Number ringradius = _radius * sin(horangle);

			for (int i = 0; i < _segmentsW; i++) {
				Number verangle = 2.0 * ((float)i) / ((float)_segmentsW) * PI;
				Number x = ringradius * sin(verangle);
				Number y = ringradius * cos(verangle);
				grid[j][i] = Vector3(y, z, x);
            }
		}

		for (int i = 0; i < _segmentsW; i++) {
                grid[_segmentsH][i] = Vector3(0,_radius, 0);
		}

		for (int j = 1; j <= _segmentsH; j++) {
			for (int i = 0; i < _segmentsW; i++) {
				Vector3 a = grid[j][i];
				Vector3 b = grid[j][(i-1+_segmentsW) % _segmentsW];
				Vector3 c = grid[j-1][(i-1+_segmentsW) % _segmentsW];
				Vector3 d = grid[j-1][i];

				int i2 = i;
				if (i == 0) i2 = _segmentsW;

				Number vab = ((float)j) / ((float)_segmentsH);
				Number vcd = (((float)j)-1.0) / ((float)_segmentsH);
				Number uad = ((float)i2) / ((float)_segmentsW);
				Number ubc = (((float)i2)-1.0) / ((float)_segmentsW);
				Vector2 uva = Vector2(uad,vab);
				Vector2 uvb = Vector2(ubc,vab);
				Vector2 uvc = Vector2(ubc,vcd);
				Vector2 uvd = Vector2(uad,vcd);

				if (j < _segmentsH) {
					Polygon *polygon = new Polygon();
					polygon->addVertex(c.x, c.y, c.z, uvc.x ,uvc.y);
					polygon->addVertex(b.x, b.y, b.z, uvb.x ,uvb.y);							
					polygon->addVertex(a.x, a.y, a.z, uva.x ,uva.y);
					addPolygon(polygon);								
				}
				if (j > 1) {
					Polygon *polygon = new Polygon();
					polygon->addVertex(d.x, d.y, d.z, uvd.x ,uvd.y);												
					polygon->addVertex(c.x, c.y, c.z, uvc.x ,uvc.y);
					polygon->addVertex(a.x, a.y, a.z, uva.x ,uva.y);
					addPolygon(polygon);					
				}
			}
		}

		calculateNormals();
		calculateTangents();
		arrayDirtyMap[RenderDataArray::VERTEX_DATA_ARRAY] = true;		
		arrayDirtyMap[RenderDataArray::COLOR_DATA_ARRAY] = true;				
		arrayDirtyMap[RenderDataArray::TEXCOORD_DATA_ARRAY] = true;						
		arrayDirtyMap[RenderDataArray::NORMAL_DATA_ARRAY] = true;										
		arrayDirtyMap[RenderDataArray::TANGENT_DATA_ARRAY] = true;		
	}
Exemplo n.º 4
0
	void Mesh::loadFromFile(OSFILE *inFile) {

		unsigned int meshType;		
		OSBasics::read(&meshType, sizeof(unsigned int), 1, inFile);				
		setMeshType(meshType);
		
		int verticesPerFace;
		switch(meshType) {
			case TRI_MESH:
				verticesPerFace = 3;
			break;
			case QUAD_MESH:
				verticesPerFace = 4;
			break;
			default:
				verticesPerFace = 1;				
			break;
		}
		
		unsigned int numFaces;		
		OSBasics::read(&numFaces, sizeof(unsigned int), 1, inFile);
		
		Vector3_struct pos;
		Vector3_struct nor;
		Vector4_struct col;			
		Vector2_struct tex;
		
		for(int i=0; i < numFaces; i++) {	
			Polygon *poly = new Polygon();			
			
			for(int j=0; j < verticesPerFace; j++) {
				OSBasics::read(&pos, sizeof(Vector3_struct), 1, inFile);
				OSBasics::read(&nor, sizeof(Vector3_struct), 1, inFile);
				OSBasics::read(&col, sizeof(Vector4_struct), 1, inFile);						
				OSBasics::read(&tex, sizeof(Vector2_struct), 1, inFile);						
				
				Vertex *vertex = new Vertex(pos.x, pos.y, pos.z);
				vertex->setNormal(nor.x,nor.y, nor.z);
				vertex->restNormal.set(nor.x,nor.y, nor.z);
				vertex->vertexColor.setColor(col.x,col.y, col.z, col.w);
				vertex->setTexCoord(tex.x, tex.y);
				
				unsigned int numBoneWeights;
				OSBasics::read(&numBoneWeights, sizeof(unsigned int), 1, inFile);								
				for(int b=0; b < numBoneWeights; b++) {
					float weight;
					unsigned int boneID;
					OSBasics::read(&boneID, sizeof(unsigned int), 1, inFile);													
					OSBasics::read(&weight, sizeof(float), 1, inFile);																		
					vertex->addBoneAssignment(boneID, weight);
				}
				
				Number totalWeight = 0;				
				for(int m=0; m < vertex->getNumBoneAssignments(); m++) {
					BoneAssignment *ba = vertex->getBoneAssignment(m);					
					totalWeight += ba->weight;
				}				

				for(int m=0; m < vertex->getNumBoneAssignments(); m++) {
					BoneAssignment *ba = vertex->getBoneAssignment(m);					
					ba->weight = ba->weight/totalWeight;
				}				

				
				poly->addVertex(vertex);
			}
			addPolygon(poly);
		}
		
		calculateTangents();
		
		arrayDirtyMap[RenderDataArray::VERTEX_DATA_ARRAY] = true;		
		arrayDirtyMap[RenderDataArray::COLOR_DATA_ARRAY] = true;				
		arrayDirtyMap[RenderDataArray::TEXCOORD_DATA_ARRAY] = true;
		arrayDirtyMap[RenderDataArray::NORMAL_DATA_ARRAY] = true;	
		arrayDirtyMap[RenderDataArray::TANGENT_DATA_ARRAY] = true;								
	}
Exemplo n.º 5
0
//-----------------------------------------------
bool AflSpriteScroll::createWindow(FLOAT fWidth,FLOAT fHeight,DWORD dwStyle)
{
	AflSpriteWnd::createWindow(fWidth,fHeight);
	if(dwStyle != (UINT)-1)
		m_dwBarStyle = dwStyle;

	static WORD wFrameIndex[]={0,1,2,1,2,3, 4,5,6,5,6,7, 
				8,9,10,9,10,11, 12,13,14,13,14,15,
				16,17,18,17,18,19};
	INT iBarSize;

	DWORD dwScrollPage;
	if(m_dwScrollPage < m_dwScrollMax)
		dwScrollPage = m_dwScrollPage;
	else
		dwScrollPage = m_dwScrollMax;
	iBarSize = m_fScrollClient * dwScrollPage / m_dwScrollMax;
	if(iBarSize < 8)
		iBarSize = 8;

	if(m_dwBarStyle & SBS_VERT)
	{
		m_rectScroll1.fLeft = m_rectClient.fLeft;
		m_rectScroll1.fTop = m_rectClient.fTop;
		m_rectScroll1.fRight = m_rectClient.fRight;
		m_rectScroll1.fBottom = m_rectClient.fTop + m_fButtonSize;

		m_rectScroll2.fLeft = m_rectClient.fLeft;
		m_rectScroll2.fTop = m_rectClient.fBottom - m_fButtonSize;
		m_rectScroll2.fRight = m_rectClient.fRight;
		m_rectScroll2.fBottom = m_rectClient.fBottom;

		m_fScrollClient = m_rectClient.getHeight() - m_fButtonSize*2;

		m_rectScrollBar.fLeft = m_rectClient.fLeft;
		m_rectScrollBar.fTop = m_rectScroll1.fBottom +
			m_iScrollPos*m_fScrollClient/m_dwScrollMax;
		m_rectScrollBar.fRight = m_rectClient.fRight;
		m_rectScrollBar.fBottom = m_rectScrollBar.fTop + iBarSize;

		INT iWork = m_rectClient.fBottom - m_rectScrollBar.fBottom;
		if(iWork < 0)
		{
			m_rectScrollBar.fTop += iWork;
			m_rectScrollBar.fBottom += iWork;
		}
	}
	else
	{
		m_rectScroll1.fLeft = m_rectClient.fLeft;
		m_rectScroll1.fTop = m_rectClient.fTop;
		m_rectScroll1.fRight = m_rectClient.fLeft + m_fButtonSize;
		m_rectScroll1.fBottom = m_rectClient.fBottom;

		m_rectScroll2.fLeft = m_rectClient.fRight - m_fButtonSize;
		m_rectScroll2.fTop = m_rectClient.fTop;
		m_rectScroll2.fRight = m_rectClient.fRight;
		m_rectScroll2.fBottom = m_rectClient.fBottom;

		m_fScrollClient = m_rectClient.getWidth() - m_fButtonSize*2;

		m_rectScrollBar.fLeft = m_rectScroll1.fRight +
			m_iScrollPos*m_fScrollClient/m_dwScrollMax;
		m_rectScrollBar.fTop = m_rectScroll1.fTop;
		m_rectScrollBar.fRight = m_rectScrollBar.fLeft + iBarSize;
		m_rectScrollBar.fBottom = m_rectScroll1.fBottom;
	
		INT iWork = m_rectClient.fRight - m_rectScrollBar.fRight;
		if(iWork < 0)
		{
			m_rectScrollBar.fLeft += iWork;
			m_rectScrollBar.fRight += iWork;
		}
	}

	AflVertexObject* pPolygon;
	AflMeshBuffer* pButtonVertex1;
	AflMeshBuffer* pButtonVertex2;
	AflMeshBuffer* pBarVertex;


	if(!m_bCreate)
	{
		pPolygon = addPolygon();
		pButtonVertex1 = pPolygon->getAflMeshBuffer();
		pButtonVertex1->createIndexBuffer(wFrameIndex,30);
		pButtonVertex1->createVertexBuffer(20);
	
		pPolygon = addPolygon();
		pButtonVertex2 = pPolygon->getAflMeshBuffer();
		pButtonVertex2->createIndexBuffer(wFrameIndex,30);
		pButtonVertex2->createVertexBuffer(20);

		pPolygon = addPolygon();
		pBarVertex = pPolygon->getAflMeshBuffer();
		pBarVertex->createIndexBuffer(wFrameIndex,30);
		pBarVertex->createVertexBuffer(20);

		m_pButtonVertex1 = pButtonVertex1;
		m_pButtonVertex2 = pButtonVertex2;
		m_pBarVertex1 = pBarVertex;

		m_bCreate = true;
	}
	else
	{
		pButtonVertex1 = m_pButtonVertex1;
		pButtonVertex2 = m_pButtonVertex2;
		pBarVertex = m_pBarVertex1;
	}
	
	AFLVERTEX vertImage[20];
	crateFrameVertex(vertImage,
		m_rectScroll1.fLeft,m_rectScroll1.fTop,
		m_rectScroll1.getWidth(),m_rectScroll1.getHeight(),
		m_dwButtonColor1,m_dwButtonColor2);
	pButtonVertex1->copyVertexBuffer(vertImage,20);

	crateFrameVertex(vertImage,
		m_rectScroll2.fLeft,m_rectScroll2.fTop,
		m_rectScroll2.getWidth(),m_rectScroll2.getHeight(),
		m_dwButtonColor1,m_dwButtonColor2);
	pButtonVertex2->copyVertexBuffer(vertImage,20);

	crateFrameVertex(vertImage,
		m_rectScrollBar.fLeft,m_rectScrollBar.fTop,
		m_rectScrollBar.getWidth(),m_rectScrollBar.getHeight(),
		m_dwBarColor1,m_dwBarColor2);
	pBarVertex->copyVertexBuffer(vertImage,20);

	m_bRedraw = true;	
	return true;
}
Exemplo n.º 6
0
//-----------------------------------------------
bool AflSpriteWnd::createWindow(FLOAT fWidth,FLOAT fHeight)
{
	//最低限の幅を確保
	if(m_dwWindowStyle & AFL_STYLE_SIZE && fWidth < m_fSBWidth*2 + m_fFrameWidth*2)
		fWidth = m_fSBWidth*2 + m_fFrameWidth*2;
	if(m_dwWindowStyle & AFL_STYLE_TITLE && fHeight < m_fSBHeight*2 + m_fTitleHeight + m_fFrameHeight * 4)
		fHeight = m_fSBHeight*2 + m_fTitleHeight + m_fFrameHeight * 4;

	//各サイズの計算
	m_rectWindow.fLeft = 0;
	m_rectWindow.fTop = 0;
	m_rectWindow.fRight = fWidth;
	m_rectWindow.fBottom = fHeight;

	FLOAT fTitleHeight = m_fTitleHeight;
	if(m_dwWindowStyle & AFL_STYLE_TITLE)
	{
		m_rectTitle.fLeft = m_fFrameWidth;
		m_rectTitle.fTop = m_fFrameHeight;
		m_rectTitle.fRight = fWidth - m_fFrameWidth;
		m_rectTitle.fBottom = fTitleHeight - m_fFrameHeight;
	}
	else
	{
		ZeroMemory(&m_rectTitle,sizeof(m_rectTitle));
		fTitleHeight = 0;
	}

	m_rectClient.fLeft = m_fFrameWidth;
	m_rectClient.fTop = fTitleHeight + m_fFrameHeight;
	m_rectClient.fRight = fWidth - m_fFrameWidth;
	m_rectClient.fBottom = fHeight + m_fFrameHeight;

	if(m_dwWindowStyle & AFL_STYLE_SIZE)
	{
		m_rectSize.fLeft = fWidth - m_fSBWidth;
		m_rectSize.fTop = fHeight - m_fSBHeight;
		m_rectSize.fRight = fWidth - m_fFrameWidth;
		m_rectSize.fBottom = fHeight + m_fFrameHeight;
	}
	//スプライトの位置設定
	m_spriteTitle.setPoint(m_rectTitle.fLeft,m_rectTitle.fTop);



	AFLVERTEX vertTitle[20];

	static WORD wFrameIndex[]={0,1,2,1,2,3, 4,5,6,5,6,7, 
					8,9,10,9,10,11, 12,13,14,13,14,15,
					16,17,18,17,18,19};

	AflVertexObject* pPolygon;
	AflMeshBuffer* pTitleVertex;
	AflMeshBuffer* pClientVertex;
	AflMeshBuffer* pSizeVertex;
	
	if(!m_bCreate)
	{
		//タイトル用頂点の確保
		pPolygon = addPolygon();
		pTitleVertex = pPolygon->getAflMeshBuffer();
		pTitleVertex->createIndexBuffer(wFrameIndex,30);
		pTitleVertex->createVertexBuffer(20);
	
		//クライアント用頂点の確保
		pPolygon = addPolygon();
		pClientVertex = pPolygon->getAflMeshBuffer();
		pClientVertex->createIndexBuffer(wFrameIndex,30);
		pClientVertex->createVertexBuffer(20);

		//サイズ変更ボタン用頂点の確保
		pPolygon = m_meshSizeLine.addPolygon();
		pSizeVertex = pPolygon->getAflMeshBuffer();
		pSizeVertex->createIndexBuffer(wFrameIndex,6);
		pSizeVertex->createVertexBuffer(4);

		m_bCreate = true;
		m_pTitleVertex = pTitleVertex;
		m_pClientVertex = pClientVertex;
		m_pSizeVertex = pSizeVertex;
	}
	else
	{
		pTitleVertex = m_pTitleVertex;
		pClientVertex = m_pClientVertex;
		pSizeVertex = m_pSizeVertex;
	}


	//タイトル
	if(m_dwWindowStyle & AFL_STYLE_TITLE)
		crateFrameVertex(vertTitle,0,0,fWidth,fTitleHeight,0xee0000ee,0xee6666ee);
	else
		ZeroMemory(vertTitle,sizeof(vertTitle));
	pTitleVertex->copyVertexBuffer(vertTitle,20);

	//クライアント
	crateFrameVertex(vertTitle,0,fTitleHeight,fWidth,fHeight-fTitleHeight,0xbbeeeeee,0xbbeeeeee);
	pClientVertex->copyVertexBuffer(vertTitle,20);
	

	FLOAT fX1;
	FLOAT fY1;
	FLOAT fSBX = m_fSBWidth;
	FLOAT fSBY = m_fSBHeight;
	fX1 = fWidth - fSBX;
	fY1 = fHeight - fSBY;
	FLOAT fX2 = fWidth - m_fFrameWidth;
	FLOAT fY2 = fHeight- m_fFrameHeight;
	AFLVERTEX vertImage[] =
	{
		{ fX1,-fY1,0, 0,0,-1, 0xffcccccc, 0,0},
		{ fX1,-fY2,0, 0,0,-1, 0xffaaaaaa, 0,0},
		{ fX2,-fY1,0, 0,0,-1, 0xffaaaaaa, 0,0},
		{ fX2,-fY2,0, 0,0,-1, 0xff555555, 0,0},
	};

	if(!(m_dwWindowStyle & AFL_STYLE_TITLE))
		ZeroMemory(vertImage,sizeof(vertImage));
	pSizeVertex->copyVertexBuffer(vertImage,4);
	
	onWindowSize(fWidth,fHeight);
	
	return true;
}
Exemplo n.º 7
0
RayDisplayScene::RayDisplayScene(QObject *parent) :
	QGraphicsScene(parent), mCollisionEnabled(false)
{
	mGraphicsObstacle = addPolygon(mObstacle, QPen(QBrush(Qt::green), 2));
}