Refactored optimized

This commit is contained in:
Segey Lapin
2021-10-15 16:18:30 +03:00
parent 8c4432031e
commit ea4c8a5731
2 changed files with 33 additions and 29 deletions

View File

@@ -1,5 +1,6 @@
#include <cassert> #include <cassert>
#include <core/resource.h> #include <core/resource.h>
#include <core/os/os.h>
#include <core/sort_array.h> #include <core/sort_array.h>
#include <scene/resources/packed_scene.h> #include <scene/resources/packed_scene.h>
#include <scene/main/viewport.h> #include <scene/main/viewport.h>
@@ -17,7 +18,7 @@ void Roads::_get_property_list(List<PropertyInfo> *p_list) const
{ {
p_list->push_back(PropertyInfo(Variant::OBJECT, "road_data", PROPERTY_HINT_RESOURCE_TYPE, "PackedScene")); p_list->push_back(PropertyInfo(Variant::OBJECT, "road_data", PROPERTY_HINT_RESOURCE_TYPE, "PackedScene"));
p_list->push_back(PropertyInfo(Variant::OBJECT, "curve", PROPERTY_HINT_RESOURCE_TYPE, "Curve")); p_list->push_back(PropertyInfo(Variant::OBJECT, "curve", PROPERTY_HINT_RESOURCE_TYPE, "Curve"));
p_list->push_back(PropertyInfo(Variant::OBJECT, "noise", PROPERTY_HINT_RESOURCE_TYPE, "OpenSimplexNoise")); p_list->push_back(PropertyInfo(Variant::OBJECT, "noise", PROPERTY_HINT_RESOURCE_TYPE, "FastNoiseLite"));
} }
bool Roads::_get(const StringName &p_name, Variant &r_ret) const bool Roads::_get(const StringName &p_name, Variant &r_ret) const
{ {
@@ -69,17 +70,6 @@ void Roads::sort_angle(Vector<int> &sort_data)
sorter.compare.vertices = vertices.write().ptr(); sorter.compare.vertices = vertices.write().ptr();
sorter.sort(sort_data.ptrw(), sort_data.size()); sorter.sort(sort_data.ptrw(), sort_data.size());
} }
int Roads::find_edge(int a, int b)
{
int i;
RoadGrid *rg = RoadsData::get_singleton()->get_road_grid();
for (i = 0; i < rg->map_hedges.size(); i++) {
if (rg->map_hedges[i]->a == a &&
rg->map_hedges[i]->b == b)
return i;
}
return -1;
}
void Roads::setup_vshapes() void Roads::setup_vshapes()
{ {
int i, j; int i, j;
@@ -203,9 +193,8 @@ void Roads::update_all()
RoadsData::get_singleton()->set_curve(curve); RoadsData::get_singleton()->set_curve(curve);
rg->build(curve, noise); rg->build(curve, noise);
} }
printf("vertices: %d\n", rg->diagram_vertices.size()); printf("vertices: %d\n", rg->get_diagram_vertex_count());
printf("heights: %d\n", rg->diagram_vertex_heights.size()); printf("edges: %d\n", rg->get_map_hedges_count());
printf("edges: %d\n", rg->map_hedges.size());
setup_vshapes(); setup_vshapes();
} }
} }
@@ -485,13 +474,14 @@ void Roads::add_scene_element(Node *root, Node *xnode, const Vector3 &p2, Ref<Co
void Roads::process_vshapes() void Roads::process_vshapes()
{ {
Transform xform = get_viewport()->get_camera()->get_global_transform(); if (get_viewport() && get_viewport()->get_camera())
cam_xform = get_viewport()->get_camera()->get_global_transform();
AABB camarea; AABB camarea;
camarea.position = xform.origin; camarea.position = cam_xform.origin;
camarea.grow_by(550.0f); camarea.grow_by(550.0f);
int i; int i;
List<int> active_vshapes; List<int> active_vshapes;
printf("camera %f %f %f\n", xform.origin.x, xform.origin.y, xform.origin.z); printf("camera %f %f %f\n", cam_xform.origin.x, cam_xform.origin.y, cam_xform.origin.z);
for (i = 0; i < vshapes.size(); i++) { for (i = 0; i < vshapes.size(); i++) {
if (active_vshapes.size() > 32) if (active_vshapes.size() > 32)
break; break;
@@ -540,7 +530,7 @@ void Roads::_notification(int p_what)
{ {
switch(p_what) { switch(p_what) {
case NOTIFICATION_PROCESS: case NOTIFICATION_PROCESS:
if ((counter % 100) == 0) if ((counter % 60) == 0)
process_vshapes(); process_vshapes();
counter++; counter++;
break; break;
@@ -601,7 +591,7 @@ void RoadsData::_bind_methods()
ClassDB::bind_method(D_METHOD("get_road_grid"), &RoadsData::get_road_grid); ClassDB::bind_method(D_METHOD("get_road_grid"), &RoadsData::get_road_grid);
ClassDB::bind_method(D_METHOD("get_sdf", "x", "y", "z"), &RoadsData::get_sdf); ClassDB::bind_method(D_METHOD("get_sdf", "x", "y", "z"), &RoadsData::get_sdf);
} }
void RoadsData::set_noise(Ref<OpenSimplexNoise> noise) void RoadsData::set_noise(Ref<FastNoiseLite> noise)
{ {
this->noise = noise; this->noise = noise;
} }
@@ -613,15 +603,27 @@ float RoadsData::get_sdf(int x, int y, int z)
{ {
if (!curve.is_valid() || !noise.is_valid()) if (!curve.is_valid() || !noise.is_valid())
return (float)y; return (float)y;
if (sdf_data.has(x * 50000 + z))
return (float)y - sdf_data[x * 50000 + z];
float ret;
float n = curve->interpolate_baked(0.5f + noise->get_noise_2d(x, z) * 0.5f); float n = curve->interpolate_baked(0.5f + noise->get_noise_2d(x, z) * 0.5f);
n = CLAMP(n, -1000.0f, 1000.0f); n = CLAMP(n, -1000.0f, 1000.0f);
/* this is for height value; for caves/tunnels other logic is needed */
Vector2 ifl = rg->get_influence(x, z, 32.0f); Vector2 ifl = rg->get_influence(x, z, 32.0f);
if (ifl.x > 0.0f) { if (ifl.x > 0.0f) {
if (n <= ifl.y - 0.5f) sdf_mutex.lock();
return (float)y - ifl.y - 0.6f; if (n <= ifl.y - 0.5f) {
else ret = (float)y - ifl.y - 0.6f;
return (float)y - ifl.y; sdf_data[x * 50000 + z] = ifl.y + 0.6f;
} else {
ret = (float)y - ifl.y;
sdf_data[x * 50000 + z] = ifl.y;
}
sdf_mutex.unlock();
goto out;
} }
return y - n; ret = y - n;
out:
return ret;
} }

View File

@@ -12,7 +12,7 @@ class Roads: public MeshInstance {
protected: protected:
Mutex mutex; Mutex mutex;
Ref<Curve> curve; Ref<Curve> curve;
Ref<OpenSimplexNoise> noise; Ref<FastNoiseLite> noise;
Ref<Material> mat; Ref<Material> mat;
Ref<PackedScene> road_data; Ref<PackedScene> road_data;
HashMap<String, Array> mesh_data; HashMap<String, Array> mesh_data;
@@ -37,6 +37,7 @@ protected:
struct thread_data thread; struct thread_data thread;
static void generate_threaded(void *p_userdata); static void generate_threaded(void *p_userdata);
StaticBody *body; StaticBody *body;
Transform cam_xform;
#if 0 #if 0
struct edge_data { struct edge_data {
int a; int a;
@@ -65,7 +66,6 @@ protected:
void extrude_direct(Array &out, const Array &arrays, const struct edge_data *data) const; void extrude_direct(Array &out, const Array &arrays, const struct edge_data *data) const;
void extrude_vshape(Array &out, const Array &arrays, const struct vshape *data) const; void extrude_vshape(Array &out, const Array &arrays, const struct vshape *data) const;
#endif #endif
int find_edge(int a, int b);
void _notification(int p_what); void _notification(int p_what);
int counter; int counter;
friend class RoadsData; friend class RoadsData;
@@ -94,7 +94,9 @@ protected:
RoadGrid *rg; RoadGrid *rg;
static void _bind_methods(); static void _bind_methods();
Ref<Curve> curve; Ref<Curve> curve;
Ref<OpenSimplexNoise> noise; Ref<FastNoiseLite> noise;
Mutex sdf_mutex;
HashMap<int, float> sdf_data;
public: public:
RoadsData(); RoadsData();
~RoadsData(); ~RoadsData();
@@ -102,7 +104,7 @@ public:
static void create_singleton(); static void create_singleton();
static void destroy_singleton(); static void destroy_singleton();
RoadGrid *get_road_grid() const; RoadGrid *get_road_grid() const;
void set_noise(Ref<OpenSimplexNoise> noise); void set_noise(Ref<FastNoiseLite> noise);
void set_curve(Ref<Curve> curve); void set_curve(Ref<Curve> curve);
float get_sdf(int x, int y, int z); float get_sdf(int x, int y, int z);
}; };