return true;
// view origin is not used for culling in portal/reflection/refraction renders or isometric views
- if (r_refdef.view.useclipplane || !r_refdef.view.useperspective || r_trippy.integer)
+ if (!r_refdef.view.usevieworiginculling)
return true;
if (!r_cullentities_trace_entityocclusion.integer && (!model || !model->brush.TraceLineOfSight))
}
else
{
- VectorScale(forward, -1.0f, r_refdef.view.frustum[0].normal);
- VectorScale(forward, 1.0f, r_refdef.view.frustum[1].normal);
- VectorScale(left, -1.0f, r_refdef.view.frustum[2].normal);
- VectorScale(left, 1.0f, r_refdef.view.frustum[3].normal);
- VectorScale(up, -1.0f, r_refdef.view.frustum[4].normal);
+ VectorScale(left, -1.0f, r_refdef.view.frustum[0].normal);
+ VectorScale(left, 1.0f, r_refdef.view.frustum[1].normal);
+ VectorScale(up, -1.0f, r_refdef.view.frustum[2].normal);
+ VectorScale(up, 1.0f, r_refdef.view.frustum[3].normal);
+ VectorScale(forward, -1.0f, r_refdef.view.frustum[4].normal);
r_refdef.view.frustum[0].dist = DotProduct (r_refdef.view.origin, r_refdef.view.frustum[0].normal) - r_refdef.view.ortho_x;
r_refdef.view.frustum[1].dist = DotProduct (r_refdef.view.origin, r_refdef.view.frustum[1].normal) - r_refdef.view.ortho_x;
r_refdef.view.frustum[2].dist = DotProduct (r_refdef.view.origin, r_refdef.view.frustum[2].normal) - r_refdef.view.ortho_y;
r_refdef.view.frustum[3].dist = DotProduct (r_refdef.view.origin, r_refdef.view.frustum[3].normal) - r_refdef.view.ortho_y;
- r_refdef.view.frustum[4].dist = DotProduct (r_refdef.view.origin, r_refdef.view.frustum[4].normal) + r_refdef.nearclip;
+ r_refdef.view.frustum[4].dist = DotProduct (r_refdef.view.origin, r_refdef.view.frustum[4].normal) - r_refdef.farclip;
}
r_refdef.view.numfrustumplanes = 5;
{
R_Main_ResizeViewCache();
R_View_SetFrustum(myscissor);
- R_View_WorldVisibility(r_refdef.view.useclipplane);
+ R_View_WorldVisibility(!r_refdef.view.usevieworiginculling);
R_View_UpdateEntityVisible();
}
{
R_Main_ResizeViewCache();
R_View_SetFrustum(NULL);
- R_View_WorldVisibility(r_refdef.view.useclipplane);
+ R_View_WorldVisibility(!r_refdef.view.usevieworiginculling);
R_View_UpdateEntityVisible();
}
rtheight = viewfbo ? R_TextureHeight(viewdepthtexture ? viewdepthtexture : viewcolortexture) : vid.height;
if (!r_refdef.view.useperspective)
- R_Viewport_InitOrtho(&r_refdef.view.viewport, &r_refdef.view.matrix, viewx, rtheight - viewheight - viewy, viewwidth, viewheight, -r_refdef.view.ortho_x, -r_refdef.view.ortho_y, r_refdef.view.ortho_x, r_refdef.view.ortho_y, -r_refdef.farclip, r_refdef.farclip, customclipplane);
+ R_Viewport_InitOrtho3D(&r_refdef.view.viewport, &r_refdef.view.matrix, viewx, rtheight - viewheight - viewy, viewwidth, viewheight, r_refdef.view.ortho_x, r_refdef.view.ortho_y, -r_refdef.farclip, r_refdef.farclip, customclipplane);
else if (vid.stencil && r_useinfinitefarclip.integer)
R_Viewport_InitPerspectiveInfinite(&r_refdef.view.viewport, &r_refdef.view.matrix, viewx, rtheight - viewheight - viewy, viewwidth, viewheight, r_refdef.view.frustum_x, r_refdef.view.frustum_y, r_refdef.nearclip, customclipplane);
else
}
r_refdef.view.clipplane = p->plane;
+ // reflected view origin may be in solid, so don't cull with it
+ r_refdef.view.usevieworiginculling = false;
// reverse the cullface settings for this render
r_refdef.view.cullface_front = GL_FRONT;
r_refdef.view.cullface_back = GL_BACK;
// camera needs no clipplane
r_refdef.view.useclipplane = false;
+ // TODO: is the camera origin always valid? if so we don't need to clear this
+ r_refdef.view.usevieworiginculling = false;
PlaneClassify(&r_refdef.view.clipplane);
return;
}
+ r_refdef.view.usevieworiginculling = !r_trippy.value && r_refdef.view.useperspective;
if (v_isometric.integer && r_refdef.view.ismain)
V_MakeViewIsometric();