// // Reads the raw vertices and obtains final ones // void UDMFParser::loadVertices() const { numvertexes = (int)mVertices.getLength(); vertexes = estructalloctag(vertex_t, numvertexes, PU_LEVEL); for(int i = 0; i < numvertexes; i++) { vertexes[i].x = mVertices[i].x; vertexes[i].y = mVertices[i].y; // SoM: Cardboard stores float versions of vertices. vertexes[i].fx = M_FixedToFloat(vertexes[i].x); vertexes[i].fy = M_FixedToFloat(vertexes[i].y); } }
static void R_RenderLinkedPortal(pwindow_t *window) { fixed_t lastx, lasty, lastz; float lastxf, lastyf, lastzf; portal_t *portal = window->portal; // ioanch 20160123: keep track of window portalrender.curwindow = window; if(portal->type != R_LINKED || window->maxx < window->minx) return; // haleyjd: temporary debug if(portal->tainted > 6) { if(showtainted) R_ShowTainted(window); portal->tainted++; C_Printf(FC_ERROR "Refused to draw portal (line=%i) (t=%d)", portal->data.link.maker, portal->tainted); return; } #ifdef RANGECHECK for(int i = 0; i < video.width; i++) { if(window->bottom[i] > window->top[i] && (window->bottom[i] < -1 || window->bottom[i] > viewwindow.height || window->top[i] < -1 || window->top[i] > viewwindow.height)) { I_Error("R_RenderAnchoredPortal: clipping array contained invalid " "information:\n" " x:%i, ytop:%f, ybottom:%f\n", i, window->top[i], window->bottom[i]); } } #endif if(!R_SetupPortalClipsegs(window->minx, window->maxx, window->top, window->bottom)) return; R_ClearSlopeMark(window->minx, window->maxx, window->type); // haleyjd: temporary debug portal->tainted++; floorclip = window->bottom; ceilingclip = window->top; R_ClearOverlayClips(); portalrender.minx = window->minx; portalrender.maxx = window->maxx; ++validcount; R_SetMaskedSilhouette(ceilingclip, floorclip); lastx = viewx; lasty = viewy; lastz = viewz; lastxf = view.x; lastyf = view.y; lastzf = view.z; // SoM 3/10/2005: Use the coordinates stored in the portal struct viewx = window->vx + portal->data.link.deltax; viewy = window->vy + portal->data.link.deltay; viewz = window->vz + portal->data.link.deltaz; view.x = M_FixedToFloat(viewx); view.y = M_FixedToFloat(viewy); view.z = M_FixedToFloat(viewz); R_IncrementFrameid(); R_RenderBSPNode(numnodes - 1); // Only push the overlay if this is the head window R_PushPost(true, window->head == window ? window->portal->poverlay : NULL); floorclip = floorcliparray; ceilingclip = ceilingcliparray; viewx = lastx; viewy = lasty; viewz = lastz; view.x = lastxf; view.y = lastyf; view.z = lastzf; if(window->child) R_RenderLinkedPortal(window->child); }
// // R_RenderSkyboxPortal // static void R_RenderSkyboxPortal(pwindow_t *window) { fixed_t lastx, lasty, lastz, lastangle; float lastxf, lastyf, lastzf, lastanglef; portal_t *portal = window->portal; portalrender.curwindow = window; if(portal->type != R_SKYBOX) return; if(window->maxx < window->minx) return; #ifdef RANGECHECK for(int i = 0; i < video.width; i++) { if(window->bottom[i] > window->top[i] && (window->bottom[i] < -1 || window->bottom[i] > viewwindow.height || window->top[i] < -1 || window->top[i] > viewwindow.height)) { I_Error("R_RenderSkyboxPortal: clipping array contained invalid " "information:\n" " x:%i, ytop:%f, ybottom:%f\n", i, window->top[i], window->bottom[i]); } } #endif if(!R_SetupPortalClipsegs(window->minx, window->maxx, window->top, window->bottom)) return; R_ClearSlopeMark(window->minx, window->maxx, window->type); floorclip = window->bottom; ceilingclip = window->top; R_ClearOverlayClips(); portalrender.minx = window->minx; portalrender.maxx = window->maxx; ++validcount; R_SetMaskedSilhouette(ceilingclip, floorclip); lastx = viewx; lasty = viewy; lastz = viewz; lastangle = viewangle; lastxf = view.x; lastyf = view.y; lastzf = view.z; lastanglef = view.angle; viewx = portal->data.camera->x; viewy = portal->data.camera->y; viewz = portal->data.camera->z; view.x = M_FixedToFloat(viewx); view.y = M_FixedToFloat(viewy); view.z = M_FixedToFloat(viewz); // SoM: The viewangle should also be offset by the skybox camera angle. viewangle += portal->data.camera->angle; viewsin = finesine[viewangle>>ANGLETOFINESHIFT]; viewcos = finecosine[viewangle>>ANGLETOFINESHIFT]; view.angle = (ANG90 - viewangle) * PI / ANG180; view.sin = (float)sin(view.angle); view.cos = (float)cos(view.angle); R_IncrementFrameid(); R_RenderBSPNode(numnodes - 1); // Only push the overlay if this is the head window R_PushPost(true, window->head == window ? window->portal->poverlay : NULL); floorclip = floorcliparray; ceilingclip = ceilingcliparray; // SoM: "pop" the view state. viewx = lastx; viewy = lasty; viewz = lastz; viewangle = lastangle; view.x = lastxf; view.y = lastyf; view.z = lastzf; view.angle = lastanglef; viewsin = finesine[viewangle>>ANGLETOFINESHIFT]; viewcos = finecosine[viewangle>>ANGLETOFINESHIFT]; view.sin = (float)sin(view.angle); view.cos = (float)cos(view.angle); if(window->child) R_RenderSkyboxPortal(window->child); }
// // R_RenderHorizonPortal // static void R_RenderHorizonPortal(pwindow_t *window) { fixed_t lastx, lasty, lastz; // SoM 3/10/2005 float lastxf, lastyf, lastzf, floorangle, ceilingangle; visplane_t *topplane, *bottomplane; int x; portal_t *portal = window->portal; portalrender.curwindow = window; if(portal->type != R_HORIZON) return; if(window->maxx < window->minx) return; // haleyjd 01/05/08: angles floorangle = *portal->data.horizon.floorbaseangle + *portal->data.horizon.floorangle; ceilingangle = *portal->data.horizon.ceilingbaseangle + *portal->data.horizon.ceilingangle; topplane = R_FindPlane(*portal->data.horizon.ceilingz, *portal->data.horizon.ceilingpic, *portal->data.horizon.ceilinglight, *portal->data.horizon.ceilingxoff, *portal->data.horizon.ceilingyoff, ceilingangle, NULL, 0, 255, NULL); bottomplane = R_FindPlane(*portal->data.horizon.floorz, *portal->data.horizon.floorpic, *portal->data.horizon.floorlight, *portal->data.horizon.floorxoff, *portal->data.horizon.flooryoff, floorangle, NULL, 0, 255, NULL); topplane = R_CheckPlane(topplane, window->minx, window->maxx); bottomplane = R_CheckPlane(bottomplane, window->minx, window->maxx); for(x = window->minx; x <= window->maxx; x++) { if(window->top[x] > window->bottom[x]) continue; if(window->top[x] <= view.ycenter - 1.0f && window->bottom[x] >= view.ycenter) { topplane->top[x] = (int)window->top[x]; topplane->bottom[x] = centery - 1; bottomplane->top[x] = centery; bottomplane->bottom[x] = (int)window->bottom[x]; } else if(window->top[x] <= view.ycenter - 1.0f) { topplane->top[x] = (int)window->top[x]; topplane->bottom[x] = (int)window->bottom[x]; } else if(window->bottom[x] > view.ycenter - 1.0f) { bottomplane->top[x] = (int)window->top[x]; bottomplane->bottom[x] = (int)window->bottom[x]; } } lastx = viewx; lasty = viewy; lastz = viewz; lastxf = view.x; lastyf = view.y; lastzf = view.z; viewx = window->vx; viewy = window->vy; viewz = window->vz; view.x = M_FixedToFloat(viewx); view.y = M_FixedToFloat(viewy); view.z = M_FixedToFloat(viewz); if(window->head == window && window->portal->poverlay) R_PushPost(false, window->portal->poverlay); if(window->child) R_RenderHorizonPortal(window->child); viewx = lastx; viewy = lasty; viewz = lastz; view.x = lastxf; view.y = lastyf; view.z = lastzf; }
// // ACS_SetThingVar // void ACS_SetThingVar(Mobj *thing, uint32_t var, int32_t val) { if(!thing) return; switch(var) { case ACS_THINGVAR_Health: thing->health = val; break; case ACS_THINGVAR_Speed: break; case ACS_THINGVAR_Damage: thing->damage = val; break; case ACS_THINGVAR_Alpha: thing->translucency = val; break; case ACS_THINGVAR_RenderStyle: break; case ACS_THINGVAR_SeeSound: break; case ACS_THINGVAR_AttackSound: break; case ACS_THINGVAR_PainSound: break; case ACS_THINGVAR_DeathSound: break; case ACS_THINGVAR_ActiveSound: break; case ACS_THINGVAR_Ambush: if(val) thing->flags |= MF_AMBUSH; else thing->flags &= ~MF_AMBUSH; break; case ACS_THINGVAR_Invulnerable: if(val) thing->flags2 |= MF2_INVULNERABLE; else thing->flags2 &= ~MF2_INVULNERABLE; break; case ACS_THINGVAR_JumpZ: break; case ACS_THINGVAR_ChaseGoal: break; case ACS_THINGVAR_Frightened: break; case ACS_THINGVAR_Friendly: if(val) thing->flags |= MF_FRIEND; else thing->flags &= ~MF_FRIEND; break; case ACS_THINGVAR_SpawnHealth: break; case ACS_THINGVAR_Dropped: if(val) thing->flags |= MF_DROPPED; else thing->flags &= ~MF_DROPPED; break; case ACS_THINGVAR_NoTarget: break; case ACS_THINGVAR_Species: break; case ACS_THINGVAR_NameTag: break; case ACS_THINGVAR_Score: break; case ACS_THINGVAR_NoTrigger: break; case ACS_THINGVAR_DamageFactor: break; case ACS_THINGVAR_MasterTID: break; case ACS_THINGVAR_TargetTID: P_SetTarget(&thing->target, P_FindMobjFromTID(val, 0, 0)); break; case ACS_THINGVAR_TracerTID: P_SetTarget(&thing->tracer, P_FindMobjFromTID(val, 0, 0)); break; case ACS_THINGVAR_WaterLevel: break; case ACS_THINGVAR_ScaleX: thing->xscale = M_FixedToFloat(val); break; case ACS_THINGVAR_ScaleY: thing->yscale = M_FixedToFloat(val); break; case ACS_THINGVAR_Dormant: if(val) thing->flags2 |= MF2_DORMANT; else thing->flags2 &= ~MF2_DORMANT; break; case ACS_THINGVAR_Mass: break; case ACS_THINGVAR_Accuracy: break; case ACS_THINGVAR_Stamina: break; case ACS_THINGVAR_Height: break; case ACS_THINGVAR_Radius: break; case ACS_THINGVAR_ReactionTime: break; case ACS_THINGVAR_MeleeRange: break; case ACS_THINGVAR_ViewHeight: break; case ACS_THINGVAR_AttackZOff: break; case ACS_THINGVAR_StencilColor: break; case ACS_THINGVAR_Friction: break; case ACS_THINGVAR_DamageMult: break; case ACS_THINGVAR_Angle: thing->angle = val << 16; break; case ACS_THINGVAR_Armor: break; case ACS_THINGVAR_CeilingTexture: break; case ACS_THINGVAR_CeilingZ: break; case ACS_THINGVAR_FloorTexture: break; case ACS_THINGVAR_FloorZ: break; case ACS_THINGVAR_Frags: break; case ACS_THINGVAR_LightLevel: break; case ACS_THINGVAR_MomX: thing->momx = val; break; case ACS_THINGVAR_MomY: thing->momy = val; break; case ACS_THINGVAR_MomZ: thing->momz = val; break; case ACS_THINGVAR_Pitch: if(thing->player) thing->player->prevpitch = thing->player->pitch = val << 16; break; case ACS_THINGVAR_PlayerNumber: break; case ACS_THINGVAR_SigilPieces: break; case ACS_THINGVAR_TID: P_RemoveThingTID(thing); P_AddThingTID(thing, val); break; case ACS_THINGVAR_Type: break; case ACS_THINGVAR_X: thing->x = val; break; case ACS_THINGVAR_Y: thing->y = val; break; case ACS_THINGVAR_Z: thing->z = val; break; } }
static void R_RenderLinkedPortal(pwindow_t *window) { fixed_t lastx, lasty, lastz; float lastxf, lastyf, lastzf; portal_t *portal = window->portal; // ioanch 20160123: keep track of window portalrender.curwindow = window; if(portal->type != R_LINKED || window->maxx < window->minx) return; // haleyjd: temporary debug if(portal->tainted > PORTAL_RECURSION_LIMIT) { R_ShowTainted(window); portal->tainted++; return; } #ifdef RANGECHECK for(int i = 0; i < video.width; i++) { if(window->bottom[i] > window->top[i] && (window->bottom[i] < -1 || window->bottom[i] > viewwindow.height || window->top[i] < -1 || window->top[i] > viewwindow.height)) { I_Error("R_RenderAnchoredPortal: clipping array contained invalid " "information:\n" " x:%i, ytop:%f, ybottom:%f\n", i, window->top[i], window->bottom[i]); } } #endif if(!R_SetupPortalClipsegs(window->minx, window->maxx, window->top, window->bottom)) return; R_ClearSlopeMark(window->minx, window->maxx, window->type); // haleyjd: temporary debug portal->tainted++; floorclip = window->bottom; ceilingclip = window->top; R_ClearOverlayClips(); portalrender.minx = window->minx; portalrender.maxx = window->maxx; ++validcount; R_SetMaskedSilhouette(ceilingclip, floorclip); lastx = viewx; lasty = viewy; lastz = viewz; lastxf = view.x; lastyf = view.y; lastzf = view.z; // SoM 3/10/2005: Use the coordinates stored in the portal struct viewx = window->vx + portal->data.link.deltax; viewy = window->vy + portal->data.link.deltay; viewz = window->vz + portal->data.link.deltaz; // ioanch 20160227: microscopic adjustment for line portals to make sure // the edge textures in the buffer sectors are seen in case of polyobject // portals //if(window->line && window->line->portal->data.link.polyportalpartner) //{ // if(window->line->dx > 0) // --viewy; // else if(window->line->dx < 0) // ++viewy; // if(window->line->dy > 0) // ++viewx; // else if(window->line->dy < 0) // --viewx; //} view.x = M_FixedToFloat(viewx); view.y = M_FixedToFloat(viewy); view.z = M_FixedToFloat(viewz); R_IncrementFrameid(); R_RenderBSPNode(numnodes - 1); // Only push the overlay if this is the head window R_PushPost(true, window->head == window ? window->portal->poverlay : NULL); floorclip = floorcliparray; ceilingclip = ceilingcliparray; viewx = lastx; viewy = lasty; viewz = lastz; view.x = lastxf; view.y = lastyf; view.z = lastzf; if(window->child) R_RenderLinkedPortal(window->child); }