// ----------------------------------------------------------------------------- void renderParticle( ATPART *psPart ) { Vector3i dv; SDWORD x, y, z, rx, rz; x = psPart->position.x; y = psPart->position.y; z = psPart->position.z; /* Transform it */ dv.x = ((UDWORD)x - player.p.x) - terrainMidX * TILE_UNITS; dv.y = (UDWORD)y; dv.z = terrainMidY * TILE_UNITS - ((UDWORD)z - player.p.z); pie_MatBegin(); /* Push the identity matrix */ pie_TRANSLATE(dv.x,dv.y,dv.z); rx = map_round(player.p.x); /* Get the x,z translation components */ rz = map_round(player.p.z); pie_TRANSLATE(rx,0,-rz); /* Translate */ /* Make it face camera */ pie_MatRotY(-player.r.y); pie_MatRotY(-player.r.x); /* Scale it... */ pie_MatScale(psPart->size / 100.f); /* Draw it... */ pie_Draw3DShape(psPart->imd, 0, 0, WZCOL_WHITE, 0, 0); pie_MatEnd(); }
/* This function will actually draw a wall section Slightly different from yer basic structure draw in that it's not alligned to the terrain as bridge sections sit at a height stored in their structure - as they're above the ground and wouldn't be much use if they weren't, bridge wise. */ BOOL renderBridgeSection(STRUCTURE *psStructure) { SDWORD rx, rz; Vector3i dv; /* Bomb out if it's not visible */ if (!psStructure->visible[selectedPlayer]) { return false; } /* Establish where it is in the world */ dv.x = (psStructure->pos.x - player.p.x) - terrainMidX * TILE_UNITS; dv.z = terrainMidY * TILE_UNITS - (psStructure->pos.y - player.p.z); dv.y = psStructure->pos.z; /* Push the indentity matrix */ pie_MatBegin(); /* Translate */ pie_TRANSLATE(dv.x, dv.y, dv.z); /* Get the x,z translation components */ rx = map_round(player.p.x); rz = map_round(player.p.z); /* Translate */ pie_TRANSLATE(rx, 0, -rz); pie_Draw3DShape(psStructure->sDisplay.imd, 0, 0, WZCOL_WHITE, 0, 0); pie_MatEnd(); return(true); }
// multiple turrets display removed the pointless mountRotation void displayComponentObject(DROID *psDroid) { Vector3i position, rotation; int32_t xShift,zShift; SDWORD frame; PROPULSION_STATS *psPropStats; UDWORD tileX,tileY; MAPTILE *psTile; SPACETIME st = interpolateObjectSpacetime((SIMPLE_OBJECT *)psDroid, graphicsTime); psPropStats = asPropulsionStats + psDroid->asBits[COMP_PROPULSION].nStat; leftFirst = angleDelta(player.r.y - st.rot.direction) <= 0; /* Push the matrix */ pie_MatBegin(); /* Get internal tile units coordinates */ xShift = map_round(player.p.x); zShift = map_round(player.p.z); /* Mask out to tile_units resolution */ pie_TRANSLATE(xShift,0,-zShift); /* Get the real position */ position.x = (st.pos.x - player.p.x) - terrainMidX*TILE_UNITS; position.z = terrainMidY*TILE_UNITS - (st.pos.y - player.p.z); position.y = st.pos.z; if(psDroid->droidType == DROID_TRANSPORTER) { position.y += bobTransporterHeight(); } /* Get all the pitch,roll,yaw info */ rotation.y = -st.rot.direction; rotation.x = st.rot.pitch; rotation.z = st.rot.roll; /* Translate origin */ pie_TRANSLATE(position.x,position.y,position.z); /* Rotate for droid */ pie_MatRotY(rotation.y); pie_MatRotX(rotation.x); pie_MatRotZ(rotation.z); if( (gameTime-psDroid->timeLastHit < GAME_TICKS_PER_SEC) && psDroid->lastHitWeapon == WSC_ELECTRONIC) { objectShimmy( (BASE_OBJECT*) psDroid ); } if (psDroid->lastHitWeapon == WSC_EMP && (gameTime - psDroid->timeLastHit < EMP_DISABLE_TIME)) { Vector3i position; //add an effect on the droid position.x = st.pos.x + DROID_EMP_SPREAD; position.y = st.pos.z + rand()%8; position.z = st.pos.y + DROID_EMP_SPREAD; effectGiveAuxVar(90+rand()%20); addEffect(&position,EFFECT_EXPLOSION,EXPLOSION_TYPE_PLASMA,false,NULL,0); } if ((psDroid->visible[selectedPlayer] == UBYTE_MAX) || demoGetStatus()) { //ingame not button object //should render 3 mounted weapons now displayCompObj(psDroid, false); } else { // make sure it's not over water. tileX = st.pos.x/TILE_UNITS; tileY = st.pos.y/TILE_UNITS; // double check it's on map if ( tileX < mapWidth && tileY < mapHeight ) { psTile = mapTile(tileX,tileY); if (terrainType(psTile) != TER_WATER) { frame = gameTime/BLIP_ANIM_DURATION + psDroid->id; //visible[selectedPlayer]; pie_Draw3DShape(getImdFromIndex(MI_BLIP), frame, 0, WZCOL_WHITE, WZCOL_BLACK, pie_ADDITIVE, psDroid->visible[selectedPlayer] / 2); /* set up all the screen coords stuff - need to REMOVE FROM THIS LOOP */ } } } pie_MatEnd(); }