//----------------------------------------------------------------------------- // // R_FrustumAngle // //----------------------------------------------------------------------------- angle_t FGLRenderer::FrustumAngle() { float tilt= fabs(mAngles.Pitch.Degrees); // If the pitch is larger than this you can look all around at a FOV of 90° if (tilt>46.0f) return 0xffffffff; // ok, this is a gross hack that barely works... // but at least it doesn't overestimate too much... double floatangle=2.0+(45.0+((tilt/1.9)))*mCurrentFoV*48.0/AspectMultiplier(WidescreenRatio)/90.0; angle_t a1 = DAngle(floatangle).BAMs(); if (a1>=ANGLE_180) return 0xffffffff; return a1; }
void PolyCull::MarkViewFrustum() { // Clips things outside the viewing frustum. auto &viewpoint = PolyRenderer::Instance()->Viewpoint; auto &viewwindow = PolyRenderer::Instance()->Viewwindow; double tilt = fabs(viewpoint.Angles.Pitch.Degrees); if (tilt > 46.0) // If the pitch is larger than this you can look all around return; double floatangle = 2.0 + (45.0 + ((tilt / 1.9)))*viewpoint.FieldOfView.Degrees*48.0 / AspectMultiplier(viewwindow.WidescreenRatio) / 90.0; angle_t a1 = DAngle(floatangle).BAMs(); if (a1 < ANGLE_180) { MarkSegmentCulled(AngleToPseudo(viewpoint.Angles.Yaw.BAMs() + a1), AngleToPseudo(viewpoint.Angles.Yaw.BAMs() - a1)); } }
DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_DropWeaponPieces) { PARAM_SELF_PROLOGUE(AActor); PARAM_CLASS(p1, AActor); PARAM_CLASS(p2, AActor); PARAM_CLASS(p3, AActor); for (int i = 0, j = 0; i < 3; ++i) { PClassActor *cls = j == 0 ? p1 : j == 1 ? p2 : p3; if (cls) { AActor *piece = Spawn (cls, self->Pos(), ALLOW_REPLACE); if (piece != NULL) { piece->Vel = self->Vel + DAngle(i*120.).ToVector(1); piece->flags |= MF_DROPPED; j = (j == 0) ? (pr_quietusdrop() & 1) + 1 : 3-j; } } } return 0; }
DAngle UDMFParserBase::CheckAngle(const char *key) { return DAngle(CheckFloat(key)).Normalized360(); }
DEFINE_ACTION_FUNCTION(DObject, BAM) { PARAM_PROLOGUE; PARAM_FLOAT(ang); ACTION_RETURN_INT(DAngle(ang).BAMs()); }
static void LoadSectors (sectortype *bsec, int count) { FDynamicColormap *map = GetSpecialLights (PalEntry (255,255,255), level.fadeto, 0); sector_t *sec; char tnam[9]; level.sectors.Alloc(count); sec = &level.sectors[0]; memset (sec, 0, sizeof(sector_t)*count); sec->e = new extsector_t[count]; for (int i = 0; i < count; ++i, ++bsec, ++sec) { bsec->wallptr = WORD(bsec->wallptr); bsec->wallnum = WORD(bsec->wallnum); bsec->ceilingstat = WORD(bsec->ceilingstat); bsec->floorstat = WORD(bsec->floorstat); sec->e = &sec->e[i]; double floorheight = -LittleLong(bsec->floorZ) / 256.; sec->SetPlaneTexZ(sector_t::floor, floorheight); sec->floorplane.SetAtHeight(floorheight, sector_t::floor); mysnprintf (tnam, countof(tnam), "BTIL%04d", LittleShort(bsec->floorpicnum)); sec->SetTexture(sector_t::floor, TexMan.GetTexture (tnam, FTexture::TEX_Build)); sec->SetXScale(sector_t::floor, (bsec->floorstat & 8) ? 2. : 1.); sec->SetYScale(sector_t::floor, (bsec->floorstat & 8) ? 2. : 1.); sec->SetXOffset(sector_t::floor, bsec->floorxpanning + 32.); sec->SetYOffset(sector_t::floor, bsec->floorypanning + 0.); sec->SetPlaneLight(sector_t::floor, SHADE2LIGHT (bsec->floorshade)); sec->ChangeFlags(sector_t::floor, 0, PLANEF_ABSLIGHTING); double ceilingheight = -LittleLong(bsec->ceilingZ) / 256.; sec->SetPlaneTexZ(sector_t::ceiling, ceilingheight); sec->ceilingplane.SetAtHeight(ceilingheight, sector_t::ceiling); mysnprintf (tnam, countof(tnam), "BTIL%04d", LittleShort(bsec->ceilingpicnum)); sec->SetTexture(sector_t::ceiling, TexMan.GetTexture (tnam, FTexture::TEX_Build)); if (bsec->ceilingstat & 1) { sky1texture = sky2texture = sec->GetTexture(sector_t::ceiling); sec->SetTexture(sector_t::ceiling, skyflatnum); } sec->SetXScale(sector_t::ceiling, (bsec->ceilingstat & 8) ? 2. : 1.); sec->SetYScale(sector_t::ceiling, (bsec->ceilingstat & 8) ? 2. : 1.); sec->SetXOffset(sector_t::ceiling, bsec->ceilingxpanning + 32.); sec->SetYOffset(sector_t::ceiling, bsec->ceilingypanning + 0.); sec->SetPlaneLight(sector_t::ceiling, SHADE2LIGHT (bsec->ceilingshade)); sec->ChangeFlags(sector_t::ceiling, 0, PLANEF_ABSLIGHTING); sec->lightlevel = (sec->GetPlaneLight(sector_t::floor) + sec->GetPlaneLight(sector_t::ceiling)) / 2; sec->seqType = -1; sec->SeqName = NAME_None; sec->nextsec = -1; sec->prevsec = -1; sec->gravity = 1.f; sec->friction = ORIG_FRICTION; sec->movefactor = ORIG_FRICTION_FACTOR; sec->ColorMap = map; sec->ZoneNumber = 0xFFFF; sec->terrainnum[sector_t::ceiling] = sec->terrainnum[sector_t::floor] = -1; if (bsec->floorstat & 4) { sec->SetAngle(sector_t::floor, DAngle(90.)); sec->SetXScale(sector_t::floor, -sec->GetXScale(sector_t::floor)); } if (bsec->floorstat & 16) { sec->SetXScale(sector_t::floor, -sec->GetXScale(sector_t::floor)); } if (bsec->floorstat & 32) { sec->SetYScale(sector_t::floor, -sec->GetYScale(sector_t::floor)); } if (bsec->ceilingstat & 4) { sec->SetAngle(sector_t::ceiling, DAngle(90.)); sec->SetYScale(sector_t::ceiling, -sec->GetYScale(sector_t::ceiling)); } if (bsec->ceilingstat & 16) { sec->SetXScale(sector_t::ceiling, -sec->GetXScale(sector_t::ceiling)); } if (bsec->ceilingstat & 32) { sec->SetYScale(sector_t::ceiling, -sec->GetYScale(sector_t::ceiling)); } } }