bool OpenGLRenderer::renderBoundingVolumes(Object3D &object, Camera &camera, RenderTarget &renderTarget, bool showSphere, bool showAABB, bool showOOBB) { if (showSphere) { if (renderBoundingSphere(object.getBoundingSphere(), object.getPosition(), glm::vec3(1.0f, 0.0f, 0.0f), camera, renderTarget) == false) { return false; } } if (showAABB) { if (renderBoundingBox(object.getAABB(), glm::mat4(1.0f), glm::vec3(0.0f, 1.0f, 0.0f), camera, renderTarget) == false) { return false; } } if (showOOBB) { if (renderBoundingBox(object.getOOBB(), object.getModelMatrix(), glm::vec3(0.0f, 0.0f, 1.0f), camera, renderTarget) == false) { return false; } } return true; }
void World::update(float dt) { Player* player = NULL; // Update all the objects. for(int i = 0; i < mObjectList.size(); i++) { Object3D* object = mObjectList[i]; // Remove from the list if dead. if(!object->getAlive()) { // Inform the current wave about the dead enemy. [TODO] Check if we are in PlayState. if(object->getType() == ENEMY) PlayState::Instance()->getCurrentWave()->enemyKilled(); removeObject(object); continue; } // Get the distance above the ground. float distance = object->getPosition().y - mTerrain->getHeight(object->getPosition().x, object->getPosition().z); // Snap to ground. // Note the +50 to give it some margin (only for enemies). float margin = object->getType() != PLAYER ? 50 : 0; if(distance < object->getHeightOffset() + margin && object->getVelocity().y <= 0) { object->setPosition(object->getPosition() - D3DXVECTOR3(0, distance, 0) + D3DXVECTOR3(0, object->getHeightOffset(), 0)); object->setVelocity(D3DXVECTOR3(object->getVelocity().x, 0, object->getVelocity().z)); } // Set on ground. if(distance < object->getHeightOffset() + 0.2) object->setOnGround(true); else object->setOnGround(false); // Update the object. object->update(dt); // Gravity. object->accelerate(0, getGravity(), 0); // Friction. if(object->getOnGround()) { D3DXVECTOR3 norm; D3DXVec3Normalize(&norm, &object->getVelocity()); D3DXVECTOR3 velocity = norm * mFriction * object->getFriction();//object->getVelocity() object->accelerate(velocity.x, 0.0f, velocity.z); } // Move the object with it's speed. // [NOTE] Only update the objects position here! Change the speed on other places instead! D3DXVECTOR3 speed = object->getVelocity(); object->move(speed.x, speed.y, speed.z); if(object->getType() == PLAYER) player = dynamic_cast<Player*>(object); } // [HACK] // Test if player is in range of a powerup. if(player != NULL) { for(int i = 0; i < mObjectList.size(); i++) { if(mObjectList[i]->getType() == ENERGY_POWERUP) { D3DXVECTOR3 dist = mObjectList[i]->getPosition() - player->getPosition(); dist.y = 0.0f; float d = sqrt(dist.x*dist.x + dist.z*dist.z); if(d < 70) // PICKUP_RADIUS (dynamic_cast<Powerup*>(mObjectList[i]))->pickup(player); } else continue; } } // Terrain editing. // [NOTE] Disabled. //editTerrain(); }