Files
academy2/modules/world/direct_lod_multimesh.cpp
2021-07-31 03:37:28 +03:00

172 lines
4.5 KiB
C++

#include <scene/resources/world.h>
#include "direct_lod_multimesh.h"
void LodMultiMesh3D::set_mesh(int id, Ref<Mesh> mesh)
{
meshes[id] = mesh;
VisualServer::get_singleton()->instance_set_visible(multimeshes[id].instance, false);
if (!mesh.is_null())
VisualServer::get_singleton()->multimesh_set_mesh(multimeshes[id].id, mesh->get_rid());
else
VisualServer::get_singleton()->multimesh_set_mesh(multimeshes[id].id, RID());
VisualServer::get_singleton()->instance_set_visible(multimeshes[id].instance, true);
}
Ref<Mesh> LodMultiMesh3D::get_mesh(int id) const
{
return meshes[id];
}
void LodMultiMesh3D::set_instance_count(int id, int count)
{
VisualServer::get_singleton()->multimesh_allocate(multimeshes[id].id,
count, VS::MULTIMESH_TRANSFORM_3D,
VS::MultimeshColorFormat(color_format),
VS::MultimeshCustomDataFormat(custom_data_format));
multimeshes[id].instance_count = count;
}
int LodMultiMesh3D::get_instance_count(int id) const
{
return multimeshes[id].instance_count;
}
void LodMultiMesh3D::set_visible_instance_count(int id, int count)
{
ERR_FAIL_COND(count < -1);
VisualServer::get_singleton()->multimesh_set_visible_instances(multimeshes[id].id, count);
multimeshes[id].visible_instance_count = count;
}
int LodMultiMesh3D::get_visible_instance_count(int id) const
{
return multimeshes[id].visible_instance_count;
}
void LodMultiMesh3D::set_instance_transform(int id, int instance, const Transform &xform) {
VisualServer::get_singleton()->multimesh_instance_set_transform(multimeshes[id].id,
instance, xform);
}
LodMultiMesh3D::LodMultiMesh3D()
{
custom_data_format = CUSTOM_DATA_8BIT;
color_format = COLOR_FLOAT;
}
LodMultiMesh3D::~LodMultiMesh3D()
{
List<struct multimesh_data>::Element *e =
multimeshes.front();
while(e) {
const struct multimesh_data &md = e->get();
VisualServer::get_singleton()->instance_set_scenario(md.instance, RID());
VisualServer::get_singleton()->free(md.id);
e = e->next();
}
}
void LodMultiMesh3D::add_mesh(Ref<Mesh> mesh)
{
struct multimesh_data md;
md.id = VisualServer::get_singleton()->multimesh_create();
md.instance = VisualServer::get_singleton()->instance_create();
if (mesh.ptr())
VisualServer::get_singleton()->multimesh_set_mesh(md.id, mesh->get_rid());
else
VisualServer::get_singleton()->multimesh_set_mesh(md.id, RID());
VisualServer::get_singleton()->instance_set_base(md.instance, md.id);
md.instance_count = 0;
md.visible_instance_count = -1;
md.lod_decimator = 1;
VisualServer::get_singleton()->instance_set_visible(md.instance, true);
multimeshes.push_back(md);
}
void LodMultiMesh3D::set_instance_color(int id, int instance, const Color &color) {
VisualServer::get_singleton()->multimesh_instance_set_color(
multimeshes[id].id, instance, color);
}
Color LodMultiMesh3D::get_instance_color(int id, int instance) const
{
return VisualServer::get_singleton()->multimesh_instance_get_color(multimeshes[id].id, instance);
}
void LodMultiMesh3D::hide()
{
List<struct multimesh_data>::Element *e =
multimeshes.front();
while(e) {
const struct multimesh_data &md = e->get();
VS::get_singleton()->instance_set_visible(md.instance, false);
e = e->next();
}
visible = false;
}
void LodMultiMesh3D::show()
{
List<struct multimesh_data>::Element *e =
multimeshes.front();
while(e) {
const struct multimesh_data &md = e->get();
VS::get_singleton()->instance_set_visible(md.instance, true);
e = e->next();
}
visible = true;
}
bool LodMultiMesh3D::is_visible() const
{
return visible;
}
void LodMultiMesh3D::set_global_transform(const Transform &xform)
{
xf = xform;
List<struct multimesh_data>::Element *e =
multimeshes.front();
while(e) {
const struct multimesh_data &md = e->get();
VisualServer::get_singleton()->instance_set_transform(md.instance, xf);
e = e->next();
}
}
Transform LodMultiMesh3D::get_global_transform() const
{
return xf;
}
void LodMultiMesh3D::set_world(const World *world)
{
List<struct multimesh_data>::Element *e =
multimeshes.front();
RID r;
if (world)
r = world->get_scenario();
while(e) {
const struct multimesh_data &md = e->get();
VisualServer::get_singleton()->instance_set_scenario(md.instance, r);
e = e->next();
}
}
AABB LodMultiMesh3D::get_aabb(int id) const
{
return VisualServer::get_singleton()->multimesh_get_aabb(multimeshes[id].id);
}
Vector3 LodMultiMesh3D::get_center() const
{
AABB r;
int i;
for (i = 0; i < multimeshes.size(); i++)
r.merge_with(get_aabb(i));
return r.position + r.size *0.5f + get_global_transform().origin;
}