43 lines
1.2 KiB
C++
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();
|
|
}
|
|
|
|
};
|