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); }
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; }