Open source Star Ruler 2 source code!
This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
#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();
|
||||
}
|
||||
|
||||
};
|
||||
Reference in New Issue
Block a user