Skip to content

Commit

Permalink
stencil frustum
Browse files Browse the repository at this point in the history
added portal (frustum) test to the room rendering; to disable it change
in render.h str. 37 #define STENCIL_FRUSTUM 1 to #define STENCIL_FRUSTUM
0;
  • Loading branch information
TeslaRus committed Jun 6, 2015
1 parent 2b28197 commit 3be9b71
Show file tree
Hide file tree
Showing 5 changed files with 77 additions and 36 deletions.
54 changes: 26 additions & 28 deletions src/frustum.cpp
Expand Up @@ -32,32 +32,31 @@ frustum_p Frustum_Create()

void Frustum_Delete(frustum_p p)
{
if(p)
if(p && (!renderer.cam || p != renderer.cam->frustum))
{
if(!renderer.cam || p != renderer.cam->frustum)
{
p->active = 0;
p->count = 0;
if(p->planes)
{
free(p->planes);
p->planes = NULL;
}
frustum_p next = p->next;

if(p->vertex)
{
free(p->vertex);
p->vertex = NULL;
}
p->next = NULL;
p->active = 0;
p->count = 0;
if(p->planes)
{
free(p->planes);
p->planes = NULL;
}
if(p->next)

if(p->vertex)
{
Frustum_Delete(p->next);
p->next = NULL;
free(p->vertex);
p->vertex = NULL;
}
if(!renderer.cam || p != renderer.cam->frustum)

free(p);

if(next)
{
free(p);
Frustum_Delete(next);
next = NULL;
}
}
}
Expand Down Expand Up @@ -94,19 +93,13 @@ int Frustum_GetFrustumsCount(struct frustum_s *f)
*/
int Frustum_HaveParent(frustum_p parent, frustum_p frustum)
{
frustum_p base_parent = parent;
while(frustum && frustum->active)
{
while(parent && parent->active)
if(parent == frustum)
{
if(parent == frustum)
{
return 1;
}
parent = parent->next;
return 1;
}
frustum = frustum->parent;
parent = base_parent;
}
return 0;
}
Expand All @@ -121,6 +114,7 @@ void Frustum_SplitPrepare(frustum_p frustum, struct portal_s *p)
frustum->norm[2] = -p->norm[2];
frustum->norm[3] = -p->norm[3];
frustum->active = 0;
frustum->parent = NULL;
}

int Frustum_Split(frustum_p p, btScalar n[4], btScalar *buf) // отсечение части фрустума плоскостью
Expand Down Expand Up @@ -210,6 +204,10 @@ void Frustum_GenClipPlanes(frustum_p p, struct camera_s *cam)
vec3_sub(V1, prev_v, cam->pos) // вектор от наблюдателя до вершины полигона
vec3_sub(V2, curr_v, prev_v) // вектор соединяющий соседние вершины полигона

/*if(vec3_dot(V2, V2) < 0.04)
{
Con_AddLine("BAD FRUSTUM SPLITTER!");
}*/
vec3_cross(r, V1, V2)
r[3] = vec3_abs(r);
vec3_norm_plane(r, prev_v, r[3])
Expand Down
4 changes: 3 additions & 1 deletion src/main_SDL.cpp
Expand Up @@ -421,7 +421,9 @@ void Engine_InitSDLVideo()

SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, renderer.settings.z_depth);

#if STENCIL_FRUSTUM
SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8);
#endif
// set the opengl context version
//SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_COMPATIBILITY);
//SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
Expand Down
8 changes: 1 addition & 7 deletions src/portal.cpp
Expand Up @@ -46,7 +46,7 @@ void Portal_Clear(portal_p p)
if(p->vertex)
{
free(p->vertex);
p->vertex = NULL; // paranoid
p->vertex = NULL;
}
p->vertex_count = 0;
p->flag = 0;
Expand Down Expand Up @@ -317,12 +317,6 @@ struct frustum_s* Portal_FrustumIntersect(portal_p portal, struct frustum_s *emi

if(vec3_plane_dist(portal->norm, render->cam->pos) < -SPLIT_EPSILON) // Портал вырожден в линию или не лицевой
{
if((render->cam->pos[0] > portal->dest_room->bb_min[0]) && (render->cam->pos[0] < portal->dest_room->bb_max[0]) &&
(render->cam->pos[1] > portal->dest_room->bb_min[1]) && (render->cam->pos[1] < portal->dest_room->bb_max[1]) &&
(render->cam->pos[2] > portal->dest_room->bb_min[2]) && (render->cam->pos[2] < portal->dest_room->bb_max[2]))
{
return emitter; // Данная проверка введена из за возможности наложения соседних комнат друг на друга
}
return NULL;
}

Expand Down
45 changes: 45 additions & 0 deletions src/render.cpp
Expand Up @@ -706,6 +706,45 @@ void Render_Room(struct room_s *room, struct render_s *render, const btScalar mo
entity_p ent;

const shader_description *lastShader = 0;
////start test stencil test code
#if STENCIL_FRUSTUM
if(room->frustum->active != 0)
{
const int elem = (3 + 3 + 4 + 2);
const unlit_tinted_shader_description *shader = render->shader_manager->getRoomShader(false, false);
glUseProgramObjectARB(shader->program);
glUniform1iARB(shader->sampler, 0);
glUniformMatrix4fvARB(shader->model_view_projection, 1, false, engine_camera.gl_view_proj_mat);
glEnable(GL_STENCIL_TEST);
glClear(GL_STENCIL_BUFFER_BIT);
glStencilFunc(GL_NEVER, 1, 0x00);
glStencilOp(GL_REPLACE, GL_KEEP, GL_KEEP);
for(frustum_p f=room->frustum;(f!=NULL)&&(f->active);f=f->next)
{
GLfloat *v, *buf = (GLfloat*)GetTempbtScalar(f->count * elem);
v=buf;
for(int16_t i=f->count-1;i>=0;i--)
{
vec3_copy(v, f->vertex+3*i); v+=3;
vec3_copy_inv(v, engine_camera.view_dir); v+=3;
vec4_set_one(v); v+=4;
v[0] = v[1] = 0.0; v+=2;
}

glBindTexture(GL_TEXTURE_2D, renderer.world->textures[renderer.world->tex_count-1]);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
glVertexPointer(3, GL_BT_SCALAR, elem * sizeof(GLfloat), buf+0);
glNormalPointer(GL_BT_SCALAR, elem * sizeof(GLfloat), buf+3);
glColorPointer(4, GL_FLOAT, elem * sizeof(GLfloat), buf+3+3);
glTexCoordPointer(2, GL_FLOAT, elem * sizeof(GLfloat), buf+3+3+4);
glDrawArrays(GL_TRIANGLE_FAN, 0, f->count);

ReturnTempbtScalar(f->count * elem);
}
glStencilFunc(GL_EQUAL, 1, 0xFF);
}
#endif

if(!(renderer.style & R_SKIP_ROOM) && room->mesh)
{
btScalar modelViewProjectionTransform[16];
Expand Down Expand Up @@ -782,6 +821,12 @@ void Render_Room(struct room_s *room, struct render_s *render, const btScalar mo
};
}
}
#if STENCIL_FRUSTUM
if(room->frustum->active != 0)
{
glDisable(GL_STENCIL_TEST);
}
#endif
}


Expand Down
2 changes: 2 additions & 0 deletions src/render.h
Expand Up @@ -34,6 +34,8 @@
#define GL_BT_SCALAR GL_FLOAT
#endif

#define STENCIL_FRUSTUM 1

struct portal_s;
struct frustum_s;
struct world_s;
Expand Down

0 comments on commit 3be9b71

Please sign in to comment.