mirror of
https://github.com/Relintai/props.git
synced 2024-11-12 10:15:25 +01:00
Tiled Wall support for PropInstance and PropinstanceMerger. Also fixed a double transform multiplication with MeshDataResources in PropInstanceMerger.
This commit is contained in:
parent
f2d1383ba8
commit
51e3254bfc
@ -24,7 +24,9 @@ SOFTWARE.
|
|||||||
|
|
||||||
#include "../../props/props/prop_data.h"
|
#include "../../props/props/prop_data.h"
|
||||||
#include "../../props/props/prop_data_prop.h"
|
#include "../../props/props/prop_data_prop.h"
|
||||||
|
#include "../../props/props/prop_data_tiled_wall.h"
|
||||||
#include "../singleton/prop_cache.h"
|
#include "../singleton/prop_cache.h"
|
||||||
|
#include "../tiled_wall/tiled_wall_data.h"
|
||||||
|
|
||||||
#if MESH_DATA_RESOURCE_PRESENT
|
#if MESH_DATA_RESOURCE_PRESENT
|
||||||
#define PROPS_PRESENT 1
|
#define PROPS_PRESENT 1
|
||||||
@ -196,9 +198,24 @@ void PropMaterialCache::prop_add_textures(const Ref<PropData> &prop) {
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
texture_add(tex);
|
texture_add(tex);
|
||||||
|
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
Ref<PropDataTiledWall> pdtw = prop->get_prop(i);
|
||||||
|
|
||||||
|
if (pdtw.is_valid()) {
|
||||||
|
Ref<TiledWallData> twd = pdtw->get_data();
|
||||||
|
|
||||||
|
if (!twd.is_valid())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
twd->setup_cache(Ref<PropMaterialCache>(this));
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
Ref<PropDataProp> pdp = prop->get_prop(i);
|
Ref<PropDataProp> pdp = prop->get_prop(i);
|
||||||
|
|
||||||
if (pdp.is_valid()) {
|
if (pdp.is_valid()) {
|
||||||
@ -225,6 +242,33 @@ void PropMaterialCache::prop_remove_textures(const Ref<PropData> &prop) {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
Ref<PropDataTiledWall> pdtw = prop->get_prop(i);
|
||||||
|
|
||||||
|
if (pdtw.is_valid()) {
|
||||||
|
Ref<TiledWallData> twd = pdtw->get_data();
|
||||||
|
|
||||||
|
if (!twd.is_valid())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
for (int j = 0; j < twd->get_texture_count(); ++j) {
|
||||||
|
const Ref<Texture> &tex = twd->get_texture(j);
|
||||||
|
|
||||||
|
if (tex.is_valid()) {
|
||||||
|
texture_remove(tex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int j = 0; j < twd->get_flavour_texture_count(); ++j) {
|
||||||
|
const Ref<Texture> &tex = twd->get_flavour_texture(j);
|
||||||
|
|
||||||
|
if (tex.is_valid()) {
|
||||||
|
texture_remove(tex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
Ref<PropDataProp> pdp = prop->get_prop(i);
|
Ref<PropDataProp> pdp = prop->get_prop(i);
|
||||||
|
|
||||||
if (pdp.is_valid()) {
|
if (pdp.is_valid()) {
|
||||||
@ -238,7 +282,7 @@ void PropMaterialCache::refresh_rects() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void PropMaterialCache::initial_setup_default() {
|
void PropMaterialCache::initial_setup_default() {
|
||||||
PropCache* pc = PropCache::get_singleton();
|
PropCache *pc = PropCache::get_singleton();
|
||||||
|
|
||||||
pc->ensure_materials_loaded();
|
pc->ensure_materials_loaded();
|
||||||
|
|
||||||
|
@ -23,6 +23,10 @@
|
|||||||
#include "./props/prop_data_light.h"
|
#include "./props/prop_data_light.h"
|
||||||
#include "./props/prop_data_prop.h"
|
#include "./props/prop_data_prop.h"
|
||||||
#include "./props/prop_data_scene.h"
|
#include "./props/prop_data_scene.h"
|
||||||
|
#include "./props/prop_data_tiled_wall.h"
|
||||||
|
|
||||||
|
#include "tiled_wall/tiled_wall.h"
|
||||||
|
#include "tiled_wall/tiled_wall_data.h"
|
||||||
|
|
||||||
Ref<PropData> PropInstance::get_prop_data() {
|
Ref<PropData> PropInstance::get_prop_data() {
|
||||||
return _prop_data;
|
return _prop_data;
|
||||||
@ -127,6 +131,23 @@ void PropInstance::_prop_preprocess(Transform transform, const Ref<PropData> &pr
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Ref<PropDataTiledWall> tiled_wall_data = e;
|
||||||
|
|
||||||
|
if (tiled_wall_data.is_valid()) {
|
||||||
|
TiledWall *twn = memnew(TiledWall);
|
||||||
|
|
||||||
|
twn->set_width(tiled_wall_data->get_width());
|
||||||
|
twn->set_heigth(tiled_wall_data->get_heigth());
|
||||||
|
twn->set_data(tiled_wall_data->get_data());
|
||||||
|
twn->set_collision(tiled_wall_data->get_collision());
|
||||||
|
|
||||||
|
twn->set_transform(t);
|
||||||
|
|
||||||
|
add_child(twn);
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
Ref<PropDataScene> scene_data = e;
|
Ref<PropDataScene> scene_data = e;
|
||||||
|
|
||||||
if (scene_data.is_valid()) {
|
if (scene_data.is_valid()) {
|
||||||
@ -185,7 +206,6 @@ void PropInstance::_prop_preprocess(Transform transform, const Ref<PropData> &pr
|
|||||||
if (spmat.is_valid()) {
|
if (spmat.is_valid()) {
|
||||||
spmat->set_texture(SpatialMaterial::TEXTURE_ALBEDO, texture);
|
spmat->set_texture(SpatialMaterial::TEXTURE_ALBEDO, texture);
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
Ref<ShaderMaterial> shmat = mat;
|
Ref<ShaderMaterial> shmat = mat;
|
||||||
|
|
||||||
if (shmat.is_valid()) {
|
if (shmat.is_valid()) {
|
||||||
|
@ -61,6 +61,10 @@ typedef class RenderingServer VS;
|
|||||||
#include "../thread_pool/thread_pool.h"
|
#include "../thread_pool/thread_pool.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include "./props/prop_data_tiled_wall.h"
|
||||||
|
|
||||||
|
#include "tiled_wall/tiled_wall_data.h"
|
||||||
|
|
||||||
const float PropInstanceMerger::LOD_CHECK_INTERVAL = 2;
|
const float PropInstanceMerger::LOD_CHECK_INTERVAL = 2;
|
||||||
|
|
||||||
bool PropInstanceMerger::get_building() {
|
bool PropInstanceMerger::get_building() {
|
||||||
@ -522,6 +526,7 @@ void PropInstanceMerger::_build() {
|
|||||||
|
|
||||||
Ref<PropMaterialCache> cache = PropCache::get_singleton()->material_cache_get(_prop_data);
|
Ref<PropMaterialCache> cache = PropCache::get_singleton()->material_cache_get(_prop_data);
|
||||||
|
|
||||||
|
//note: this should be moved to the job
|
||||||
if (!cache->get_initialized()) {
|
if (!cache->get_initialized()) {
|
||||||
cache->mutex_lock();
|
cache->mutex_lock();
|
||||||
|
|
||||||
@ -590,6 +595,15 @@ void PropInstanceMerger::_prop_preprocess(Transform transform, const Ref<PropDat
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Ref<PropDataTiledWall> tiled_wall_data = e;
|
||||||
|
|
||||||
|
if (tiled_wall_data.is_valid()) {
|
||||||
|
|
||||||
|
_job->add_tiled_wall(tiled_wall_data, t);
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
Ref<PropDataScene> scene_data = e;
|
Ref<PropDataScene> scene_data = e;
|
||||||
|
|
||||||
if (scene_data.is_valid()) {
|
if (scene_data.is_valid()) {
|
||||||
|
@ -59,6 +59,9 @@ SOFTWARE.
|
|||||||
#undef PROPS_PRESENT
|
#undef PROPS_PRESENT
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include "tiled_wall/tiled_wall_data.h"
|
||||||
|
#include "props/prop_data_tiled_wall.h"
|
||||||
|
|
||||||
Ref<PropMaterialCache> PropInstancePropJob::get_material_cache() {
|
Ref<PropMaterialCache> PropInstancePropJob::get_material_cache() {
|
||||||
return _material_cache;
|
return _material_cache;
|
||||||
}
|
}
|
||||||
@ -132,6 +135,18 @@ void PropInstancePropJob::clear_meshes() {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
void PropInstancePropJob::add_tiled_wall(const Ref<PropDataTiledWall> &data, const Transform &base_transform) {
|
||||||
|
PTWEntry e;
|
||||||
|
e.data = data;
|
||||||
|
e.base_transform = base_transform;
|
||||||
|
|
||||||
|
_prop_tiled_wall_datas.push_back(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PropInstancePropJob::clear_tiled_walls() {
|
||||||
|
_prop_tiled_wall_datas.clear();
|
||||||
|
}
|
||||||
|
|
||||||
void PropInstancePropJob::add_light(const Ref<PropLight> &light) {
|
void PropInstancePropJob::add_light(const Ref<PropLight> &light) {
|
||||||
_prop_mesher->add_light(light);
|
_prop_mesher->add_light(light);
|
||||||
}
|
}
|
||||||
@ -209,7 +224,6 @@ void PropInstancePropJob::phase_prop() {
|
|||||||
Ref<MeshDataResource> mesh = pmd->get_mesh();
|
Ref<MeshDataResource> mesh = pmd->get_mesh();
|
||||||
Ref<Texture> tex = pmd->get_texture();
|
Ref<Texture> tex = pmd->get_texture();
|
||||||
Transform t = pmd->get_transform();
|
Transform t = pmd->get_transform();
|
||||||
t *= e.base_transform;
|
|
||||||
|
|
||||||
Rect2 uvr = _material_cache->texture_get_uv_rect(tex);
|
Rect2 uvr = _material_cache->texture_get_uv_rect(tex);
|
||||||
|
|
||||||
@ -217,6 +231,15 @@ void PropInstancePropJob::phase_prop() {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
for (int i = 0; i < _prop_tiled_wall_datas.size(); ++i) {
|
||||||
|
PTWEntry &e = _prop_tiled_wall_datas.write[i];
|
||||||
|
|
||||||
|
Ref<PropDataTiledWall> pdtw = e.data;
|
||||||
|
Transform t = pdtw->get_transform();
|
||||||
|
|
||||||
|
_prop_mesher->add_tiled_wall_simple(pdtw->get_width(), pdtw->get_heigth(), t, pdtw->get_data(), _material_cache);
|
||||||
|
}
|
||||||
|
|
||||||
if (_prop_mesher->get_vertex_count() == 0) {
|
if (_prop_mesher->get_vertex_count() == 0) {
|
||||||
//reset_meshes();
|
//reset_meshes();
|
||||||
|
|
||||||
@ -293,6 +316,8 @@ void PropInstancePropJob::_reset() {
|
|||||||
_prop_mesher->reset();
|
_prop_mesher->reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_prop_tiled_wall_datas.clear();
|
||||||
|
|
||||||
_prop_mesh_datas.clear();
|
_prop_mesh_datas.clear();
|
||||||
clear_collision_shapes();
|
clear_collision_shapes();
|
||||||
|
|
||||||
|
@ -32,6 +32,7 @@ class PropMesherJobStep;
|
|||||||
class PropMaterialCache;
|
class PropMaterialCache;
|
||||||
class Shape;
|
class Shape;
|
||||||
class PropLight;
|
class PropLight;
|
||||||
|
class PropDataTiledWall;
|
||||||
|
|
||||||
#if MESH_DATA_RESOURCE_PRESENT
|
#if MESH_DATA_RESOURCE_PRESENT
|
||||||
class PropDataMeshData;
|
class PropDataMeshData;
|
||||||
@ -65,6 +66,9 @@ public:
|
|||||||
void clear_meshes();
|
void clear_meshes();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
void add_tiled_wall(const Ref<PropDataTiledWall> &data, const Transform &base_transform);
|
||||||
|
void clear_tiled_walls();
|
||||||
|
|
||||||
void add_light(const Ref<PropLight> &light);
|
void add_light(const Ref<PropLight> &light);
|
||||||
void clear_lights();
|
void clear_lights();
|
||||||
|
|
||||||
@ -103,6 +107,11 @@ protected:
|
|||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
struct PTWEntry {
|
||||||
|
Ref<PropDataTiledWall> data;
|
||||||
|
Transform base_transform;
|
||||||
|
};
|
||||||
|
|
||||||
struct CollisionShapeEntry {
|
struct CollisionShapeEntry {
|
||||||
Ref<Shape> shape;
|
Ref<Shape> shape;
|
||||||
Transform transform;
|
Transform transform;
|
||||||
@ -123,6 +132,8 @@ protected:
|
|||||||
|
|
||||||
Vector<CollisionShapeEntry> _collision_shapes;
|
Vector<CollisionShapeEntry> _collision_shapes;
|
||||||
|
|
||||||
|
Vector<PTWEntry> _prop_tiled_wall_datas;
|
||||||
|
|
||||||
Array temp_mesh_arr;
|
Array temp_mesh_arr;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user