Initial drawing setup.

This commit is contained in:
Relintai 2022-02-24 09:24:41 +01:00
parent 9e4e2becf8
commit 2a778660c9
6 changed files with 81 additions and 11 deletions

View File

@ -333,7 +333,7 @@ void Terrain2DChunkDefault::colliders_create(const int mesh_index, const int lay
_rids[mesh_index] = m;
*/
//todo
//todo
}
void Terrain2DChunkDefault::colliders_create_area(const int mesh_index, const int layer_mask) {
/*
@ -646,6 +646,40 @@ void Terrain2DChunkDefault::_world_transform_changed() {
update_transforms();
}
void Terrain2DChunkDefault::_draw() {
if (_is_generating) {
return;
}
Terrain2DWorld *world = get_voxel_world();
ERR_FAIL_COND(!world);
RID terrain_mesh_rid = mesh_rid_get(MESH_INDEX_TERRAIN, MESH_TYPE_INDEX_MESH);
if (terrain_mesh_rid != RID()) {
RID terrain_texture_rid = mesh_rid_get(MESH_INDEX_TERRAIN, MESH_TYPE_INDEX_TEXTURE_RID);
VisualServer::get_singleton()->canvas_item_add_mesh(world->get_canvas_item(), terrain_mesh_rid, get_transform(), Color(1, 1, 1, 1), terrain_texture_rid, RID());
}
RID liquid_mesh_rid = mesh_rid_get(MESH_INDEX_LIQUID, MESH_TYPE_INDEX_MESH);
if (liquid_mesh_rid != RID()) {
RID liquid_texture_rid = mesh_rid_get(MESH_INDEX_LIQUID, MESH_TYPE_INDEX_TEXTURE_RID);
VisualServer::get_singleton()->canvas_item_add_mesh(world->get_canvas_item(), liquid_mesh_rid, get_transform(), Color(1, 1, 1, 1), liquid_texture_rid, RID());
}
RID prop_mesh_rid = mesh_rid_get(MESH_INDEX_PROP, MESH_TYPE_INDEX_MESH);
if (prop_mesh_rid != RID()) {
RID prop_texture_rid = mesh_rid_get(MESH_INDEX_PROP, MESH_TYPE_INDEX_TEXTURE_RID);
VisualServer::get_singleton()->canvas_item_add_mesh(world->get_canvas_item(), prop_mesh_rid, get_transform(), Color(1, 1, 1, 1), prop_texture_rid, RID());
}
}
//Lights
void Terrain2DChunkDefault::_bake_lights() {
clear_baked_lights();
@ -841,7 +875,8 @@ void Terrain2DChunkDefault::_bind_methods() {
//virtuals
ClassDB::bind_method(D_METHOD("_channel_setup"), &Terrain2DChunkDefault::_channel_setup);
ClassDB::bind_method(D_METHOD("_draw"), &Terrain2DChunkDefault::_draw);
//lights
ClassDB::bind_method(D_METHOD("_bake_lights"), &Terrain2DChunkDefault::_bake_lights);
ClassDB::bind_method(D_METHOD("_bake_light", "light"), &Terrain2DChunkDefault::_bake_light);
@ -869,6 +904,8 @@ void Terrain2DChunkDefault::_bind_methods() {
BIND_CONSTANT(MESH_TYPE_INDEX_MESH);
BIND_CONSTANT(MESH_TYPE_INDEX_SHAPE);
BIND_CONSTANT(MESH_TYPE_INDEX_BODY);
BIND_CONSTANT(MESH_TYPE_INDEX_AREA);
BIND_CONSTANT(MESH_TYPE_INDEX_TEXTURE_RID);
BIND_ENUM_CONSTANT(BUILD_FLAG_USE_ISOLEVEL);
BIND_ENUM_CONSTANT(BUILD_FLAG_USE_LIGHTING);

View File

@ -26,16 +26,15 @@ SOFTWARE.
#include "core/version.h"
#if VERSION_MAJOR > 3
#include "core/string/ustring.h"
#include "core/config/engine.h"
#include "core/string/ustring.h"
#include "core/variant/array.h"
#else
#include "core/ustring.h"
#include "core/engine.h"
#include "core/array.h"
#include "core/engine.h"
#include "core/ustring.h"
#endif
#include "../terrain_2d_chunk.h"
#include "../../defines.h"
@ -44,12 +43,12 @@ SOFTWARE.
#include "core/os/thread.h"
#include "core/os/thread_safe.h"
#include "scene/resources/packed_scene.h"
#include "../terrain_2d_world.h"
#include "../../data/terrain_2d_light.h"
#include "../../meshers/terrain_2d_mesher.h"
#include "../../library/terrain_2d_surface.h"
#include "../../library/terrain_2d_library.h"
#include "../../library/terrain_2d_surface.h"
#include "../../meshers/terrain_2d_mesher.h"
#include "../terrain_2d_world.h"
#include "scene/resources/packed_scene.h"
class Terrain2DWorld;
class Terrain2DJob;
@ -85,6 +84,7 @@ public:
MESH_TYPE_INDEX_SHAPE,
MESH_TYPE_INDEX_BODY,
MESH_TYPE_INDEX_AREA,
MESH_TYPE_INDEX_TEXTURE_RID,
};
enum BuildFlags {
@ -181,6 +181,7 @@ protected:
virtual void _exit_tree();
virtual void _world_transform_changed();
virtual void _draw();
//lights
virtual void _bake_lights();
@ -209,7 +210,7 @@ protected:
RID _debug_mesh_instance;
PoolVector3Array _debug_mesh_array;
Vector<Ref<Terrain2DLight> > _lights;
Vector<Ref<Terrain2DLight>> _lights;
};
VARIANT_ENUM_CAST(Terrain2DChunkDefault::DefaultChannels);

View File

@ -1039,6 +1039,10 @@ void Terrain2DChunk::generation_physics_process(const float delta) {
call("_generation_physics_process", delta);
}
void Terrain2DChunk::draw() {
call("_draw");
}
Transform2D Terrain2DChunk::get_transform() const {
return _transform;
}
@ -1319,6 +1323,7 @@ void Terrain2DChunk::_bind_methods() {
BIND_VMETHOD(MethodInfo("_visibility_changed", PropertyInfo(Variant::BOOL, "visible")));
BIND_VMETHOD(MethodInfo("_world_light_added", PropertyInfo(Variant::OBJECT, "light", PROPERTY_HINT_RESOURCE_TYPE, "Terrain2DLight")));
BIND_VMETHOD(MethodInfo("_world_light_removed", PropertyInfo(Variant::OBJECT, "light", PROPERTY_HINT_RESOURCE_TYPE, "Terrain2DLight")));
BIND_VMETHOD(MethodInfo("_draw"));
BIND_VMETHOD(MethodInfo("_generation_process", PropertyInfo(Variant::REAL, "delta")));
BIND_VMETHOD(MethodInfo("_generation_physics_process", PropertyInfo(Variant::REAL, "delta")));

View File

@ -301,6 +301,7 @@ public:
void world_light_removed(const Ref<Terrain2DLight> &light);
void generation_process(const float delta);
void generation_physics_process(const float delta);
void draw();
Transform2D get_transform() const;
void set_transform(const Transform2D &transform);

View File

@ -905,6 +905,18 @@ Terrain2DWorld ::~Terrain2DWorld() {
_lights.clear();
}
void Terrain2DWorld::_draw() {
for (int i = 0; i < _chunks_vector.size(); ++i) {
Ref<Terrain2DChunk> chunk = _chunks_vector[i];
ERR_CONTINUE(!chunk.is_valid());
if (chunk->get_visible()) {
chunk->draw();
}
}
}
void Terrain2DWorld::_generate_chunk(Ref<Terrain2DChunk> chunk) {
ERR_FAIL_COND(!chunk.is_valid());
@ -976,10 +988,12 @@ void Terrain2DWorld::_notification(int p_what) {
CALL(_generation_finished);
emit_signal("generation_finished");
update();
return;
}
bool needs_update = false;
for (int i = 0; i < _generating.size(); ++i) {
Ref<Terrain2DChunk> chunk = _generating.get(i);
@ -992,6 +1006,7 @@ void Terrain2DWorld::_notification(int p_what) {
if (!chunk->get_is_generating()) {
_generating.VREMOVE(i);
--i;
needs_update = true;
continue;
}
@ -1002,6 +1017,10 @@ void Terrain2DWorld::_notification(int p_what) {
}
}
if (needs_update) {
update();
}
if (_generating.size() >= _max_concurrent_generations)
return;
@ -1059,6 +1078,9 @@ void Terrain2DWorld::_notification(int p_what) {
}
break;
}
case NOTIFICATION_DRAW: {
call("_draw");
} break;
}
}
@ -1244,6 +1266,9 @@ void Terrain2DWorld::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_voxel_with_tool", "mode_add", "hit_position", "hit_normal", "selected_voxel", "isolevel"), &Terrain2DWorld::set_voxel_with_tool);
ClassDB::bind_method(D_METHOD("_set_voxel_with_tool", "mode_add", "hit_position", "hit_normal", "selected_voxel", "isolevel"), &Terrain2DWorld::_set_voxel_with_tool);
BIND_VMETHOD(MethodInfo("_draw"));
ClassDB::bind_method(D_METHOD("_draw"), &Terrain2DWorld::_draw);
BIND_ENUM_CONSTANT(CHANNEL_TYPE_INFO_TYPE);
BIND_ENUM_CONSTANT(CHANNEL_TYPE_INFO_ISOLEVEL);
BIND_ENUM_CONSTANT(CHANNEL_TYPE_INFO_LIQUID_FLOW);

View File

@ -210,6 +210,7 @@ public:
~Terrain2DWorld();
protected:
virtual void _draw();
virtual void _generate_chunk(Ref<Terrain2DChunk> chunk);
virtual Ref<Terrain2DChunk> _create_chunk(int x, int z, Ref<Terrain2DChunk> p_chunk);
virtual int _get_channel_index_info(const ChannelTypeInfo channel_type);