Files
starruler-linux/source/game/scene/mesh_node.cpp
T
2018-07-17 14:15:37 +02:00

43 lines
1.2 KiB
C++

#include "scene/mesh_node.h"
#include "render/driver.h"
#include "render/render_mesh.h"
#include "render/vertexBuffer.h"
#include "frustum.h"
#include "physics/physics_world.h"
#include "aabbox.h"
#include "main/references.h"
namespace scene {
//Maximum distance away from the camera something can render (according to its scale)
const double MaxRenderDistFactor = 1400.0;
MeshNode::MeshNode(const render::RenderMesh* Mesh, const render::RenderState* Material)
: mesh(Mesh), material(Material) {
if(Material->baseMat != render::MAT_Solid)
setFlag(NF_Transparent, true);
setFlag(NF_AnimOnlyVisible, true);
}
bool MeshNode::preRender(render::RenderDriver& driver) {
auto fromCamera = abs_position + (driver.cam_facing * abs_scale) - driver.cam_pos;
sortDistance = fromCamera.getLength();
if(sortDistance > MaxRenderDistFactor * abs_scale || !driver.getViewFrustum().overlaps(abs_position,abs_scale))
return false;
else
return true;
}
void MeshNode::render(render::RenderDriver& driver) {
if(material->baseMat != render::MAT_Solid)
render::renderVertexBuffers();
driver.setTransformation(transformation);
driver.switchToRenderState(*material);
mesh->selectLOD(sortDistance / abs_scale)->render();
driver.resetTransformation();
}
};