mirror of
https://github.com/Relintai/terraman_2d.git
synced 2024-11-12 10:15:18 +01:00
Added convenience method for just allocating one mesh and switched to it everywhere. Now meshes are actually visible.
This commit is contained in:
parent
2a778660c9
commit
d47a87934b
@ -262,7 +262,6 @@ void Terrain2DChunkDefault::meshes_create(const int mesh_index, const int mesh_c
|
||||
ERR_FAIL_COND(m.has(MESH_TYPE_INDEX_MESH));
|
||||
|
||||
Array am;
|
||||
Array ami;
|
||||
|
||||
for (int i = 0; i < mesh_count; ++i) {
|
||||
RID mesh_rid = VS::get_singleton()->mesh_create();
|
||||
@ -296,6 +295,41 @@ void Terrain2DChunkDefault::meshes_free(const int mesh_index) {
|
||||
m.erase(MESH_TYPE_INDEX_MESH);
|
||||
}
|
||||
|
||||
void Terrain2DChunkDefault::mesh_create(const int mesh_index) {
|
||||
ERR_FAIL_COND(_voxel_world == NULL);
|
||||
ERR_FAIL_COND(!get_library().is_valid());
|
||||
|
||||
if (!_rids.has(mesh_index))
|
||||
_rids[mesh_index] = Dictionary();
|
||||
|
||||
Dictionary m = _rids[mesh_index];
|
||||
|
||||
ERR_FAIL_COND(m.has(MESH_TYPE_INDEX_MESH));
|
||||
|
||||
RID mesh_rid = VS::get_singleton()->mesh_create();
|
||||
|
||||
m[MESH_TYPE_INDEX_MESH] = mesh_rid;
|
||||
|
||||
_rids[mesh_index] = m;
|
||||
}
|
||||
void Terrain2DChunkDefault::mesh_free(const int mesh_index) {
|
||||
if (!_rids.has(mesh_index))
|
||||
return;
|
||||
|
||||
Dictionary m = _rids[mesh_index];
|
||||
RID rid;
|
||||
|
||||
if (m.has(MESH_TYPE_INDEX_MESH)) {
|
||||
RID r = m[MESH_TYPE_INDEX_MESH];
|
||||
|
||||
if (r != rid) {
|
||||
VS::get_singleton()->free(r);
|
||||
}
|
||||
}
|
||||
|
||||
m.erase(MESH_TYPE_INDEX_MESH);
|
||||
}
|
||||
|
||||
void Terrain2DChunkDefault::colliders_create(const int mesh_index, const int layer_mask) {
|
||||
/*
|
||||
ERR_FAIL_COND(_voxel_world == NULL);
|
||||
@ -405,6 +439,7 @@ void Terrain2DChunkDefault::colliders_free(const int mesh_index) {
|
||||
|
||||
void Terrain2DChunkDefault::free_index(const int mesh_index) {
|
||||
meshes_free(mesh_index);
|
||||
mesh_free(mesh_index);
|
||||
colliders_free(mesh_index);
|
||||
}
|
||||
|
||||
@ -842,6 +877,8 @@ void Terrain2DChunkDefault::_bind_methods() {
|
||||
|
||||
ClassDB::bind_method(D_METHOD("meshes_create", "mesh_index", "mesh_count"), &Terrain2DChunkDefault::meshes_create);
|
||||
ClassDB::bind_method(D_METHOD("meshes_free", "mesh_index"), &Terrain2DChunkDefault::meshes_free);
|
||||
ClassDB::bind_method(D_METHOD("mesh_create", "mesh_index"), &Terrain2DChunkDefault::mesh_create);
|
||||
ClassDB::bind_method(D_METHOD("mesh_free", "mesh_index"), &Terrain2DChunkDefault::mesh_free);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("create_colliders", "mesh_index", "layer_mask"), &Terrain2DChunkDefault::colliders_create, DEFVAL(1));
|
||||
ClassDB::bind_method(D_METHOD("free_colliders", "mesh_index"), &Terrain2DChunkDefault::colliders_free);
|
||||
|
@ -128,6 +128,8 @@ public:
|
||||
|
||||
void meshes_create(const int mesh_index, const int mesh_count);
|
||||
void meshes_free(const int mesh_index);
|
||||
void mesh_create(const int mesh_index);
|
||||
void mesh_free(const int mesh_index);
|
||||
|
||||
void colliders_create(const int mesh_index, const int layer_mask = 1);
|
||||
void colliders_create_area(const int mesh_index, const int layer_mask = 1);
|
||||
|
@ -100,13 +100,13 @@ void Terrain2DProp2DJob::phase_physics_process() {
|
||||
}
|
||||
*/
|
||||
#endif
|
||||
/*
|
||||
#if TOOLS_ENABLED
|
||||
if (SceneTree::get_singleton()->is_debugging_collisions_hint() && chunk->collider_get_count() > 0) {
|
||||
chunk->draw_debug_mdr_colliders();
|
||||
}
|
||||
#endif
|
||||
*/
|
||||
/*
|
||||
#if TOOLS_ENABLED
|
||||
if (SceneTree::get_singleton()->is_debugging_collisions_hint() && chunk->collider_get_count() > 0) {
|
||||
chunk->draw_debug_mdr_colliders();
|
||||
}
|
||||
#endif
|
||||
*/
|
||||
set_build_phase_type(BUILD_PHASE_TYPE_NORMAL);
|
||||
next_phase();
|
||||
}
|
||||
@ -321,28 +321,23 @@ void Terrain2DProp2DJob::phase_steps() {
|
||||
|
||||
//set up the meshes
|
||||
if (should_do()) {
|
||||
RID mesh_rid = chunk->mesh_rid_get_index(Terrain2DChunkDefault::MESH_INDEX_PROP, Terrain2DChunkDefault::MESH_TYPE_INDEX_MESH, 0);
|
||||
RID mesh_rid = chunk->mesh_rid_get(Terrain2DChunkDefault::MESH_INDEX_PROP, Terrain2DChunkDefault::MESH_TYPE_INDEX_MESH);
|
||||
|
||||
if (mesh_rid == RID()) {
|
||||
//need to allocate the meshes
|
||||
|
||||
//allocate
|
||||
chunk->meshes_create(Terrain2DChunkDefault::MESH_INDEX_PROP, 1);
|
||||
chunk->mesh_create(Terrain2DChunkDefault::MESH_INDEX_PROP);
|
||||
|
||||
} else {
|
||||
//we have the meshes, just clear
|
||||
int count = chunk->mesh_rid_get_count(Terrain2DChunkDefault::MESH_INDEX_PROP, Terrain2DChunkDefault::MESH_TYPE_INDEX_MESH);
|
||||
mesh_rid = chunk->mesh_rid_get(Terrain2DChunkDefault::MESH_INDEX_PROP, Terrain2DChunkDefault::MESH_TYPE_INDEX_MESH);
|
||||
|
||||
for (int i = 0; i < count; ++i) {
|
||||
mesh_rid = chunk->mesh_rid_get_index(Terrain2DChunkDefault::MESH_INDEX_PROP, Terrain2DChunkDefault::MESH_TYPE_INDEX_MESH, i);
|
||||
|
||||
if (VS::get_singleton()->mesh_get_surface_count(mesh_rid) > 0)
|
||||
if (VS::get_singleton()->mesh_get_surface_count(mesh_rid) > 0)
|
||||
#if !GODOT4
|
||||
VS::get_singleton()->mesh_remove_surface(mesh_rid, 0);
|
||||
VS::get_singleton()->mesh_remove_surface(mesh_rid, 0);
|
||||
#else
|
||||
VS::get_singleton()->mesh_clear(mesh_rid);
|
||||
VS::get_singleton()->mesh_clear(mesh_rid);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -362,7 +357,7 @@ void Terrain2DProp2DJob::step_type_normal() {
|
||||
|
||||
temp_mesh_arr = _prop_mesher->build_mesh();
|
||||
|
||||
RID mesh_rid = chunk->mesh_rid_get_index(Terrain2DChunkDefault::MESH_INDEX_PROP, Terrain2DChunkDefault::MESH_TYPE_INDEX_MESH, 0);
|
||||
RID mesh_rid = chunk->mesh_rid_get(Terrain2DChunkDefault::MESH_INDEX_PROP, Terrain2DChunkDefault::MESH_TYPE_INDEX_MESH);
|
||||
|
||||
VS::get_singleton()->mesh_add_surface_from_arrays(mesh_rid, VisualServer::PRIMITIVE_TRIANGLES, temp_mesh_arr);
|
||||
}
|
||||
|
@ -226,19 +226,19 @@ void Terrain2DTerrain2DJob::phase_terrain_mesh() {
|
||||
|
||||
//set up the meshes
|
||||
if (should_do()) {
|
||||
RID mesh_rid = chunk->mesh_rid_get_index(Terrain2DChunkDefault::MESH_INDEX_TERRAIN, Terrain2DChunkDefault::MESH_TYPE_INDEX_MESH, 0);
|
||||
RID mesh_rid = chunk->mesh_rid_get(Terrain2DChunkDefault::MESH_INDEX_TERRAIN, Terrain2DChunkDefault::MESH_TYPE_INDEX_MESH);
|
||||
|
||||
if (mesh_rid == RID()) {
|
||||
//need to allocate the meshes
|
||||
//allocate
|
||||
chunk->meshes_create(Terrain2DChunkDefault::MESH_INDEX_TERRAIN, 1);
|
||||
chunk->mesh_create(Terrain2DChunkDefault::MESH_INDEX_TERRAIN);
|
||||
|
||||
} else {
|
||||
//we have the meshes, just clear
|
||||
int count = chunk->mesh_rid_get_count(Terrain2DChunkDefault::MESH_INDEX_TERRAIN, Terrain2DChunkDefault::MESH_TYPE_INDEX_MESH);
|
||||
|
||||
for (int i = 0; i < count; ++i) {
|
||||
mesh_rid = chunk->mesh_rid_get_index(Terrain2DChunkDefault::MESH_INDEX_TERRAIN, Terrain2DChunkDefault::MESH_TYPE_INDEX_MESH, i);
|
||||
mesh_rid = chunk->mesh_rid_get(Terrain2DChunkDefault::MESH_INDEX_TERRAIN, Terrain2DChunkDefault::MESH_TYPE_INDEX_MESH);
|
||||
|
||||
if (VS::get_singleton()->mesh_get_surface_count(mesh_rid) > 0)
|
||||
#if !GODOT4
|
||||
@ -261,13 +261,13 @@ void Terrain2DTerrain2DJob::phase_terrain_mesh() {
|
||||
}
|
||||
}
|
||||
|
||||
RID mesh_rid = chunk->mesh_rid_get_index(Terrain2DChunkDefault::MESH_INDEX_LIQUID, Terrain2DChunkDefault::MESH_TYPE_INDEX_MESH, 0);
|
||||
RID mesh_rid = chunk->mesh_rid_get(Terrain2DChunkDefault::MESH_INDEX_LIQUID, Terrain2DChunkDefault::MESH_TYPE_INDEX_MESH);
|
||||
|
||||
if (should_do()) {
|
||||
if (mesh_rid == RID()) {
|
||||
chunk->meshes_create(Terrain2DChunkDefault::MESH_INDEX_LIQUID, 1);
|
||||
chunk->mesh_create(Terrain2DChunkDefault::MESH_INDEX_LIQUID);
|
||||
|
||||
mesh_rid = chunk->mesh_rid_get_index(Terrain2DChunkDefault::MESH_INDEX_LIQUID, Terrain2DChunkDefault::MESH_TYPE_INDEX_MESH, 0);
|
||||
mesh_rid = chunk->mesh_rid_get(Terrain2DChunkDefault::MESH_INDEX_LIQUID, Terrain2DChunkDefault::MESH_TYPE_INDEX_MESH);
|
||||
}
|
||||
|
||||
if (VS::get_singleton()->mesh_get_surface_count(mesh_rid) > 0)
|
||||
@ -364,7 +364,7 @@ void Terrain2DTerrain2DJob::step_type_normal() {
|
||||
|
||||
temp_mesh_arr = _mesher->build_mesh();
|
||||
|
||||
RID mesh_rid = chunk->mesh_rid_get_index(Terrain2DChunkDefault::MESH_INDEX_TERRAIN, Terrain2DChunkDefault::MESH_TYPE_INDEX_MESH, 0);
|
||||
RID mesh_rid = chunk->mesh_rid_get(Terrain2DChunkDefault::MESH_INDEX_TERRAIN, Terrain2DChunkDefault::MESH_TYPE_INDEX_MESH);
|
||||
|
||||
VS::get_singleton()->mesh_add_surface_from_arrays(mesh_rid, VisualServer::PRIMITIVE_TRIANGLES, temp_mesh_arr);
|
||||
}
|
||||
|
@ -277,6 +277,8 @@ void Terrain2DWorld::chunk_add(Ref<Terrain2DChunk> chunk, const int x, const int
|
||||
}
|
||||
|
||||
emit_signal("chunk_added", chunk);
|
||||
|
||||
update();
|
||||
}
|
||||
bool Terrain2DWorld::chunk_has(const int x, const int z) const {
|
||||
return _chunks.has(IntPos(x, z));
|
||||
@ -319,6 +321,7 @@ Ref<Terrain2DChunk> Terrain2DWorld::chunk_remove(const int x, const int z) {
|
||||
_chunks.erase(pos);
|
||||
|
||||
emit_signal("chunk_removed", chunk);
|
||||
update();
|
||||
|
||||
return chunk;
|
||||
}
|
||||
@ -340,7 +343,8 @@ Ref<Terrain2DChunk> Terrain2DWorld::chunk_remove_index(const int index) {
|
||||
//_generating.erase(chunk);
|
||||
|
||||
emit_signal("chunk_removed", chunk);
|
||||
|
||||
update();
|
||||
|
||||
return chunk;
|
||||
}
|
||||
|
||||
@ -376,6 +380,8 @@ void Terrain2DWorld::chunks_clear() {
|
||||
|
||||
//never remove from this here
|
||||
//_generating.clear();
|
||||
|
||||
update();
|
||||
}
|
||||
|
||||
Ref<Terrain2DChunk> Terrain2DWorld::chunk_get_or_create(int x, int z) {
|
||||
|
Loading…
Reference in New Issue
Block a user