mirror of
https://github.com/Relintai/pandemonium_engine.git
synced 2025-02-07 00:25:54 +01:00
Ported the logic of the mesh outline generator.
This commit is contained in:
parent
4af170d9fb
commit
f5c1a5eec1
@ -28,7 +28,7 @@ if 'TOOLS_ENABLED' in env["CPPDEFINES"]:
|
|||||||
module_env.add_source_files(env.modules_sources,"plugin_gltf/editor_plugin_gltf_mdr.cpp")
|
module_env.add_source_files(env.modules_sources,"plugin_gltf/editor_plugin_gltf_mdr.cpp")
|
||||||
|
|
||||||
module_env.add_source_files(env.modules_sources,"editor/utilities/mdr_ed_mesh_decompose.cpp")
|
module_env.add_source_files(env.modules_sources,"editor/utilities/mdr_ed_mesh_decompose.cpp")
|
||||||
#module_env.add_source_files(env.modules_sources,"editor/utilities/mdr_ed_mesh_outline.cpp")
|
module_env.add_source_files(env.modules_sources,"editor/utilities/mdr_ed_mesh_outline.cpp")
|
||||||
#module_env.add_source_files(env.modules_sources,"editor/utilities/mdr_ed_mesh_utils.cpp")
|
#module_env.add_source_files(env.modules_sources,"editor/utilities/mdr_ed_mesh_utils.cpp")
|
||||||
|
|
||||||
module_env.add_source_files(env.modules_sources,"nodes/mesh_data_instance.cpp")
|
module_env.add_source_files(env.modules_sources,"nodes/mesh_data_instance.cpp")
|
||||||
|
@ -22,6 +22,8 @@ SOFTWARE.
|
|||||||
|
|
||||||
#include "mdr_ed_mesh_outline.h"
|
#include "mdr_ed_mesh_outline.h"
|
||||||
|
|
||||||
|
#include "../../mesh_data_resource.h"
|
||||||
|
|
||||||
void MDREDMeshOutline::setup(Ref<MeshDataResource> mdr) {
|
void MDREDMeshOutline::setup(Ref<MeshDataResource> mdr) {
|
||||||
_mdr = mdr;
|
_mdr = mdr;
|
||||||
}
|
}
|
||||||
@ -33,160 +35,181 @@ void MDREDMeshOutline::reset() {
|
|||||||
_indices.resize(0);
|
_indices.resize(0);
|
||||||
}
|
}
|
||||||
bool MDREDMeshOutline::initialize() {
|
bool MDREDMeshOutline::initialize() {
|
||||||
/*
|
if (!_mdr.is_valid()) {
|
||||||
if !_mdr:
|
return false;
|
||||||
return false
|
}
|
||||||
|
|
||||||
if _mdr.array.size() != ArrayMesh.ARRAY_MAX:
|
Array arr = _mdr->get_array();
|
||||||
return false
|
|
||||||
|
|
||||||
if _mdr.array[ArrayMesh.ARRAY_VERTEX] == null || _mdr.array[ArrayMesh.ARRAY_INDEX] == null:
|
if (arr.size() != ArrayMesh::ARRAY_MAX) {
|
||||||
return false
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
var arr : Array = _mdr.array
|
if (arr[ArrayMesh::ARRAY_VERTEX].is_null() || arr[ArrayMesh::ARRAY_INDEX].is_null()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
_vertices = arr[ArrayMesh.ARRAY_VERTEX]
|
_vertices = arr[ArrayMesh::ARRAY_VERTEX];
|
||||||
|
|
||||||
if _mdr.array[ArrayMesh.ARRAY_NORMAL] != null:
|
if (!arr[ArrayMesh::ARRAY_NORMAL].is_null()) {
|
||||||
_normals = arr[ArrayMesh.ARRAY_NORMAL]
|
_normals = arr[ArrayMesh::ARRAY_NORMAL];
|
||||||
|
}
|
||||||
|
|
||||||
_indices = arr[ArrayMesh.ARRAY_INDEX]
|
_indices = arr[ArrayMesh::ARRAY_INDEX];
|
||||||
|
|
||||||
if _vertices.size() == 0:
|
if (_vertices.size() == 0) {
|
||||||
return false
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
return true
|
return true;
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
Vector3 MDREDMeshOutline::get_vertex(int index) {
|
Vector3 MDREDMeshOutline::get_vertex(int index) {
|
||||||
/*
|
if (index > _vertices.size()) {
|
||||||
if index > _vertices.size():
|
return Vector3();
|
||||||
return Vector3()
|
}
|
||||||
|
|
||||||
var v : Vector3 = _vertices[index]
|
Vector3 v = _vertices[index];
|
||||||
|
|
||||||
# This should reduce z fighting
|
// This should reduce z fighting
|
||||||
if _normals.size() > 0:
|
if (_normals.size() > 0) {
|
||||||
var n : Vector3 = _normals[index]
|
Vector3 n = _normals[index];
|
||||||
|
|
||||||
v += n * 0.001
|
v += n * 0.001;
|
||||||
|
}
|
||||||
|
|
||||||
return v
|
return v;
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MDREDMeshOutline::generate(bool mark_outline, bool mark_handles) {
|
void MDREDMeshOutline::generate(bool mark_outline, bool mark_handles) {
|
||||||
/*
|
reset();
|
||||||
reset()
|
|
||||||
|
|
||||||
if !initialize():
|
if (!initialize()) {
|
||||||
return
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if mark_outline:
|
if (mark_outline) {
|
||||||
for i in range(0, _indices.size(), 3):
|
for (int i = 0; i < _indices.size(); i += 3) {
|
||||||
for j in range(3):
|
for (int j = 0; j < 4; ++j) {
|
||||||
lines.append(get_vertex(_indices[i + j]))
|
lines.append(get_vertex(_indices[i + j]));
|
||||||
lines.append(get_vertex(_indices[i + ((j + 1) % 3)]))
|
lines.append(get_vertex(_indices[i + ((j + 1) % 3)]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if mark_handles:
|
if (mark_handles) {
|
||||||
for i in range(_vertices.size()):
|
for (int i = 0; i < _vertices.size(); ++i) {
|
||||||
var v : Vector3 = get_vertex(i)
|
Vector3 v = get_vertex(i);
|
||||||
|
|
||||||
var l : float = marker_size
|
float l = marker_size;
|
||||||
|
|
||||||
lines.append(v + Vector3(l, 0, 0))
|
lines.append(v + Vector3(l, 0, 0));
|
||||||
lines.append(v + Vector3(-l, 0, 0))
|
lines.append(v + Vector3(-l, 0, 0));
|
||||||
lines.append(v + Vector3(0, 0, l))
|
lines.append(v + Vector3(0, 0, l));
|
||||||
lines.append(v + Vector3(0, 0, -l))
|
lines.append(v + Vector3(0, 0, -l));
|
||||||
lines.append(v + Vector3(0, l, 0))
|
lines.append(v + Vector3(0, l, 0));
|
||||||
lines.append(v + Vector3(0, -l, 0))
|
lines.append(v + Vector3(0, -l, 0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var seams : PoolIntArray = _mdr.seams
|
PoolIntArray seams = _mdr->get_seams();
|
||||||
|
|
||||||
for i in range(0, seams.size(), 2):
|
for (int i = 0; i < seams.size(); i += 2) {
|
||||||
seam_lines.append(get_vertex(seams[i]))
|
seam_lines.append(get_vertex(seams[i]));
|
||||||
seam_lines.append(get_vertex(seams[i + 1]))
|
seam_lines.append(get_vertex(seams[i + 1]));
|
||||||
*/
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MDREDMeshOutline::generate_mark_edges(bool mark_outline, bool mark_handles) {
|
void MDREDMeshOutline::generate_mark_edges(bool mark_outline, bool mark_handles) {
|
||||||
/*
|
reset();
|
||||||
reset()
|
|
||||||
|
|
||||||
if !initialize():
|
if (!initialize()) {
|
||||||
return
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
for i in range(0, _indices.size(), 3):
|
for (int i = 0; i < _indices.size(); i += 3) {
|
||||||
for j in range(3):
|
for (int j = 0; j < 3; ++j) {
|
||||||
var i0 : int = _indices[i + j]
|
int i0 = _indices[i + j];
|
||||||
var i1 : int = _indices[i + ((j + 1) % 3)]
|
int i1 = _indices[i + ((j + 1) % 3)];
|
||||||
|
|
||||||
var v0 : Vector3 = get_vertex(i0)
|
Vector3 v0 = get_vertex(i0);
|
||||||
var v1 : Vector3 = get_vertex(i1)
|
Vector3 v1 = get_vertex(i1);
|
||||||
|
|
||||||
if mark_outline:
|
if (mark_outline) {
|
||||||
lines.append(v0)
|
lines.append(v0);
|
||||||
lines.append(v1)
|
lines.append(v1);
|
||||||
|
}
|
||||||
|
|
||||||
if mark_handles:
|
if (mark_handles) {
|
||||||
var pmid : Vector3 = lerp(v0, v1, 0.5)
|
Vector3 pmid = v0.linear_interpolate(v1, 0.5);
|
||||||
var l : float = marker_size
|
float l = marker_size;
|
||||||
|
|
||||||
lines.append(pmid + Vector3(l, 0, 0))
|
lines.append(pmid + Vector3(l, 0, 0));
|
||||||
lines.append(pmid + Vector3(-l, 0, 0))
|
lines.append(pmid + Vector3(-l, 0, 0));
|
||||||
lines.append(pmid + Vector3(0, 0, l))
|
lines.append(pmid + Vector3(0, 0, l));
|
||||||
lines.append(pmid + Vector3(0, 0, -l))
|
lines.append(pmid + Vector3(0, 0, -l));
|
||||||
lines.append(pmid + Vector3(0, l, 0))
|
lines.append(pmid + Vector3(0, l, 0));
|
||||||
lines.append(pmid + Vector3(0, -l, 0))
|
lines.append(pmid + Vector3(0, -l, 0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
PoolIntArray seams = _mdr->get_seams();
|
||||||
|
|
||||||
var seams : PoolIntArray = _mdr.seams
|
for (int i = 0; i < seams.size(); i += 2) {
|
||||||
|
seam_lines.append(get_vertex(seams[i]));
|
||||||
for i in range(0, seams.size(), 2):
|
seam_lines.append(get_vertex(seams[i + 1]));
|
||||||
seam_lines.append(get_vertex(seams[i]))
|
}
|
||||||
seam_lines.append(get_vertex(seams[i + 1]))
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
void MDREDMeshOutline::generate_mark_faces(bool mark_outline, bool mark_handles) {
|
void MDREDMeshOutline::generate_mark_faces(bool mark_outline, bool mark_handles) {
|
||||||
/*
|
reset();
|
||||||
reset()
|
|
||||||
|
|
||||||
if !initialize():
|
if (!initialize()) {
|
||||||
return
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if mark_outline:
|
if (mark_outline) {
|
||||||
for i in range(0, _indices.size(), 3):
|
for (int i = 0; i < _indices.size(); i += 3) {
|
||||||
for j in range(3):
|
for (int j = 0; j < 3; ++j) {
|
||||||
lines.append(get_vertex(_indices[i + j]))
|
lines.append(get_vertex(_indices[i + j]));
|
||||||
lines.append(get_vertex(_indices[i + ((j + 1) % 3)]))
|
lines.append(get_vertex(_indices[i + ((j + 1) % 3)]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if mark_handles:
|
if (mark_handles) {
|
||||||
for i in range(0, _indices.size(), 3):
|
for (int i = 0; i < _indices.size(); i += 3) {
|
||||||
var i0 : int = _indices[i + 0]
|
int i0 = _indices[i + 0];
|
||||||
var i1 : int = _indices[i + 1]
|
int i1 = _indices[i + 1];
|
||||||
var i2 : int = _indices[i + 2]
|
int i2 = _indices[i + 2];
|
||||||
|
|
||||||
var v0 : Vector3 = get_vertex(i0)
|
Vector3 v0 = get_vertex(i0);
|
||||||
var v1 : Vector3 = get_vertex(i1)
|
Vector3 v1 = get_vertex(i1);
|
||||||
var v2 : Vector3 = get_vertex(i2)
|
Vector3 v2 = get_vertex(i2);
|
||||||
|
|
||||||
var pmid : Vector3 = v0 + v1 + v2
|
Vector3 pmid = v0 + v1 + v2;
|
||||||
pmid /= 3
|
pmid /= 3;
|
||||||
var l : float = marker_size
|
float l = marker_size;
|
||||||
|
|
||||||
lines.append(pmid + Vector3(l, 0, 0))
|
lines.append(pmid + Vector3(l, 0, 0));
|
||||||
lines.append(pmid + Vector3(-l, 0, 0))
|
lines.append(pmid + Vector3(-l, 0, 0));
|
||||||
lines.append(pmid + Vector3(0, 0, l))
|
lines.append(pmid + Vector3(0, 0, l));
|
||||||
lines.append(pmid + Vector3(0, 0, -l))
|
lines.append(pmid + Vector3(0, 0, -l));
|
||||||
lines.append(pmid + Vector3(0, l, 0))
|
lines.append(pmid + Vector3(0, l, 0));
|
||||||
lines.append(pmid + Vector3(0, -l, 0))
|
lines.append(pmid + Vector3(0, -l, 0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var seams : PoolIntArray = _mdr.seams
|
PoolIntArray seams = _mdr->get_seams();
|
||||||
|
|
||||||
for i in range(0, seams.size(), 2):
|
for (int i = 0; i < seams.size(); i += 2) {
|
||||||
seam_lines.append(get_vertex(seams[i]))
|
seam_lines.append(get_vertex(seams[i]));
|
||||||
seam_lines.append(get_vertex(seams[i + 1]))
|
seam_lines.append(get_vertex(seams[i + 1]));
|
||||||
*/
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MDREDMeshOutline::MDREDMeshOutline() {
|
MDREDMeshOutline::MDREDMeshOutline() {
|
||||||
marker_size = 0.05;
|
marker_size = 0.05;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MDREDMeshOutline::_bind_methods() {
|
||||||
|
}
|
@ -55,6 +55,9 @@ public:
|
|||||||
PoolVector3Array _vertices;
|
PoolVector3Array _vertices;
|
||||||
PoolVector3Array _normals;
|
PoolVector3Array _normals;
|
||||||
PoolIntArray _indices;
|
PoolIntArray _indices;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
static void _bind_methods();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user