mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 03:17:02 +02:00
Proxies render in Batch
This commit is contained in:
parent
16e6f76028
commit
72bf160845
2 changed files with 43 additions and 76 deletions
|
@ -578,57 +578,36 @@ const FBXGeometry* EntityTreeRenderer::getCollisionGeometryForEntity(const Entit
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void EntityTreeRenderer::renderElementProxy(EntityTreeElement* entityTreeElement) {
|
void EntityTreeRenderer::renderElementProxy(EntityTreeElement* entityTreeElement, RenderArgs* args) {
|
||||||
|
auto deferredLighting = DependencyManager::get<DeferredLightingEffect>();
|
||||||
|
Q_ASSERT(args->_batch);
|
||||||
|
gpu::Batch& batch = *args->_batch;
|
||||||
|
Transform transform;
|
||||||
|
|
||||||
glm::vec3 elementCenter = entityTreeElement->getAACube().calcCenter();
|
glm::vec3 elementCenter = entityTreeElement->getAACube().calcCenter();
|
||||||
float elementSize = entityTreeElement->getScale();
|
float elementSize = entityTreeElement->getScale();
|
||||||
glPushMatrix();
|
|
||||||
glTranslatef(elementCenter.x, elementCenter.y, elementCenter.z);
|
auto drawWireCube = [&](glm::vec3 offset, float size, glm::vec4 color) {
|
||||||
DependencyManager::get<DeferredLightingEffect>()->renderWireCube(elementSize, glm::vec4(1.0f, 0.0f, 0.0f, 1.0f));
|
transform.setTranslation(elementCenter + offset);
|
||||||
glPopMatrix();
|
batch.setModelTransform(transform);
|
||||||
|
deferredLighting->renderWireCube(batch, size, color);
|
||||||
|
};
|
||||||
|
|
||||||
|
drawWireCube(glm::vec3(), elementSize, glm::vec4(1.0f, 0.0f, 0.0f, 1.0f));
|
||||||
|
|
||||||
if (_displayElementChildProxies) {
|
if (_displayElementChildProxies) {
|
||||||
// draw the children
|
// draw the children
|
||||||
float halfSize = elementSize / 2.0f;
|
float halfSize = elementSize / 2.0f;
|
||||||
float quarterSize = elementSize / 4.0f;
|
float quarterSize = elementSize / 4.0f;
|
||||||
glPushMatrix();
|
|
||||||
glTranslatef(elementCenter.x - quarterSize, elementCenter.y - quarterSize, elementCenter.z - quarterSize);
|
drawWireCube(glm::vec3(-quarterSize, -quarterSize, -quarterSize), halfSize, glm::vec4(1.0f, 1.0f, 0.0f, 1.0f));
|
||||||
DependencyManager::get<DeferredLightingEffect>()->renderWireCube(halfSize, glm::vec4(1.0f, 1.0f, 0.0f, 1.0f));
|
drawWireCube(glm::vec3(quarterSize, -quarterSize, -quarterSize), halfSize, glm::vec4(1.0f, 0.0f, 1.0f, 1.0f));
|
||||||
glPopMatrix();
|
drawWireCube(glm::vec3(-quarterSize, quarterSize, -quarterSize), halfSize, glm::vec4(0.0f, 1.0f, 0.0f, 1.0f));
|
||||||
|
drawWireCube(glm::vec3(-quarterSize, -quarterSize, quarterSize), halfSize, glm::vec4(0.0f, 0.0f, 1.0f, 1.0f));
|
||||||
glPushMatrix();
|
drawWireCube(glm::vec3(quarterSize, quarterSize, quarterSize), halfSize, glm::vec4(1.0f, 1.0f, 1.0f, 1.0f));
|
||||||
glTranslatef(elementCenter.x + quarterSize, elementCenter.y - quarterSize, elementCenter.z - quarterSize);
|
drawWireCube(glm::vec3(-quarterSize, quarterSize, quarterSize), halfSize, glm::vec4(0.0f, 0.5f, 0.5f, 1.0f));
|
||||||
DependencyManager::get<DeferredLightingEffect>()->renderWireCube(halfSize, glm::vec4(1.0f, 0.0f, 1.0f, 1.0f));
|
drawWireCube(glm::vec3(quarterSize, -quarterSize, quarterSize), halfSize, glm::vec4(0.5f, 0.0f, 0.0f, 1.0f));
|
||||||
glPopMatrix();
|
drawWireCube(glm::vec3(quarterSize, quarterSize, -quarterSize), halfSize, glm::vec4(0.0f, 0.5f, 0.0f, 1.0f));
|
||||||
|
|
||||||
glPushMatrix();
|
|
||||||
glTranslatef(elementCenter.x - quarterSize, elementCenter.y + quarterSize, elementCenter.z - quarterSize);
|
|
||||||
DependencyManager::get<DeferredLightingEffect>()->renderWireCube(halfSize, glm::vec4(0.0f, 1.0f, 0.0f, 1.0f));
|
|
||||||
glPopMatrix();
|
|
||||||
|
|
||||||
glPushMatrix();
|
|
||||||
glTranslatef(elementCenter.x - quarterSize, elementCenter.y - quarterSize, elementCenter.z + quarterSize);
|
|
||||||
DependencyManager::get<DeferredLightingEffect>()->renderWireCube(halfSize, glm::vec4(0.0f, 0.0f, 1.0f, 1.0f));
|
|
||||||
glPopMatrix();
|
|
||||||
|
|
||||||
glPushMatrix();
|
|
||||||
glTranslatef(elementCenter.x + quarterSize, elementCenter.y + quarterSize, elementCenter.z + quarterSize);
|
|
||||||
DependencyManager::get<DeferredLightingEffect>()->renderWireCube(halfSize, glm::vec4(1.0f, 1.0f, 1.0f, 1.0f));
|
|
||||||
glPopMatrix();
|
|
||||||
|
|
||||||
glPushMatrix();
|
|
||||||
glTranslatef(elementCenter.x - quarterSize, elementCenter.y + quarterSize, elementCenter.z + quarterSize);
|
|
||||||
DependencyManager::get<DeferredLightingEffect>()->renderWireCube(halfSize, glm::vec4(0.0f, 0.5f, 0.5f, 1.0f));
|
|
||||||
glPopMatrix();
|
|
||||||
|
|
||||||
glPushMatrix();
|
|
||||||
glTranslatef(elementCenter.x + quarterSize, elementCenter.y - quarterSize, elementCenter.z + quarterSize);
|
|
||||||
DependencyManager::get<DeferredLightingEffect>()->renderWireCube(halfSize, glm::vec4(0.5f, 0.0f, 0.0f, 1.0f));
|
|
||||||
glPopMatrix();
|
|
||||||
|
|
||||||
glPushMatrix();
|
|
||||||
glTranslatef(elementCenter.x + quarterSize, elementCenter.y + quarterSize, elementCenter.z - quarterSize);
|
|
||||||
DependencyManager::get<DeferredLightingEffect>()->renderWireCube(halfSize, glm::vec4(0.0f, 0.5f, 0.0f, 1.0f));
|
|
||||||
glPopMatrix();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -645,43 +624,31 @@ void EntityTreeRenderer::renderProxies(const EntityItem* entity, RenderArgs* arg
|
||||||
glm::vec3 minCenter = minCube.calcCenter();
|
glm::vec3 minCenter = minCube.calcCenter();
|
||||||
glm::vec3 entityBoxCenter = entityBox.calcCenter();
|
glm::vec3 entityBoxCenter = entityBox.calcCenter();
|
||||||
glm::vec3 entityBoxScale = entityBox.getScale();
|
glm::vec3 entityBoxScale = entityBox.getScale();
|
||||||
|
|
||||||
|
auto deferredLighting = DependencyManager::get<DeferredLightingEffect>();
|
||||||
|
Q_ASSERT(args->_batch);
|
||||||
|
gpu::Batch& batch = *args->_batch;
|
||||||
|
Transform transform;
|
||||||
|
|
||||||
// draw the max bounding cube
|
// draw the max bounding cube
|
||||||
glPushMatrix();
|
transform.setTranslation(maxCenter);
|
||||||
glTranslatef(maxCenter.x, maxCenter.y, maxCenter.z);
|
batch.setModelTransform(transform);
|
||||||
DependencyManager::get<DeferredLightingEffect>()->renderWireCube(maxCube.getScale(), glm::vec4(1.0f, 1.0f, 0.0f, 1.0f));
|
deferredLighting->renderWireCube(batch, maxCube.getScale(), glm::vec4(1.0f, 1.0f, 0.0f, 1.0f));
|
||||||
glPopMatrix();
|
|
||||||
|
|
||||||
// draw the min bounding cube
|
// draw the min bounding cube
|
||||||
glPushMatrix();
|
transform.setTranslation(minCenter);
|
||||||
glTranslatef(minCenter.x, minCenter.y, minCenter.z);
|
batch.setModelTransform(transform);
|
||||||
DependencyManager::get<DeferredLightingEffect>()->renderWireCube(minCube.getScale(), glm::vec4(0.0f, 1.0f, 0.0f, 1.0f));
|
deferredLighting->renderWireCube(batch, minCube.getScale(), glm::vec4(0.0f, 1.0f, 0.0f, 1.0f));
|
||||||
glPopMatrix();
|
|
||||||
|
|
||||||
// draw the entityBox bounding box
|
// draw the entityBox bounding box
|
||||||
glPushMatrix();
|
transform.setTranslation(entityBoxCenter);
|
||||||
glTranslatef(entityBoxCenter.x, entityBoxCenter.y, entityBoxCenter.z);
|
transform.setScale(entityBoxScale);
|
||||||
glScalef(entityBoxScale.x, entityBoxScale.y, entityBoxScale.z);
|
batch.setModelTransform(transform);
|
||||||
DependencyManager::get<DeferredLightingEffect>()->renderWireCube(1.0f, glm::vec4(0.0f, 0.0f, 1.0f, 1.0f));
|
deferredLighting->renderWireCube(batch, 1.0f, glm::vec4(0.0f, 0.0f, 1.0f, 1.0f));
|
||||||
glPopMatrix();
|
|
||||||
|
|
||||||
|
// Rotated bounding box
|
||||||
glm::vec3 position = entity->getPosition();
|
batch.setModelTransform(entity->getTransformToCenter());
|
||||||
glm::vec3 center = entity->getCenterPosition();
|
deferredLighting->renderWireCube(batch, 1.0f, glm::vec4(1.0f, 0.0f, 1.0f, 1.0f));
|
||||||
glm::vec3 dimensions = entity->getDimensions();
|
|
||||||
glm::quat rotation = entity->getRotation();
|
|
||||||
|
|
||||||
glPushMatrix();
|
|
||||||
glTranslatef(position.x, position.y, position.z);
|
|
||||||
glm::vec3 axis = glm::axis(rotation);
|
|
||||||
glRotatef(glm::degrees(glm::angle(rotation)), axis.x, axis.y, axis.z);
|
|
||||||
glPushMatrix();
|
|
||||||
glm::vec3 positionToCenter = center - position;
|
|
||||||
glTranslatef(positionToCenter.x, positionToCenter.y, positionToCenter.z);
|
|
||||||
glScalef(dimensions.x, dimensions.y, dimensions.z);
|
|
||||||
DependencyManager::get<DeferredLightingEffect>()->renderWireCube(1.0f, glm::vec4(1.0f, 0.0f, 1.0f, 1.0f));
|
|
||||||
glPopMatrix();
|
|
||||||
glPopMatrix();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -699,7 +666,7 @@ void EntityTreeRenderer::renderElement(OctreeElement* element, RenderArgs* args)
|
||||||
bool isShadowMode = args->_renderMode == RenderArgs::SHADOW_RENDER_MODE;
|
bool isShadowMode = args->_renderMode == RenderArgs::SHADOW_RENDER_MODE;
|
||||||
|
|
||||||
if (!isShadowMode && _displayModelElementProxy && numberOfEntities > 0) {
|
if (!isShadowMode && _displayModelElementProxy && numberOfEntities > 0) {
|
||||||
renderElementProxy(entityTreeElement);
|
renderElementProxy(entityTreeElement, args);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (uint16_t i = 0; i < numberOfEntities; i++) {
|
for (uint16_t i = 0; i < numberOfEntities; i++) {
|
||||||
|
|
|
@ -126,7 +126,7 @@ protected:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void applyZonePropertiesToScene(const ZoneEntityItem* zone);
|
void applyZonePropertiesToScene(const ZoneEntityItem* zone);
|
||||||
void renderElementProxy(EntityTreeElement* entityTreeElement);
|
void renderElementProxy(EntityTreeElement* entityTreeElement, RenderArgs* args);
|
||||||
void checkAndCallPreload(const EntityItemID& entityID);
|
void checkAndCallPreload(const EntityItemID& entityID);
|
||||||
void checkAndCallUnload(const EntityItemID& entityID);
|
void checkAndCallUnload(const EntityItemID& entityID);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue