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; }
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; }
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; }
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; }
//----------------------------------------------- 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; }
//----------------------------------------------- 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; }
RayDisplayScene::RayDisplayScene(QObject *parent) : QGraphicsScene(parent), mCollisionEnabled(false) { mGraphicsObstacle = addPolygon(mObstacle, QPen(QBrush(Qt::green), 2)); }