コード例 #1
0
ファイル: e_udmf.cpp プロジェクト: Blastfrog/eternity
//
// 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);
   }
}
コード例 #2
0
ファイル: r_portal.cpp プロジェクト: chungy/eternity
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);
}
コード例 #3
0
ファイル: r_portal.cpp プロジェクト: chungy/eternity
//
// 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);
}
コード例 #4
0
ファイル: r_portal.cpp プロジェクト: chungy/eternity
//
// 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;
}
コード例 #5
0
ファイル: acs_func.cpp プロジェクト: Blastfrog/eternity
//
// 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;
   }
}
コード例 #6
0
ファイル: r_portal.cpp プロジェクト: Blastfrog/eternity
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);
}