Index: client/renderer/r_bsp.c =================================================================== --- client/renderer/r_bsp.c (revision 24654) +++ client/renderer/r_bsp.c (working copy) @@ -149,10 +149,14 @@ modelorg[1] = -DotProduct(temp, right); modelorg[2] = DotProduct(temp, up); } + if (VectorNotEmpty(e->origin)) { + VectorSubtract(modelorg, e->model->shift, modelorg); + } R_ShiftLights(e->origin); glPushMatrix(); + /* This positions and rotates the model based on e->origin, e->angles, and e->model->shift. */ R_TransformForEntity(e); R_DrawBspModelSurfaces(e, modelorg); Index: client/renderer/r_entity.c =================================================================== --- client/renderer/r_entity.c (revision 24654) +++ client/renderer/r_entity.c (working copy) @@ -58,6 +58,10 @@ glRotatef(e->angles[YAW], 0, 0, 1); glRotatef(e->angles[PITCH], 0, 1, 0); glRotatef(e->angles[ROLL], 1, 0, 0); + + if (VectorNotEmpty(e->origin)) { + glTranslatef(-e->model->shift[0], -e->model->shift[1], -e->model->shift[2]); + } } /** Index: client/renderer/r_model.h =================================================================== --- client/renderer/r_model.h (revision 24654) +++ client/renderer/r_model.h (working copy) @@ -53,6 +53,9 @@ vec3_t mins, maxs; float radius; + /** Noted offset for entities with origins */ + vec3_t shift; + /** solid volume for clipping */ qboolean clipbox; vec3_t clipmins, clipmaxs; Index: client/renderer/r_model_brush.c =================================================================== --- client/renderer/r_model_brush.c (revision 24654) +++ client/renderer/r_model_brush.c (working copy) @@ -1017,6 +1017,14 @@ VectorCopy(sub->mins, mod->mins); mod->radius = sub->radius; + /* So origin based models render correctly, copy the shift if needed. */ + if (VectorNotEmpty(sub->origin)) { + VectorCopy(shift, mod->shift); + } else { + VectorClear(mod->shift); + } + + mod->bsp.firstnode = sub->headnode; mod->bsp.nodes = &r_worldmodel->bsp.nodes[mod->bsp.firstnode]; mod->bsp.maptile = r_numMapTiles - 1;