void CEditCameraWnd::OnSaveAsSceneInitClicked(wxCommandEvent& /*event*/) { CScene* pCurScene = CSceneManager::GetInstance()->GetCurrentScene(); if (pCurScene != NULL) { pCurScene->SetInitCameraPos(CVec3((float)m_pPosX->GetValue().GetDouble(), (float)m_pPosY->GetValue().GetDouble(), (float)m_pPosZ->GetValue().GetDouble())); UPDATE_PROXY_PROPERTY_BY_NAME(pCurScene, pCurScene->GetInitCameraPos(), "m_cameraInitPos"); pCurScene->SetInitCameraRotation(CVec3((float)m_pRotationX->GetValue().GetDouble(), (float)m_pRotationY->GetValue().GetDouble(), (float)m_pRotationZ->GetValue().GetDouble())); UPDATE_PROXY_PROPERTY_BY_NAME(pCurScene, pCurScene->GetInitCameraRotation(), "m_cameraInitRotation"); pCurScene->SetInitCameraNear((float)m_pClipNear->GetValue().GetDouble()); UPDATE_PROXY_PROPERTY_BY_NAME(pCurScene, pCurScene->GetInitCameraNear(), "m_fCameraInitNear"); pCurScene->SetInitCameraFar((float)m_pClipFar->GetValue().GetDouble()); UPDATE_PROXY_PROPERTY_BY_NAME(pCurScene, pCurScene->GetInitCameraFar(), "m_fCameraInitFar"); pCurScene->SetInitCameraFov((float)m_pFov->GetValue().GetDouble()); UPDATE_PROXY_PROPERTY_BY_NAME(pCurScene, pCurScene->GetInitCameraFov(), "m_fCameraInitFov"); CEditorMainFrame* pMainFrame = static_cast<CEngineEditor*>(wxApp::GetInstance())->GetMainFrame(); CComponentProxy* pProxy = pCurScene->GetProxyComponent(); BEATS_ASSERT(pProxy != NULL, _T("Can't find the proxy of Scene!")); if (pMainFrame->GetSelectedComponent() == pProxy) { //Refresh the current showing property grid. pMainFrame->SelectComponent(pProxy); } } }
CBSPTree::CBSPTree( CModel *model ): _root(0){ for( int i=0;i<model->Surfaces().size();++i ){ CModelSurface *surf=(CModelSurface*)model->Surfaces()[i]->Copy(); cout<<"Adding surface, verts="<<surf->Vertices().size()<<", tris="<<surf->Triangles().size()<<endl; _surfaces.push_back( surf ); } vector<CPolygon*> polys; for( int i=0;i<_surfaces.size();++i ){ CModelSurface *surf=_surfaces[i]; vector<int> verts(3); for( vector<CTriangle>::const_iterator it=surf->Triangles().begin();it!=surf->Triangles().end();++it ){ const CTriangle &tri=*it; verts[0]=tri.vertices[0]; verts[1]=tri.vertices[1]; verts[2]=tri.vertices[2]; CPolygon *poly=new CPolygon( surf,verts ); polys.push_back( new CPolygon( surf,verts ) ); } } if( !polys.size() ){ _root=new CBSPNode( CPlane( CVec3(0,1,0),0 ) ); return; } _root=new CBSPNode( polys[0]->Plane() ); for( int i=1;i<polys.size();++i ){ _root->InsertPlane( polys[i] ); } for( int i=0;i<polys.size();++i ){ _root->InsertLeaf( polys[i] ); } for( int i=0;i<polys.size();++i ){ // _root->InsertPolygon( polys[i] ); } CPlane plane( CVec3(0,1,0),-5 ); // _root=new CBSPNode( plane,new CBSPNode( 1 ),0 ); _hpSurface=new CModelSurface; CPolygon *poly=new CPolygon( _hpSurface,plane,CBox( CVec3(-50),CVec3(50) ) ); CBSPNode *bits[2]; _root->Split( poly,bits ); _root=new CBSPNode( plane,bits[0],0 ); for( int i=0;i<polys.size();++i ){ _root->InsertPolygon( polys[i] ); } }
void CTextBox::UpdateCur() { m_quadCur.tl = m_quadp.tl + CVec3( m_fXBorderWidth + m_fCurXoffset, m_fYBorderWidth, 0.0f); m_quadCur.bl = m_quadp.bl + CVec3( m_fXBorderWidth + m_fCurXoffset, m_vecRealSize.y - m_fYBorderWidth, 0.0f); m_quadCur.tr = m_quadCur.tl; m_quadCur.tr.x += 1.0f; m_quadCur.br = m_quadCur.bl; m_quadCur.br.x += 1.0f; }
void CShapeModule::InitParticleForEdge(CVec3& localPos, CVec3& direction, float fParticleScale) const { float fRadius = fParticleScale * m_fRadius; localPos = CVec3(PARTICLE_RAND_RANGE(-fRadius, fRadius), 0, 0); direction = CVec3(0, 1, 0); if (m_bRandomDirection) { direction = GetRandomDirection(); } }
void CControl::UpdateQuadP() { const CVec2& realSize = GetRealSize(); CVec2 anchorPos = GetAnchor() * realSize; //set vertex m_quadp.tl = CVec3(-anchorPos); m_quadp.br = CVec3(realSize - anchorPos); m_quadp.tr.x = m_quadp.br.x; m_quadp.tr.y = m_quadp.tl.y; m_quadp.bl.x = m_quadp.tl.x; m_quadp.bl.y = m_quadp.br.y; }
CSurface *CMirror::Surface(){ if( _dirty & DIRTY_SURFACE ){ CVertex v0,v1,v2,v3; v0.position=CVec3( -_width/2,_height/2,0 ); v0.normal=CVec3(0,0,-1); v0.texcoords[0]=CVec2( 1,1 ); v1.position=CVec3( _width/2,_height/2,0 ); v1.normal=CVec3(0,0,-1); v1.texcoords[0]=CVec2( 0,1 ); v2.position=CVec3( _width/2,-_height/2,0 ); v2.normal=CVec3(0,0,-1); v2.texcoords[0]=CVec2( 0,0 ); v3.position=CVec3( -_width/2,-_height/2,0 ); v3.normal=CVec3(0,0,-1); v3.texcoords[0]=CVec2( 1,0 ); _surface->Clear(); _surface->AddVertex( v0 ); _surface->AddVertex( v1 ); _surface->AddVertex( v2 ); _surface->AddVertex( v3 ); _surface->AddTriangle( 0,1,2 ); _surface->AddTriangle( 0,2,3 ); _dirty&=~DIRTY_SURFACE; } return _surface; }
void CShapeRenderer::DrawCircle(const CMat4& mat, float fRadius, CColor color, bool bSolid, float fRate) const { static const float fStepRadians = DegreesToRadians(15); if (bSolid) { std::vector<CVertexPC> vertexData; std::vector<unsigned short> indicesData; CVertexPC point; point.position = CVec3(mat[12], mat[13], mat[14]); point.color = color; vertexData.push_back(point); for (float fRadian = 0; fRadian <= MATH_PI_DOUBLE * fRate; fRadian += fStepRadians) { CVec3 pos(fRadius * sinf(fRadian), 0, fRadius * cosf(fRadian)); pos *= mat; point.position = pos; vertexData.push_back(point); if (vertexData.size() >= 3) { unsigned short index = (unsigned short)vertexData.size(); indicesData.push_back(0); indicesData.push_back(index - 2); indicesData.push_back(index - 1); } } CRenderManager::GetInstance()->RenderTriangle(vertexData, indicesData, true); } else { CVertexPC startPos; CVertexPC endPos; startPos.color = color; endPos.color = color; startPos.position = CVec3(0, 0, fRadius); startPos.position *= mat; float fEndRadian = MATH_PI_DOUBLE * fRate; for (float fRadian = fStepRadians; fRadian <= fEndRadian; fRadian += fStepRadians) { endPos.position = CVec3(fRadius * sinf(fRadian), 0, fRadius * cosf(fRadian)); endPos.position *= mat; CRenderManager::GetInstance()->RenderLine(startPos, endPos, 1.0f, true); startPos.position = endPos.position; } //Close the circle to avoid the error condition. endPos.position = CVec3(fRadius * sinf(fEndRadian), 0, fRadius * cosf(fEndRadian)); endPos.position *= mat; CRenderManager::GetInstance()->RenderLine(startPos, endPos, 1.0f, true); } }
CVec3 CVec3::operator*(const CVec3 &other) const { return CVec3( _x * other._x, _y * other._y, _z * other._z); }
CVec3 CVec3::operator/(float scalar) const { return CVec3( _x / scalar, _y / scalar, _z / scalar); }
CVec3 CVec3::cross(const CVec3 &other) const { return CVec3( (_y * other._z) - (_z * other._y), (_z * other._x) - (_x * other._z), (_x * other._y) - (_y * other._x)); }
CVec3 CVec3::operator*(float scalar) const { return CVec3( _x * scalar, _y * scalar, _z * scalar); }
CVec3 CVec3::operator/(const CVec3 &other) const { return CVec3( _x / other._x, _y / other._y, _z / other._z); }
CVec3 CVec3::operator-(const CVec3 &other) const { return CVec3( _x - other._x, _y - other._y, _z - other._z); }
CVec3 CVec3::operator+(const CVec3 &other) const { return CVec3( _x + other._x, _y + other._y, _z + other._z); }
//Forwared here from CMirrorSurface void CMirror::OnRenderScene( CCamera *camera ){ _surface->Instances().clear(); //No recursion yet... if( camera==_camera ) return; //frustum clipping. //Note: CModelSurface still clips itself - add enable/disable clipping for CModelSurface CBox bounds=RenderMatrix() * CBox( CVec3( -_width/2,-_height/2,0 ),CVec3( _width/2,_height/2,0 ) ); if( !camera->RenderFrustum().Intersects( bounds ) ) return; const CMat4 &mir=RenderMatrix(); const CMat4 &cam=camera->RenderMatrix(); //put eye into mirror space CVec3 eye=-mir * cam.t.xyz(); if( eye.z>0 ) return; //reflect eye.z=-eye.z; //projection matrix float znear=eye.z; float zfar=256.0f; float left=(-_width/2-eye.x),right=left+_width; float bottom=(-_height/2+eye.y),top=bottom+_height; CMat4 proj=CMat4::FrustumMatrix( left,right,bottom,top,znear,zfar ); //camera matrix CMat4 mat; mat.i.x=-1; mat.k.z=-1; mat.t.xyz()=eye; mat=mir * mat; _camera->SetWorldMatrix( mat ); _camera->SetProjectionMatrix( proj ); CTexture *cb=App.Graphics()->ColorBuffer( 0 ); App.Graphics()->SetColorBuffer( 0,Texture() ); App.Scene()->RenderCamera( _camera ); App.Graphics()->SetColorBuffer( 0,cb ); _surface->Instances().push_back( mir ); }
void CEditCameraWnd::OnPropertyChanged(wxPropertyGridEvent &event) { wxPGProperty* pChangedProperty = event.GetProperty(); CEditorMainFrame* pMainFrame = static_cast<CEngineEditor*>(wxApp::GetInstance())->GetMainFrame(); CBeyondEngineEditorGLWindow* pSceneWnd = pMainFrame->GetSceneWindow(); CCamera* pCurCamera = pSceneWnd->GetCamera(); if (pCurCamera != NULL) { if (pChangedProperty == m_pSpeed) { pCurCamera->m_fMoveSpeed = (float)m_pSpeed->GetValue().GetDouble(); } else if (pChangedProperty == m_pShiftMoveSpeedRate) { pCurCamera->m_fShiftMoveSpeedRate = (float)m_pShiftMoveSpeedRate->GetValue().GetDouble(); } else if (pChangedProperty == m_pPosX || pChangedProperty == m_pPosY || pChangedProperty == m_pPosZ) { pCurCamera->SetViewPos(CVec3((float)m_pPosX->GetValue().GetDouble(), (float)m_pPosY->GetValue().GetDouble(), (float)m_pPosZ->GetValue().GetDouble())); } else if (pChangedProperty == m_pRotationX || pChangedProperty == m_pRotationY || pChangedProperty == m_pRotationZ) { pCurCamera->SetRotation(CVec3((float)m_pRotationX->GetValue().GetDouble(), (float)m_pRotationY->GetValue().GetDouble(), (float)m_pRotationZ->GetValue().GetDouble())); } else if (pChangedProperty == m_pFov) { pCurCamera->SetFOV((float)m_pFov->GetValue().GetDouble()); } else if (pChangedProperty == m_pClipNear) { pCurCamera->SetNear((float)m_pClipNear->GetValue().GetDouble()); } else if (pChangedProperty == m_pClipFar) { pCurCamera->SetFar((float)m_pClipFar->GetValue().GetDouble()); } } }
void CShapeModule::InitParticleForCircle(CVec3& localPos, CVec3& direction, float fParticleScale) const { direction = CVec3(1, 0, 0); CQuaternion quat; quat.FromPitchYawRoll(0, 0, PARTICLE_RAND_RANGE(0, DegreesToRadians(m_fArcForCircle))); direction *= quat; float fRadius = m_fRadius * fParticleScale; localPos = direction * (m_bEmitFromShell ? fRadius : PARTICLE_RAND_RANGE(0, fRadius)); if (m_bRandomDirection) { direction = GetRandomDirection(); } }
void CShapeModule::InitParticleForBox(CVec3& localPos, CVec3& direction, float fParticleScale) const { CVec3 halfSize = m_boxSize * 0.5f * fParticleScale; localPos.Fill(RANGR_RANDOM_FLOAT(-halfSize.X(), halfSize.X()), RANGR_RANDOM_FLOAT(-halfSize.Y(), halfSize.Y()), RANGR_RANDOM_FLOAT(-halfSize.Z(), halfSize.Z())); direction = CVec3(0, 0, 1); if (m_bRandomDirection) { direction = GetRandomDirection(); } }
void CShapeRenderer::DrawBox(const CMat4& mat, float fX, float fY, float fZ, CColor color, bool bSolid) { if (!bSolid) { CVertexPC top[4]; CVertexPC buttom[4]; float fHalfX = fX * 0.5f; float fHalfZ = fZ * 0.5f; top[0].position = CVec3(-fHalfX, fY, -fHalfZ) * mat; top[0].color = color; top[1].position = CVec3(fHalfX, fY, -fHalfZ) * mat; top[1].color = color; top[2].position = CVec3(fHalfX, fY, fHalfZ) * mat; top[2].color = color; top[3].position = CVec3(-fHalfX, fY, fHalfZ) * mat; top[3].color = color; CRenderManager::GetInstance()->RenderLine(top[0], top[1], 1.0f, true); CRenderManager::GetInstance()->RenderLine(top[1], top[2], 1.0f, true); CRenderManager::GetInstance()->RenderLine(top[2], top[3], 1.0f, true); CRenderManager::GetInstance()->RenderLine(top[3], top[0], 1.0f, true); buttom[0].position = CVec3(-fHalfX, 0, -fHalfZ) * mat; buttom[0].color = color; buttom[1].position = CVec3(fHalfX, 0, -fHalfZ) * mat; buttom[1].color = color; buttom[2].position = CVec3(fHalfX, 0, fHalfZ) * mat; buttom[2].color = color; buttom[3].position = CVec3(-fHalfX, 0, fHalfZ) * mat; buttom[3].color = color; CRenderManager::GetInstance()->RenderLine(buttom[0], buttom[1], 1.0f, true); CRenderManager::GetInstance()->RenderLine(buttom[1], buttom[2], 1.0f, true); CRenderManager::GetInstance()->RenderLine(buttom[2], buttom[3], 1.0f, true); CRenderManager::GetInstance()->RenderLine(buttom[3], buttom[0], 1.0f, true); CRenderManager::GetInstance()->RenderLine(top[0], buttom[0], 1.0f, true); CRenderManager::GetInstance()->RenderLine(top[1], buttom[1], 1.0f, true); CRenderManager::GetInstance()->RenderLine(top[2], buttom[2], 1.0f, true); CRenderManager::GetInstance()->RenderLine(top[3], buttom[3], 1.0f, true); } }
void CShapeModule::Render(CParticleEmitter* pEmitter) { BEATS_ASSERT(pEmitter != nullptr); const CMat4& emitterMat = pEmitter->GetWorldTM(); switch (m_emitShapeType) { case EEmitShapeType::eEST_Sphere: case EEmitShapeType::eEST_HemiSphere: { CMat4 emitterSphereMat; emitterSphereMat.FromPitchYawRoll(DegreesToRadians(90), 0, 0); emitterSphereMat = emitterMat * emitterSphereMat; bool bHemiSphere = m_emitShapeType == EEmitShapeType::eEST_HemiSphere; float fRate = bHemiSphere ? 0.5f : 1.0f; CShapeRenderer::GetInstance()->DrawCircle(emitterSphereMat, m_fRadius, 0x00FF00FF, false, 1.0f); CMat4 mat; mat.FromPitchYawRoll(0, MATH_PI_HALF, MATH_PI_HALF); mat = emitterSphereMat * mat; CShapeRenderer::GetInstance()->DrawCircle(mat, m_fRadius, 0xFF0000FF, false, fRate); mat.FromPitchYawRoll(MATH_PI, 0, -MATH_PI_HALF); mat = emitterSphereMat * mat; CShapeRenderer::GetInstance()->DrawCircle(mat, m_fRadius, 0x0000FFFF, false, fRate); } break; case EEmitShapeType::eEST_Cone: { CMat4 emitterConeMat; emitterConeMat.FromPitchYawRoll(DegreesToRadians(90), 0, 0); emitterConeMat = emitterMat * emitterConeMat; float fTopRadius = m_fRadius + m_fConeLength * tanf(DegreesToRadians(m_fAngle)); CShapeRenderer::GetInstance()->DrawCone(emitterConeMat, m_fRadius, fTopRadius, m_fConeLength, 0x0000FFFF, 0x00FF00FF, 0xFF0000FF, false); } break; case EEmitShapeType::eEST_Box: CShapeRenderer::GetInstance()->DrawBox(emitterMat, m_boxSize.X(), m_boxSize.Y(), m_boxSize.Z(), 0xFF0000FF, false); break; case EEmitShapeType::eEST_Mesh: break; case EEmitShapeType::eEST_Circle: { CVertexPC startPos, endPos; startPos.color = 0xFFFF00FF; endPos.color = 0xFFFF00FF; startPos.position = pEmitter->GetWorldTM().GetTranslate(); endPos.position = CVec3(0, 0, m_fRadius) * pEmitter->GetWorldTM(); CRenderManager::GetInstance()->RenderLine(startPos, endPos, 1.0f); CQuaternion quat; quat.FromPitchYawRoll(0, DegreesToRadians(m_fArcForCircle), 0); endPos.position = (CVec3(0, 0, m_fRadius) * quat) * pEmitter->GetWorldTM(); CRenderManager::GetInstance()->RenderLine(startPos, endPos, 1.0f); CMat4 emitterConeMat; emitterConeMat.FromPitchYawRoll(DegreesToRadians(90), 0, 0); emitterConeMat = emitterMat * emitterConeMat; CShapeRenderer::GetInstance()->DrawCircle(emitterConeMat, m_fRadius, 0xFFFF00FF, false, m_fArcForCircle / 360.f); } break; case EEmitShapeType::eEST_Edge: { CVertexPC startPos, endPos; CVec3 rightDir = emitterMat.GetRightVec3(); startPos.position = rightDir * m_fRadius; startPos.color = 0xFFFF00FF; endPos.position = rightDir * -m_fRadius; endPos.color = 0xFFFF00FF; CRenderManager::GetInstance()->RenderLine(startPos, endPos, 3.0f); } break; default: BEATS_ASSERT(false, "Never reach here!"); break; } }
void CShapeRenderer::DrawAABB(const CAABBBox& aabb, CColor color) { CVec3 tmin = aabb.m_minPos; CVec3 tmax = aabb.m_maxPos; CVec3 sub = tmax - tmin; CVertexPC startPos, endPos; startPos.color = color; endPos.color = color; startPos.position = tmin; endPos.position = CVec3(tmin.X(), tmin.Y(), tmin.Z() + sub.Z() * 0.2F);// Min CRenderManager::GetInstance()->RenderLine(startPos, endPos, 1.0f, true); endPos.position = CVec3(tmin.X(), tmin.Y() + sub.Y() * 0.2F, tmin.Z()); CRenderManager::GetInstance()->RenderLine(startPos, endPos, 1.0f, true); endPos.position = CVec3(tmin.X() + sub.X() * 0.2F, tmin.Y(), tmin.Z()); CRenderManager::GetInstance()->RenderLine(startPos, endPos, 1.0f, true); startPos.position = tmax; endPos.position = CVec3(tmax.X(), tmax.Y(), tmax.Z() - sub.Z() * 0.2F);// Max CRenderManager::GetInstance()->RenderLine(startPos, endPos, 1.0f, true); endPos.position = CVec3(tmax.X(), tmax.Y() - sub.Y() * 0.2F, tmax.Z()); CRenderManager::GetInstance()->RenderLine(startPos, endPos, 1.0f, true); endPos.position = CVec3(tmax.X() - sub.X() * 0.2F, tmax.Y(), tmax.Z()); CRenderManager::GetInstance()->RenderLine(startPos, endPos, 1.0f, true); startPos.position = CVec3(tmin.X(), tmin.Y(), tmax.Z());// x min, y min, z max endPos.position = CVec3(tmin.X(), tmin.Y(), tmax.Z() - sub.Z() * 0.2F); CRenderManager::GetInstance()->RenderLine(startPos, endPos, 1.0f, true); endPos.position = CVec3(tmin.X(), tmin.Y() + sub.Y() * 0.2F, tmax.Z()); CRenderManager::GetInstance()->RenderLine(startPos, endPos, 1.0f, true); endPos.position = CVec3(tmin.X() + sub.X() * 0.2F, tmin.Y(), tmax.Z()); CRenderManager::GetInstance()->RenderLine(startPos, endPos, 1.0f, true); startPos.position = CVec3(tmin.X(), tmax.Y(), tmin.Z());// x min, y max, z min endPos.position = CVec3(tmin.X(), tmax.Y(), tmin.Z() + sub.Z() * 0.2F); CRenderManager::GetInstance()->RenderLine(startPos, endPos, 1.0f, true); endPos.position = CVec3(tmin.X(), tmax.Y() - sub.Y() * 0.2F, tmin.Z()); CRenderManager::GetInstance()->RenderLine(startPos, endPos, 1.0f, true); endPos.position = CVec3(tmin.X() + sub.X() * 0.2F, tmax.Y(), tmin.Z()); CRenderManager::GetInstance()->RenderLine(startPos, endPos, 1.0f, true); startPos.position = CVec3(tmax.X(), tmin.Y(), tmin.Z());// x max, y min, z min endPos.position = CVec3(tmax.X(), tmin.Y(), tmin.Z() + sub.Z() * 0.2F); CRenderManager::GetInstance()->RenderLine(startPos, endPos, 1.0f, true); endPos.position = CVec3(tmax.X(), tmin.Y() + sub.Y() * 0.2F, tmin.Z()); CRenderManager::GetInstance()->RenderLine(startPos, endPos, 1.0f, true); endPos.position = CVec3(tmax.X() - sub.X() * 0.2F, tmin.Y(), tmin.Z()); CRenderManager::GetInstance()->RenderLine(startPos, endPos, 1.0f, true); startPos.position = CVec3(tmin.X(), tmax.Y(), tmax.Z());// x min, y max, z max endPos.position = CVec3(tmin.X(), tmax.Y(), tmax.Z() - sub.Z() * 0.2F); CRenderManager::GetInstance()->RenderLine(startPos, endPos, 1.0f, true); endPos.position = CVec3(tmin.X(), tmax.Y() - sub.Y() * 0.2F, tmax.Z()); CRenderManager::GetInstance()->RenderLine(startPos, endPos, 1.0f, true); endPos.position = CVec3(tmin.X() + sub.X() * 0.2F, tmax.Y(), tmax.Z()); CRenderManager::GetInstance()->RenderLine(startPos, endPos, 1.0f, true); startPos.position = CVec3(tmax.X(), tmax.Y(), tmin.Z());// x min, y max, z max endPos.position = CVec3(tmax.X(), tmax.Y(), tmin.Z() + sub.Z() * 0.2F); CRenderManager::GetInstance()->RenderLine(startPos, endPos, 1.0f, true); endPos.position = CVec3(tmax.X(), tmax.Y() - sub.Y() * 0.2F, tmin.Z()); CRenderManager::GetInstance()->RenderLine(startPos, endPos, 1.0f, true); endPos.position = CVec3(tmax.X() - sub.X() * 0.2F, tmax.Y(), tmin.Z()); CRenderManager::GetInstance()->RenderLine(startPos, endPos, 1.0f, true); startPos.position = CVec3(tmax.X(), tmin.Y(), tmax.Z());// x max, y min, z max endPos.position = CVec3(tmax.X(), tmin.Y(), tmax.Z() - sub.Z() * 0.2F); CRenderManager::GetInstance()->RenderLine(startPos, endPos, 1.0f, true); endPos.position = CVec3(tmax.X(), tmin.Y() + sub.Y() * 0.2F, tmax.Z()); CRenderManager::GetInstance()->RenderLine(startPos, endPos, 1.0f, true); endPos.position = CVec3(tmax.X() - sub.X() * 0.2F, tmin.Y(), tmax.Z()); CRenderManager::GetInstance()->RenderLine(startPos, endPos, 1.0f, true); }
void CShapeRenderer::DrawCone(const CMat4& mat, float fButtomRadius, float fTopRadius, float fHeight, CColor coneColor, CColor bottomColor, CColor topColor, bool bSolid) const { DrawCircle(mat, fButtomRadius, bottomColor, bSolid); CMat4 translateMat; translateMat.SetTranslate(CVec3(0, fHeight, 0)); CMat4 topMat = mat * translateMat; DrawCircle(topMat, fTopRadius, topColor, bSolid); if (bSolid) { CVec3 center(mat[12], mat[13], mat[14]); CVec3 upDirection = mat.GetUpVec3(); upDirection = upDirection * fHeight; CVec3 topCenter = center + upDirection; CVertexPC point; point.position = topCenter; point.color = coneColor; std::vector<unsigned short> indicesData; std::vector<CVertexPC> vertexData; vertexData.push_back(point); static const float fStepRadians = DegreesToRadians(15); for (float fRadian = 0; fRadian <= MATH_PI_DOUBLE; fRadian += fStepRadians) { CVec3 pos(fButtomRadius * sinf(fRadian), 0, fButtomRadius * cosf(fRadian)); pos *= mat; point.position = pos; vertexData.push_back(point); if (vertexData.size() >= 3) { unsigned short index = (unsigned short)vertexData.size(); indicesData.push_back(0); indicesData.push_back(index - 2); indicesData.push_back(index - 1); } } CRenderManager::GetInstance()->RenderTriangle(vertexData, indicesData, true); } else { CVertexPC startPos, endPos; startPos.color = coneColor; endPos.color = coneColor; CVec3 topPoint(fTopRadius, fHeight, 0); CVec3 buttomPoint(fButtomRadius, 0, 0); startPos.position = topPoint * mat; endPos.position = buttomPoint * mat; CRenderManager::GetInstance()->RenderLine(startPos, endPos, 1.0f, true); topPoint.X() *= -1; buttomPoint.X() *= -1; startPos.position = topPoint * mat; endPos.position = buttomPoint * mat; CRenderManager::GetInstance()->RenderLine(startPos, endPos, 1.0f, true); topPoint = CVec3(0, fHeight, fTopRadius); buttomPoint = CVec3(0, 0, fButtomRadius); startPos.position = topPoint * mat; endPos.position = buttomPoint * mat; CRenderManager::GetInstance()->RenderLine(startPos, endPos, 1.0f, true); topPoint.Z() *= -1; buttomPoint.Z() *= -1; startPos.position = topPoint * mat; endPos.position = buttomPoint * mat; CRenderManager::GetInstance()->RenderLine(startPos, endPos, 1.0f, true); } }
static CVec3 ccolor( const aiColor4D &color ){ return CVec3( color.r,color.g,color.b ); }
CVec3 CVec3::operator--() { return CVec3(-_xyz[0], -_xyz[1], -_xyz[2]); }
CVec3 CVec3::getNormal() const { return CVec3(*this) /= this->length(); }