diff --git a/SCsub b/SCsub index 420a8b4..cf6e32d 100644 --- a/SCsub +++ b/SCsub @@ -10,6 +10,9 @@ if os.path.isdir('../texture_packer'): if os.path.isdir('../props'): module_env.Append(CPPDEFINES=['PROPS_PRESENT']) +if os.path.isdir('../props_2d'): + module_env.Append(CPPDEFINES=['PROPS_2D_PRESENT']) + if os.path.isdir('../mesh_utils'): module_env.Append(CPPDEFINES=['MESH_UTILS_PRESENT']) @@ -31,3 +34,6 @@ module_env.add_source_files(env.modules_sources,"nodes/mesh_data_instance.cpp") if os.path.isdir('../props'): module_env.add_source_files(env.modules_sources,"props/prop_data_mesh_data.cpp") + +if os.path.isdir('../props_2d'): + module_env.add_source_files(env.modules_sources,"props_2d/prop_2d_data_mesh_data.cpp") \ No newline at end of file diff --git a/props_2d/prop_2d_data_mesh_data.cpp b/props_2d/prop_2d_data_mesh_data.cpp new file mode 100644 index 0000000..19c763c --- /dev/null +++ b/props_2d/prop_2d_data_mesh_data.cpp @@ -0,0 +1,130 @@ +/* +Copyright (c) 2019-2022 Péter Magyar + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + +#include "prop_2d_data_mesh_data.h" + +#if PROPS_2D_PRESENT + +#include "../nodes/mesh_data_instance.h" +#include "scene/resources/material.h" + +Ref Prop2DDataMeshData::get_mesh() const { + return _mesh; +} +void Prop2DDataMeshData::set_mesh(const Ref mesh) { + _mesh = mesh; +} + +Ref Prop2DDataMeshData::get_texture() const { + return _texture; +} +void Prop2DDataMeshData::set_texture(const Ref texture) { + _texture = texture; +} + +bool Prop2DDataMeshData::get_snap_to_mesh() { + return _snap_to_mesh; +} +void Prop2DDataMeshData::set_snap_to_mesh(bool value) { + _snap_to_mesh = value; +} + +Vector3 Prop2DDataMeshData::get_snap_axis() { + return _snap_axis; +} +void Prop2DDataMeshData::set_snap_axis(Vector3 value) { + _snap_axis = value; +} + +#if TEXTURE_PACKER_PRESENT +void Prop2DDataMeshData::_add_textures_into(Ref texture_packer) { + if (get_texture().is_valid()) { + texture_packer->add_texture(get_texture()); + } +} +#endif + +bool Prop2DDataMeshData::_processor_handles(Node *node) { + MeshDataInstance *i = Object::cast_to(node); + + return i; +} + +void Prop2DDataMeshData::_processor_process(Ref prop_data, Node *node, const Transform &transform) { + MeshDataInstance *i = Object::cast_to(node); + + ERR_FAIL_COND(!i); + + Ref m; + m.instance(); + m->set_mesh(i->get_mesh_data()); + m->set_texture(i->get_texture()); + m->set_transform(transform * i->get_transform()); + prop_data->add_prop(m); +} + +Node *Prop2DDataMeshData::_processor_get_node_for(const Transform &transform) { + MeshDataInstance *i = memnew(MeshDataInstance); + + Ref m; + m.instance(); + + i->set_material(m); + i->set_texture(get_texture()); + i->set_mesh_data(get_mesh()); + i->set_transform(get_transform()); + + return i; +} + +Prop2DDataMeshData::Prop2DDataMeshData() { + _snap_to_mesh = false; + _snap_axis = Vector3(0, 1, 0); +} +Prop2DDataMeshData::~Prop2DDataMeshData() { + if (_mesh.is_valid()) + _mesh.unref(); +} + +void Prop2DDataMeshData::_bind_methods() { + ClassDB::bind_method(D_METHOD("get_mesh"), &Prop2DDataMeshData::get_mesh); + ClassDB::bind_method(D_METHOD("set_mesh", "value"), &Prop2DDataMeshData::set_mesh); + ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "mesh", PROPERTY_HINT_RESOURCE_TYPE, "MeshDataResource"), "set_mesh", "get_mesh"); + + ClassDB::bind_method(D_METHOD("get_texture"), &Prop2DDataMeshData::get_texture); + ClassDB::bind_method(D_METHOD("set_texture", "value"), &Prop2DDataMeshData::set_texture); + ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "texture", PROPERTY_HINT_RESOURCE_TYPE, "Texture"), "set_texture", "get_texture"); + + ClassDB::bind_method(D_METHOD("get_snap_to_mesh"), &Prop2DDataMeshData::get_snap_to_mesh); + ClassDB::bind_method(D_METHOD("set_snap_to_mesh", "value"), &Prop2DDataMeshData::set_snap_to_mesh); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "snap_to_mesh"), "set_snap_to_mesh", "get_snap_to_mesh"); + + ClassDB::bind_method(D_METHOD("get_snap_axis"), &Prop2DDataMeshData::get_snap_axis); + ClassDB::bind_method(D_METHOD("set_snap_axis", "value"), &Prop2DDataMeshData::set_snap_axis); + ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "snap_axis"), "set_snap_axis", "get_snap_axis"); + +#if TEXTURE_PACKER_PRESENT + ClassDB::bind_method(D_METHOD("_add_textures_into", "texture_packer"), &Prop2DDataMeshData::_add_textures_into); +#endif +} + +#endif \ No newline at end of file diff --git a/props_2d/prop_2d_data_mesh_data.h b/props_2d/prop_2d_data_mesh_data.h new file mode 100644 index 0000000..5d5fa22 --- /dev/null +++ b/props_2d/prop_2d_data_mesh_data.h @@ -0,0 +1,80 @@ +/* +Copyright (c) 2019-2022 Péter Magyar + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + +#ifndef PROP_2D_DATA_MESH_H +#define PROP_2D_DATA_MESH_H + +#if PROPS_2D_PRESENT + +#include "../../props_2d/props/prop_data_entry.h" +#include "core/math/vector3.h" + +#include "scene/resources/texture.h" + +#include "../mesh_data_resource.h" + +#if TEXTURE_PACKER_PRESENT +#include "../../texture_packer/texture_packer.h" +#endif + +#include "../../props_2d/props/prop_data.h" + +class Prop2DDataMeshData : public PropDataEntry { + GDCLASS(Prop2DDataMeshData, PropDataEntry); + +public: + Ref get_mesh() const; + void set_mesh(const Ref mesh); + + Ref get_texture() const; + void set_texture(const Ref texture); + + bool get_snap_to_mesh(); + void set_snap_to_mesh(bool value); + + Vector3 get_snap_axis(); + void set_snap_axis(Vector3 value); + +#if TEXTURE_PACKER_PRESENT + void _add_textures_into(Ref texture_packer); +#endif + + bool _processor_handles(Node *node); + void _processor_process(Ref prop_data, Node *node, const Transform &transform); + Node *_processor_get_node_for(const Transform &transform); + + Prop2DDataMeshData(); + ~Prop2DDataMeshData(); + +protected: + static void _bind_methods(); + +private: + bool _snap_to_mesh; + Vector3 _snap_axis; + Ref _mesh; + Ref _texture; +}; + +#endif + +#endif