/* Will return false when we've hit the edge of the grid */ static bool getTileHeightCallback(Vector2i pos, int32_t dist, void *data) { HeightCallbackHelp_t *help = (HeightCallbackHelp_t *)data; #ifdef TEST_RAY Vector3i effect; #endif /* Are we still on the grid? */ if (clipXY(pos.x, pos.y)) { bool HasTallStructure = blockTile(map_coord(pos.x), map_coord(pos.y), AUX_MAP) & AIR_BLOCKED; if (dist > TILE_UNITS || HasTallStructure) { // Only do it the current tile is > TILE_UNITS away from the starting tile. Or.. // there is a tall structure on the current tile and the current tile is not the starting tile. /* Get height at this intersection point */ int height = map_Height(pos.x, pos.y), heightDiff; uint16_t newPitch; if (HasTallStructure) { height += TALLOBJECT_ADJUST; } if (height <= help->height) { heightDiff = 0; } else { heightDiff = height - help->height; } /* Work out the angle to this point from start point */ newPitch = iAtan2(heightDiff, dist); /* Is this the steepest we've found? */ if (angleDelta(newPitch - help->pitch) > 0) { /* Yes, then keep a record of it */ help->pitch = newPitch; } //--- #ifdef TEST_RAY effect.x = pos.x; effect.y = height; effect.z = pos.y; addEffect(&effect, EFFECT_EXPLOSION, EXPLOSION_TYPE_SMALL, false, NULL, 0); #endif } /* Not at edge yet - so exit */ return true; } /* We've hit edge of grid - so exit!! */ return false; }
void processLight(LIGHT *psLight) { SDWORD tileX,tileY; SDWORD startX,endX; SDWORD startY,endY; SDWORD rangeSkip; SDWORD i,j; SDWORD distToCorner; UDWORD percent; /* Firstly - there's no point processing lights that are off the grid */ if(clipXY(psLight->position.x,psLight->position.z) == false) { return; } tileX = psLight->position.x/TILE_UNITS; tileY = psLight->position.z/TILE_UNITS; rangeSkip = sqrtf(psLight->range * psLight->range * 2) / TILE_UNITS + 1; /* Rough guess? */ startX = tileX - rangeSkip; endX = tileX + rangeSkip; startY = tileY - rangeSkip; endY = tileY + rangeSkip; /* Clip to grid limits */ startX = MAX(startX, 0); endX = MAX(endX, 0); endX = MIN(endX, mapWidth - 1); startX = MIN(startX, endX); startY = MAX(startY, 0); endY = MAX(endY, 0); endY = MIN(endY, mapHeight - 1); startY = MIN(startY, endY); for(i=startX;i<=endX; i++) { for(j=startY; j<=endY; j++) { distToCorner = calcDistToTile(i,j,&psLight->position); /* If we're inside the range of the light */ if (distToCorner<(SDWORD)psLight->range) { /* Find how close we are to it */ percent = 100 - PERCENT(distToCorner,psLight->range); colourTile(i, j, psLight->colour, 2 * percent); } } } }
void atmosDrawParticles() { UDWORD i; if (weather == WT_NONE) { return; } /* Traverse the list */ for (i = 0; i < MAX_ATMOS_PARTICLES; i++) { /* Don't bother unless it's active */ if (asAtmosParts[i].status == APS_ACTIVE) { /* Is it on the grid */ if (clipXY(asAtmosParts[i].position.x, asAtmosParts[i].position.z)) { renderParticle(&asAtmosParts[i]); } } } }