/* add an object to the current render list */ void bucketAddTypeToList(RENDER_TYPE objectType, void* pObject) { BUCKET_TAG newTag; int32_t z; bool useCalculateZ = false; switch (objectType) { case RENDER_EFFECT: switch (((EFFECT*)pObject)->group) { case EFFECT_EXPLOSION: case EFFECT_CONSTRUCTION: case EFFECT_SMOKE: case EFFECT_FIREWORK: useCalculateZ = true; break; default: break; } break; case RENDER_SHADOW: case RENDER_PROJECTILE: case RENDER_PROXMSG: useCalculateZ = true; break; default: break; } // NOTE bucketCalculateState calls bucketCalculateZ, don't know why not just use bucketCalculateZ. z = useCalculateZ ? bucketCalculateZ(objectType, pObject) : bucketCalculateState(objectType, pObject); if (z < 0) { /* Object will not be render - has been clipped! */ if(objectType == RENDER_DROID || objectType == RENDER_STRUCTURE) { /* Won't draw selection boxes */ ((BASE_OBJECT *)pObject)->sDisplay.frameNumber = 0; } return; } //put the object data into the tag newTag.objectType = objectType; newTag.pObject = pObject; newTag.actualZ = z; //add tag to bucketArray bucketArray.push_back(newTag); }
static SDWORD bucketCalculateState(RENDER_TYPE objectType, void* pObject) { SDWORD z = 0; const iIMDShape* pie; if (bucketCalculateZ(objectType,pObject) < 0) { return -1; } switch(objectType) { case RENDER_EFFECT: switch(((EFFECT*)pObject)->group) { case EFFECT_WAYPOINT: case EFFECT_EXPLOSION: case EFFECT_CONSTRUCTION: pie = ((EFFECT*)pObject)->imd; z = INT32_MAX - pie->texpage; break; case EFFECT_SMOKE: case EFFECT_GRAVITON: case EFFECT_BLOOD: case EFFECT_STRUCTURE: case EFFECT_DESTRUCTION: default: z = INT32_MAX - 42; break; } break; case RENDER_DROID: pie = BODY_IMD(((DROID*)pObject),0); z = INT32_MAX - pie->texpage; break; case RENDER_STRUCTURE: pie = ((STRUCTURE*)pObject)->sDisplay.imd; z = INT32_MAX - pie->texpage; break; case RENDER_FEATURE: pie = ((FEATURE*)pObject)->sDisplay.imd; z = INT32_MAX - pie->texpage; break; case RENDER_PROXMSG: z = INT32_MAX - 40; break; case RENDER_PROJECTILE: pie = ((PROJECTILE*)pObject)->psWStats->pInFlightGraphic; z = INT32_MAX - pie->texpage; break; case RENDER_ANIMATION: pie = ((COMPONENT_OBJECT*)pObject)->psShape; z = INT32_MAX - pie->texpage; break; case RENDER_DELIVPOINT: pie = pAssemblyPointIMDs[((FLAG_POSITION*)pObject)-> factoryType][((FLAG_POSITION*)pObject)->factoryInc]; z = INT32_MAX - pie->texpage; break; default: break; } return z; }
/* add an object to the current render list */ void bucketAddTypeToList(RENDER_TYPE objectType, void *pObject, const glm::mat4 &viewMatrix) { const iIMDShape *pie; BUCKET_TAG newTag; int32_t z = bucketCalculateZ(objectType, pObject, viewMatrix); if (z < 0) { /* Object will not be render - has been clipped! */ if (objectType == RENDER_DROID || objectType == RENDER_STRUCTURE) { /* Won't draw selection boxes */ ((BASE_OBJECT *)pObject)->sDisplay.frameNumber = 0; } return; } switch (objectType) { case RENDER_EFFECT: switch (((EFFECT *)pObject)->group) { case EFFECT_EXPLOSION: case EFFECT_CONSTRUCTION: case EFFECT_SMOKE: case EFFECT_FIREWORK: // Use calculated Z break; case EFFECT_WAYPOINT: pie = ((EFFECT *)pObject)->imd; z = INT32_MAX - pie->texpage; break; default: z = INT32_MAX - 42; break; } break; case RENDER_DROID: pie = BODY_IMD(((DROID *)pObject), 0); z = INT32_MAX - pie->texpage; break; case RENDER_STRUCTURE: pie = ((STRUCTURE *)pObject)->sDisplay.imd; z = INT32_MAX - pie->texpage; break; case RENDER_FEATURE: pie = ((FEATURE *)pObject)->sDisplay.imd; z = INT32_MAX - pie->texpage; break; case RENDER_DELIVPOINT: pie = pAssemblyPointIMDs[((FLAG_POSITION *)pObject)-> factoryType][((FLAG_POSITION *)pObject)->factoryInc]; z = INT32_MAX - pie->texpage; break; case RENDER_PARTICLE: z = 0; break; default: // Use calculated Z break; } //put the object data into the tag newTag.objectType = objectType; newTag.pObject = pObject; newTag.actualZ = z; //add tag to bucketArray bucketArray.push_back(newTag); }