@@ -32,6 +32,8 @@ using namespace std;
3232vector<Vector2D> CRenderingContext::s_avecTexCoord;
3333vector<vector<Vector2D> > CRenderingContext::s_aavecTexCoords;
3434vector<Vector> CRenderingContext::s_avecNormals;
35+ vector<Vector> CRenderingContext::s_avecTangents;
36+ vector<Vector> CRenderingContext::s_avecBitangents;
3537vector<Vector> CRenderingContext::s_avecVertices;
3638
3739vector<CRenderingContext::CRenderContext> CRenderingContext::s_aContexts;
@@ -558,6 +560,7 @@ void CRenderingContext::BeginRenderTris()
558560
559561 m_bTexCoord = false ;
560562 m_bNormal = false ;
563+ m_bTangents = false ;
561564
562565 m_iDrawMode = GL_TRIANGLES;
563566}
@@ -572,6 +575,7 @@ void CRenderingContext::BeginRenderTriFan()
572575
573576 m_bTexCoord = false ;
574577 m_bNormal = false ;
578+ m_bTangents = false ;
575579
576580 m_iDrawMode = GL_TRIANGLE_FAN;
577581}
@@ -586,6 +590,7 @@ void CRenderingContext::BeginRenderTriStrip()
586590
587591 m_bTexCoord = false ;
588592 m_bNormal = false ;
593+ m_bTangents = false ;
589594
590595 m_iDrawMode = GL_TRIANGLE_STRIP;
591596}
@@ -600,6 +605,7 @@ void CRenderingContext::BeginRenderLines()
600605
601606 m_bTexCoord = false ;
602607 m_bNormal = false ;
608+ m_bTangents = false ;
603609
604610 m_iDrawMode = GL_LINES;
605611}
@@ -614,6 +620,7 @@ void CRenderingContext::BeginRenderLineLoop()
614620
615621 m_bTexCoord = false ;
616622 m_bNormal = false ;
623+ m_bTangents = false ;
617624
618625 m_iDrawMode = GL_LINE_LOOP;
619626}
@@ -628,6 +635,7 @@ void CRenderingContext::BeginRenderLineStrip()
628635
629636 m_bTexCoord = false ;
630637 m_bNormal = false ;
638+ m_bTangents = false ;
631639
632640 m_iDrawMode = GL_LINE_STRIP;
633641}
@@ -647,6 +655,7 @@ void CRenderingContext::BeginRenderPoints(float flSize)
647655
648656 m_bTexCoord = false ;
649657 m_bNormal = false ;
658+ m_bTangents = false ;
650659
651660 glPointSize ( flSize );
652661 m_iDrawMode = GL_POINTS;
@@ -685,6 +694,20 @@ void CRenderingContext::Normal(const Vector& v)
685694 m_bNormal = true ;
686695}
687696
697+ void CRenderingContext::Tangent (const Vector& v)
698+ {
699+ TAssert (m_bNormal);
700+ m_vecTangent = v;
701+ m_bTangents = true ;
702+ }
703+
704+ void CRenderingContext::Bitangent (const Vector& v)
705+ {
706+ TAssert (m_bNormal);
707+ m_vecBitangent = v;
708+ m_bTangents = true ;
709+ }
710+
688711void CRenderingContext::Vertex (const Vector& v)
689712{
690713 if (m_bTexCoord)
@@ -699,6 +722,12 @@ void CRenderingContext::Vertex(const Vector& v)
699722 if (m_bNormal)
700723 s_avecNormals.push_back (m_vecNormal);
701724
725+ if (m_bTangents)
726+ {
727+ s_avecTangents.push_back (m_vecTangent);
728+ s_avecBitangents.push_back (m_vecBitangent);
729+ }
730+
702731 s_avecVertices.push_back (v);
703732}
704733
@@ -742,6 +771,15 @@ void CRenderingContext::EndRender()
742771 glVertexAttribPointer (m_pShader->m_iNormalAttribute , 3 , GL_FLOAT, false , 0 , s_avecNormals.data ());
743772 }
744773
774+ if (m_bTangents && m_pShader->m_iTangentAttribute != ~0 && m_pShader->m_iBitangentAttribute != ~0 )
775+ {
776+ glEnableVertexAttribArray (m_pShader->m_iTangentAttribute );
777+ glVertexAttribPointer (m_pShader->m_iTangentAttribute , 3 , GL_FLOAT, false , 0 , s_avecTangents.data ());
778+
779+ glEnableVertexAttribArray (m_pShader->m_iBitangentAttribute );
780+ glVertexAttribPointer (m_pShader->m_iBitangentAttribute , 3 , GL_FLOAT, false , 0 , s_avecBitangents.data ());
781+ }
782+
745783 glEnableVertexAttribArray (m_pShader->m_iPositionAttribute );
746784 glVertexAttribPointer (m_pShader->m_iPositionAttribute , 3 , GL_FLOAT, false , 0 , s_avecVertices.data ());
747785
@@ -755,6 +793,10 @@ void CRenderingContext::EndRender()
755793 }
756794 if (m_pShader->m_iNormalAttribute != ~0 )
757795 glDisableVertexAttribArray (m_pShader->m_iNormalAttribute );
796+ if (m_pShader->m_iTangentAttribute != ~0 )
797+ glDisableVertexAttribArray (m_pShader->m_iTangentAttribute );
798+ if (m_pShader->m_iBitangentAttribute != ~0 )
799+ glDisableVertexAttribArray (m_pShader->m_iBitangentAttribute );
758800 if (m_pShader->m_iColorAttribute != ~0 )
759801 glDisableVertexAttribArray (m_pShader->m_iColorAttribute );
760802}
0 commit comments