本文整理汇总了C++中CFrustum::Setup方法的典型用法代码示例。如果您正苦于以下问题:C++ CFrustum::Setup方法的具体用法?C++ CFrustum::Setup怎么用?C++ CFrustum::Setup使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类CFrustum
的用法示例。
在下文中一共展示了CFrustum::Setup方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: Update
// gets called every frame to draw the scene
void CRenderer::Update(const float dt, const uint32_t ticks)
{
CObj* obj, *localctrl;
int localctrlid;
OBJITER iter;
matrix_t m;
vec3_t dir, up, side;
CFrustum frustum;
CWorld* world;
localctrl = m_world->GetLocalController();
localctrlid = m_world->GetLocalObj()->GetID();
world = m_world->GetInterpWorld();
const vec3_t campos = localctrl->GetOrigin();
const quaternion_t camrot = localctrl->GetRot();
m.SetCamTransform(campos, camrot);
m.GetVec3Cam(&dir, &up, &side);
dir = -dir;
frustum.Setup(campos, dir, up, side,
RENDERER_FOV, (float)m_width/(float)m_height,
PLANE_NEAR,
PLANE_FAR);
// light floating above the players head
const vec3_t lightpos0(campos + vec3_t(0,25.0f,0));
const quaternion_t lightrot0(quaternion_t(vec3_t::xAxis, -90.0f*lynxmath::DEGTORAD));
const float lightpos0_4f[4] = {lightpos0.x, lightpos0.y, lightpos0.z, 1};
glLightfv(GL_LIGHT0, GL_POSITION, lightpos0_4f);
if(m_shaderactive)
{
if(m_useShadows)
{
glUseProgram(0); // draw shadowmap with fixed function pipeline
PrepareShadowMap(lightpos0,
lightrot0,
world,
localctrlid); // the player is the light
}
glUseProgram(m_program); // activate shader
}
glMatrixMode(GL_MODELVIEW);
glLoadMatrixf(m.pm);
glClear(GL_DEPTH_BUFFER_BIT);
glClear(GL_COLOR_BUFFER_BIT);
glActiveTexture(GL_TEXTURE0); // normal texture channel
if(m_shaderactive)
{
glUniform1i(m_tex, 0); // good old textures: GL_TEXTURE0
glUniform1i(m_normalMap, 1); // normal maps are GL_TEXTURE1
glUniform1i(m_lightmap, 2); // lightmap
if(m_useShadows)
{
glUniform1i(m_shadowMapUniform, 7);
glActiveTexture(GL_TEXTURE7); // shadow mapping texture GL_TEXTURE7
glBindTexture(GL_TEXTURE_2D, m_depthTextureId);
glActiveTexture(GL_TEXTURE0);
}
#ifdef DRAW_NORMALS
glUseProgram(0); // use fixed pipeline for this debug mode
#endif
}
// Main drawing
DrawScene(frustum, world, localctrlid, false);
if(m_shaderactive)
glUseProgram(0); // don't use shader for particles
// Particle Draw
glDisable(GL_LIGHTING);
glDepthMask(false);
for(iter=world->ObjBegin();iter!=world->ObjEnd();++iter)
{
obj = (*iter).second;
if(obj->GetMesh())
{
// Animate mesh is done in the particle loop
// and not in DrawScene, because DrawScene
// can be called multiple times per frame
obj->GetMesh()->Animate(obj->GetMeshState(), dt);
}
if(obj->GetID() == localctrlid || !obj->GetParticleSystem())
continue;
// Update/animate the particles, depending on dt and the current position.
obj->GetParticleSystem()->Update(dt, ticks, obj->GetOrigin());
// Draw the particles. FIXME: this should use a frustum test
obj->GetParticleSystem()->Render(side, up, dir);
//.........这里部分代码省略.........
示例2: PrepareShadowMap
void CRenderer::PrepareShadowMap(const vec3_t& lightpos,
const quaternion_t& lightrot,
CWorld* world, int localctrlid)
{
CFrustum frustum;
vec3_t dir, up, side;
matrix_t mviewlight;
mviewlight.SetCamTransform(lightpos, lightrot);
mviewlight.GetVec3Cam(&dir, &up, &side);
dir = -dir;
frustum.Setup(lightpos, dir, up, side,
RENDERER_FOV, (float)m_width/(float)m_height,
PLANE_NEAR,
PLANE_FAR);
glViewport(0, 0, (int)(m_width * SHADOW_MAP_RATIO),
(int)(m_height * SHADOW_MAP_RATIO));
float projection[16];
glMatrixMode(GL_PROJECTION);
// Shadow mapping with ortho projection can be useful
//const float lightDistance = PLANE_FAR*0.1f;
//glLoadIdentity();
//glOrtho(-35.0f, 35.0f, -35.0f, 35.0f, 0.0f, PLANE_FAR*0.1f); // dimension: light area in m
glGetFloatv(GL_PROJECTION_MATRIX, projection);
glMatrixMode(GL_MODELVIEW);
glLoadMatrixf(mviewlight.pm); // set camera to light pos
glMatrixMode(GL_TEXTURE);
glActiveTexture(GL_TEXTURE7);
glLoadMatrixf(g_shadowBias); // to map from -1..1 to 0..1
glMultMatrixf(projection);
glMultMatrixf(mviewlight.pm);
glMatrixMode(GL_MODELVIEW);
// Render to FBO
glBindFramebuffer(GL_FRAMEBUFFER, m_fboId);
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
glDisable(GL_LIGHTING);
glDisable(GL_BLEND);
#ifndef DRAW_SHADOWMAP
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
#endif
//glCullFace(GL_FRONT);
glPolygonOffset( 1.1f, 4.0f );
glEnable(GL_POLYGON_OFFSET_FILL);
DrawScene(frustum, world, localctrlid, true);
glDisable(GL_POLYGON_OFFSET_FILL);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glViewport(0, 0, m_width, m_height);
#ifndef DRAW_SHADOWMAP
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
#endif
//glCullFace(GL_BACK);
glEnable(GL_LIGHTING);
glEnable(GL_BLEND);
UpdatePerspective(); // restore standard projection
}