//-------------------------------------------------------------------------------------------------------------------- void RDX11RenderHelper::RenderScaler(XMMATRIX& tm) { SetWorldTM(tm); IShaderMgr* pShaderMgr = GLOBAL::ShaderMgr(); IRenderStrategy* pRenderer = GLOBAL::RDevice()->GetRenderStrategy(); pShaderMgr->Begin(SHADER_POS_VS, SHADER_COLOR_PS); CVector4 color = CVector4(0,0,0,1); pShaderMgr->SetShaderConstant( &color, sizeof(color), 9, VERTEX_SHADER); pRenderer->RenderGeometry(&m_BoxX); color = CVector4(0,0,1,0); pShaderMgr->SetShaderConstant( &color, sizeof(color), 9, VERTEX_SHADER); pRenderer->RenderGeometry(&m_BoxY); color = CVector4(0,1,0,0); pShaderMgr->SetShaderConstant( &color, sizeof(color), 9, VERTEX_SHADER); pRenderer->RenderGeometry(&m_BoxZ); color = CVector4(0,0.5f, 0.5f, 0.5f); pShaderMgr->SetShaderConstant( &color, sizeof(color), 9, VERTEX_SHADER); pRenderer->RenderGeometry(&m_BoxCenter); RenderAxis(tm); }
//-------------------------------------------------------------------------------------------------------------------- void RDX11RenderHelper::RenderAxis(XMMATRIX& tm) { SetWorldTM(tm); // Set Line Shader GLOBAL::ShaderMgr()->Begin(SHADER_POS_VS, SHADER_COLOR_PS); CVertexPC v1; v1.vPos = CVector3(0.0f, 0.0f, 0.0f); v1.color = COLOR_RED; m_LineVertices.Add(v1); v1.vPos = CVector3(HELPER_OBJ_SCALE, 0.0f, 0.0f); m_LineVertices.Add(v1); v1.vPos = CVector3(0.0f, 0.0f, 0.0f); v1.color = COLOR_BLUE; m_LineVertices.Add(v1); v1.vPos = CVector3(0.0f, 0.0f, HELPER_OBJ_SCALE); m_LineVertices.Add(v1); v1.vPos = CVector3(0.0f, 0, 0.0f); v1.color = COLOR_GREEN; m_LineVertices.Add(v1); v1.vPos = CVector3(0.0f, HELPER_OBJ_SCALE, 0.0f); m_LineVertices.Add(v1); GLOBAL::RenderStateMgr()->SetDepthStancil(DEPTH_OFF_STENCIL_OFF); DrawLine(); }
//-----------------------------------------------------------------------------// // 외부에서 온 명령들을 이함수에서 처리한다. //-----------------------------------------------------------------------------// void CCharacter::Command( SMsg Msg ) { switch( Msg.type ) { case MSG_KEYDOWN: KeyProc( Msg.lparam, Msg.wparam ); break; case MSG_SETPOS: { Matrix44 mat; Vector3 *pv = (Vector3*)Msg.lparam; mat.SetWorld( *pv ); SetWorldTM( &mat ); } break; case MSG_MOVPOS: { } break; } }
//-------------------------------------------------------------------------------------------------------------------- void RDX11RenderHelper::RenderPlane(XMMATRIX& tm, CVector2 size) { XMMATRIX mtWorld = XMMatrixMultiply( tm, XMMatrixScaling(size.x, size.y, 1) ); SetWorldTM(mtWorld); GLOBAL::ShaderMgr()->Begin(SHADER_QUAD_VS, SHADER_TEXURE_PS); GLOBAL::RenderStateMgr()->SetTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); GLOBAL::RenderStateMgr()->SetVertexInput(FVF_QUAD); GLOBAL::D3DContext()->Draw(4, 0); }
//-------------------------------------------------------------------------------------------------------------------- void RDX11RenderHelper::RenderSphere(CVector3* pos, float radius) { XMMATRIX mtWorld = XMMatrixIdentity(); mtWorld = XMMatrixMultiply( mtWorld, XMMatrixScaling(radius, radius, radius) ); mtWorld.r[3].x = pos->x; mtWorld.r[3].y = pos->y; mtWorld.r[3].z = pos->z; SetWorldTM(mtWorld); GLOBAL::ShaderMgr()->Begin(SHADER_POS_VS, SHADER_COLOR_PS); GLOBAL::RenderStateMgr()->SetRasterizer(RASTERIZER_WIRE); GLOBAL::RDevice()->GetRenderStrategy()->RenderGeometry(&m_Sphere); }
//-------------------------------------------------------------------------------------------------------------------- void RDX11RenderHelper::RenderLine( CVertexPC* pVetex, int count) { SetWorldTM( XMMatrixIdentity() ); CVertexPC v1; v1.color = COLOR_RED; for( int i=0; i < count; ++i) m_LineVertices.Add( pVetex[i]); // Set Line Shader GLOBAL::ShaderMgr()->Begin(SHADER_POS_VS, SHADER_COLOR_PS); CVector4 color = CVector4(0,1,1,1); GLOBAL::ShaderMgr()->SetShaderConstant( &color, sizeof(color), 9, VERTEX_SHADER); GLOBAL::RenderStateMgr()->SetDepthStancil(DEPTH_OFF_STENCIL_OFF); DrawLine(); }
//-------------------------------------------------------------------------------------------------------------------- void RDX11RenderHelper::RenderBox(XMMATRIX& mtWorld, CVector3& min, CVector3& max, DWORD color) { SetWorldTM(mtWorld); BOX_MAKE_PARAM param; param.min = min; param.max = max; param.offset = CVector3(0, 0, 0); CVertexPC* pVertices = NULL; CGEOMETRY_CONSTRUCTOR::CreateBoxLine( param, &pVertices); for (int i =0 ; i< 24; i++) { pVertices[i].color = color; m_LineVertices.Add(pVertices[i]); } SAFE_DELETE_ARRAY(pVertices); GLOBAL::ShaderMgr()->Begin(SHADER_COLOR_VS, SHADER_COLOR_PS); GLOBAL::RenderStateMgr()->SetDepthStancil(DEPTH_ON_STENCIL_OFF); DrawLine(); }
//-------------------------------------------------------------------------------------------------------------------- void RDX11RenderHelper::RenderWorldGrid(XMMATRIX& mtWorld, int size, int lineCount) { RenderPlane(mtWorld, CVector2(100,100)); SetWorldTM(mtWorld); float halfWidth = size/2.f; float lineWidth = size/50.f; CVertexPC v1,v2; for(int i = 0 ; i < lineCount ; i += 2) { v1.vPos.x = halfWidth - i/2 * lineWidth; v2.vPos.x = v1.vPos.x; v1.vPos.z = 0; v2.vPos.z = 0; if( i== 50 ) { v1.vPos.y = 0; v2.vPos.y = -halfWidth; } else { v1.vPos.y = halfWidth; v2.vPos.y = -halfWidth; } v1.color = COLOR_GRAY; v2.color = COLOR_GRAY; m_LineVertices.Add(v1); m_LineVertices.Add(v2); } for(int i = lineCount ; i < lineCount *2 ; i += 2) { v1.vPos.y = halfWidth - ( i - lineCount )/2 * lineWidth; v2.vPos.y = v1.vPos.y; v1.vPos.z = 0; v2.vPos.z = 0; if( i== 150 ) { v1.vPos.x = 0; v2.vPos.x = -halfWidth; } else { v1.vPos.x = halfWidth; v2.vPos.x = -halfWidth; } v1.color = COLOR_GRAY; v2.color = COLOR_GRAY; m_LineVertices.Add(v1); m_LineVertices.Add(v2); } v1.vPos = CVector3(0.0f, 0.0f, 0.0f); v1.color = COLOR_RED; m_LineVertices.Add(v1); v1.vPos = CVector3(halfWidth, 0.0f, 0.0f); v1.color = COLOR_RED; m_LineVertices.Add(v1); v1.vPos = CVector3(0.0f, 0.0f, 0.0f); v1.color = COLOR_BLUE; m_LineVertices.Add(v1); v1.vPos = CVector3(0.0f, 0.0f, halfWidth); v1.color = COLOR_BLUE; m_LineVertices.Add(v1); v1.vPos = CVector3(0.0f, 0, 0.0f); v1.color = COLOR_GREEN; m_LineVertices.Add(v1); v1.vPos = CVector3(0.0f, halfWidth, 0.0f); v1.color = COLOR_GREEN; m_LineVertices.Add(v1); GLOBAL::ShaderMgr()->Begin(SHADER_COLOR_VS, SHADER_COLOR_PS); DrawLine(); }
//-------------------------------------------------------------------------------------------------------------------- void RDX11RenderHelper::RenderRotator(XMMATRIX& tm) { SetWorldTM(tm); GLOBAL::ShaderMgr()->Begin(SHADER_COLOR_VS, SHADER_COLOR_PS); GLOBAL::RenderStateMgr()->SetDepthStancil(DEPTH_OFF_STENCIL_OFF); CVertexPC v1; for( int iRing = 0; iRing < 2; ++iRing ) { float radius = HELPER_OBJ_SCALE + iRing * 2.f; UINT segment = 20; v1.vPos.x = 0.0f; v1.color = COLOR_RED; for( UINT i= 0; i < segment ; ++i) { float angle = XM_2PI * i/float(segment); v1.vPos.y = radius * cos( angle); v1.vPos.z = radius * sin( angle); m_LineVertices.Add(v1); angle = XM_2PI * (i +1)/float(segment); v1.vPos.y = radius * cos( angle); v1.vPos.z = radius * sin( angle); m_LineVertices.Add(v1); } DrawLine(); v1.vPos.y = 0.0f; v1.color = COLOR_GREEN; for( UINT i= 0; i < segment ; ++i) { float angle = XM_2PI * i/float(segment); v1.vPos.z = radius * cos( angle); v1.vPos.x = radius * sin( angle); m_LineVertices.Add(v1); angle = XM_2PI * (i +1)/float(segment); v1.vPos.z = radius * cos( angle); v1.vPos.x = radius * sin( angle); m_LineVertices.Add(v1); } DrawLine(); v1.vPos.z = 0.0f; v1.color = COLOR_BLUE; for( UINT i= 0; i < segment ; ++i) { float angle = XM_2PI * i/float(segment); v1.vPos.x = radius * cos( angle); v1.vPos.y = radius * sin( angle); m_LineVertices.Add(v1); angle = XM_2PI * (i +1)/float(segment); v1.vPos.x = radius * cos( angle); v1.vPos.y = radius * sin( angle); m_LineVertices.Add(v1); } DrawLine(); } RenderAxis(tm); }