コード例 #1
0
 void CTargetingComputer::renderOffScreen()
  {
     // Perform offscreen rendering
     CTexture* pTexture = g_oTextureManager.texture(m_auiOffScreenTexture);
     pTexture->preRenderToTexture();
     // Clear screen
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
     
     // Calculate direction vector
     CVector3 vecTarget = m_pTarget->m_ppMasses[0]->m_vecPos - m_pPlayerShip->m_ppMasses[0]->m_vecPos;
     float fRange = vecTarget.length();
     float fSize = m_pTarget->m_oModel.boundingSphere().m_fRadius;
     
     // Set Projection Matrix
     glMatrixMode(GL_PROJECTION);
     glLoadIdentity();
     //gluPerspective(fAngle,1.0f,fRange-fSize, fRange+fSize);
     glOrtho(-fSize,fSize,-fSize,fSize,fRange-fSize,fRange+fSize);
     
     // Set Modelview Matrix
     glMatrixMode(GL_MODELVIEW);
     glLoadIdentity();
     gluLookAt(m_pPlayerShip->m_ppMasses[0]->m_vecPos.X(), 
               m_pPlayerShip->m_ppMasses[0]->m_vecPos.Y(), 
               m_pPlayerShip->m_ppMasses[0]->m_vecPos.Z(),
               m_pTarget->m_ppMasses[0]->m_vecPos.X(), 
               m_pTarget->m_ppMasses[0]->m_vecPos.Y(), 
               m_pTarget->m_ppMasses[0]->m_vecPos.Z(),
               m_pPlayerShip->m_vecUp.X() - m_pPlayerShip->m_ppMasses[0]->m_vecPos.X(),
               m_pPlayerShip->m_vecUp.Y() - m_pPlayerShip->m_ppMasses[0]->m_vecPos.Y(),
               m_pPlayerShip->m_vecUp.Z() - m_pPlayerShip->m_ppMasses[0]->m_vecPos.Z());
     
     // Draw
     glDisable(GL_TEXTURE_2D);
     m_pTarget->draw(false);
     glEnable(GL_TEXTURE_2D);
     // Finish up
     pTexture->postRenderToTexture(GL_RGBA);
  }
コード例 #2
0
ファイル: particlesystem.cpp プロジェクト: harkal/sylphis3d
void CParticleSystem::render(CRenderer &r, const CMatrix4 &transform){
    CArrays *a = r.getArrays();
    
    a->mVertexBuffer = mVertexBuffer;
    a->verts.setupBuffer(mVertexBuffer, CVertexBuffer::POSITION);
    a->normals.setupBuffer(mVertexBuffer, CVertexBuffer::NORMAL);
	a->tex_st.setupBuffer(mVertexBuffer, CVertexBuffer::TEX_COORD);

	CMatrix4 invTrans = transform;
	invTrans.invert();

    CMatrix4 &mv = r.getModelViewMatrix();

    // And setup up up,right vectors
    CVector3 up, right, forward, campos, trans;
    up[0] = mv.m[0][0];
	up[1] = mv.m[1][0];
	up[2] = mv.m[2][0];

	right[0] = mv.m[0][1];
	right[1] = mv.m[1][1];
	right[2] = mv.m[2][1];

    forward[0] = mv.m[0][2];
	forward[1] = mv.m[1][2];
	forward[2] = mv.m[2][2];

	// Local camera position
    campos  = invTrans * r.getCamera()->getDerivedPosition();

	trans[0] = mv.m[3][0];
	trans[1] = mv.m[3][1];
	trans[2] = mv.m[3][2];

    U32 count = mParticles.size();
    ParticleList::const_iterator i, pend;
    pend = mParticles.end();

    TParticleVertex *v = mSVertexBuffer;
    for(i = mParticles.begin() ; i != pend ; ++i){
        F32 sizeX = (*i)->mSizeX;
        F32 sizeY = (*i)->mSizeY;
        if(mDef->mParticleType == PARTICLE_BILLBOARD){
            CQuaternion q;
            q.fromAngleAxis(forward, (*i)->mRotation);
            CMatrix3 m;
            q.toRotationMatrix(m);
            CVector3 upR = m * up;
            CVector3 rightR = m * right;

            const CVector3 &color = (*i)->mColor;
            const CVector3 corner = (*i)->mPosition - (upR * sizeY + rightR * sizeX)  * 0.5;
            v->position = corner;
            v->color = color;
            v->texCoord = CTexCoord(0.0,  0.0);
            ++v;
            v->position = corner + upR * sizeY;
            v->color = color;
            v->texCoord = CTexCoord(0.0,  1.0);
            ++v;
            v->position = corner + (upR * sizeY + rightR * sizeX);
            v->color = color;
            v->texCoord = CTexCoord(1.0,1.0);
            ++v;
            v->position = corner + rightR * sizeX;
            v->color = color;
            v->texCoord = CTexCoord(1.0,0.0);
            ++v;
        } else {

            CVector3 upR = (*i)->mVelocity;
			float l = upR.length();
			if(l < 1.0){
				upR /= l;
			}

			CVector3 pos = (*i)->mPosition;
			pos.y += 10.0;

			CVector3 eyevec = campos - pos;
			
            CVector3 rightR = ((*i)->mVelocity ^ eyevec).normalized();
			
            const CVector3 &color = (*i)->mColor;
            const CVector3 corner = pos - (upR * sizeY + rightR * sizeX)  * 0.5;
            v->position = corner;
            v->color = color;
            v->texCoord = CTexCoord(0.0,  0.0);
            ++v;
            v->position = corner + upR * sizeY;
            v->color = color;
            v->texCoord = CTexCoord(0.0,  1.0);
            ++v;
            v->position = corner + (upR * sizeY + rightR * sizeX);
            v->color = color;
            v->texCoord = CTexCoord(1.0,1.0);
            ++v;
            v->position = corner + rightR * sizeX;
            v->color = color;
            v->texCoord = CTexCoord(1.0,0.0);
            ++v;
        }
    }

    a->numVerts = count * 4;
    a->numElems = count * 6;

    mVertexBuffer->uploadData(mSVertexBuffer, 0, 4 * count * sizeof(TParticleVertex));
    
    a->mElems = mElems;
}