Skip to content

Commit

Permalink
Add RidgeConnection and RidgeVertex classes
Browse files Browse the repository at this point in the history
  • Loading branch information
ardazishvili committed Sep 29, 2024
1 parent 1dfde64 commit 6b8b124
Show file tree
Hide file tree
Showing 6 changed files with 42 additions and 17 deletions.
Empty file.
26 changes: 26 additions & 0 deletions src/ridge_impl/ridge_connection.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
#pragma once

#include <utility>

#include "tal/vector3.h"

namespace sota {

struct RidgeVertex {
RidgeVertex(Vector3 p_coord, Vector3 p_normal) : coord(p_coord), normal(p_normal) {}

Vector3 coord;
Vector3 normal; // normal vector to base polygon at 'coord'
};

class RidgeConnection {
public:
RidgeConnection(RidgeVertex first, RidgeVertex second) : _first(first), _second(second) {}

std::pair<RidgeVertex, RidgeVertex> get() const { return std::make_pair(_first, _second); }

private:
RidgeVertex _first;
RidgeVertex _second;
};
} // namespace sota
17 changes: 9 additions & 8 deletions src/ridge_impl/ridge_set.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

#include "mesh.h"
#include "ridge_impl/ridge_config.h"
#include "ridge_impl/ridge_connection.h"
#include "ridge_impl/ridge_mesh.h"
#include "ridge_impl/ridge_set_maker.h"
#include "tal/godot_core.h"
Expand Down Expand Up @@ -44,7 +45,7 @@ void RidgeSet::create_dfs_random(std::vector<RidgeMesh*>& list, float offset, in
std::mt19937 random_generator(seed);
std::uniform_int_distribution<> int_dist(0, 1000);
RidgeSetMaker maker(list);
std::vector<Connection> connections = maker.construct(offset);
std::vector<RidgeConnection> connections = maker.construct(offset);

unsigned int fracture_num = int_dist(random_generator) % 4;
unsigned int connection_pieces_num = fracture_num + 1;
Expand All @@ -60,14 +61,14 @@ void RidgeSet::create_dfs_random(std::vector<RidgeMesh*>& list, float offset, in
std::vector<Vector3> displacement_xyz(connection_pieces_num);
unsigned int connection_num = connections.size();
for (unsigned int k = 0; k < connection_num; ++k) {
auto& [lhs_pair, rhs_pair] = connections[k];
auto& [lhs, lhs_normal] = lhs_pair;
auto& [rhs, rhs_normal] = rhs_pair;
auto ts = tangents(lhs, rhs, lhs_normal);
Vector3 distance = rhs - lhs;
auto [lhs_vertex, rhs_vertex] = connections[k].get();
Vector3 lhs_coord = lhs_vertex.coord;
Vector3 rhs_coord = rhs_vertex.coord;
auto ts = tangents(lhs_coord, rhs_coord, lhs_vertex.normal);
Vector3 distance = rhs_coord - lhs_coord;
for (unsigned int i = 0; i < connection_pieces_num; ++i) {
Vector3 a = lhs + static_cast<float>(i) * distance / connection_pieces_num;
Vector3 b = lhs + static_cast<float>(i + 1) * distance / connection_pieces_num;
Vector3 a = lhs_coord + static_cast<float>(i) * distance / connection_pieces_num;
Vector3 b = lhs_coord + static_cast<float>(i + 1) * distance / connection_pieces_num;
bounds.emplace_back(a, b);
float randomness = height_dist(random_generator);
Vector3 random_vector = randomness * ((i & 1) ? ts[1] : ts[0]);
Expand Down
3 changes: 0 additions & 3 deletions src/ridge_impl/ridge_set.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,6 @@ class RidgeSet {
private:
std::vector<Ridge> _ridges;
RidgeConfig _config;

// TODO make class/struct for connection and use in RidgeSetMaker
using Connection = std::pair<std::pair<Vector3, Vector3>, std::pair<Vector3, Vector3>>;
};

} // namespace sota
10 changes: 5 additions & 5 deletions src/ridge_impl/ridge_set_maker.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

#include "mesh.h"
#include "misc/types.h"
#include "ridge_impl/ridge_connection.h"
#include "ridge_impl/ridge_mesh.h"
#include "tal/godot_core.h"
#include "vector3.h"
Expand All @@ -32,8 +33,7 @@ RidgeMeshPointerVector RidgeSetMaker::unvisited_neighbours(const RidgeMesh* mesh
return unvisited;
}

std::vector<std::pair<std::pair<Vector3, Vector3>, std::pair<Vector3, Vector3>>> RidgeSetMaker::construct(
float offset) {
std::vector<RidgeConnection> RidgeSetMaker::construct(float offset) {
std::mt19937 random_generator(seed);
std::uniform_int_distribution<> int_dist(0, 1000);
auto compare_increasing = [this](const RidgeMesh* lhs, const RidgeMesh* rhs) {
Expand All @@ -42,7 +42,7 @@ std::vector<std::pair<std::pair<Vector3, Vector3>, std::pair<Vector3, Vector3>>>
std::sort(_meshes.begin(), _meshes.end(), compare_increasing);

int iter = variable_int;
std::vector<std::pair<std::pair<Vector3, Vector3>, std::pair<Vector3, Vector3>>> res;
std::vector<RidgeConnection> res;
int l = 0;
int r = _meshes.size() - 1;
while (iter && l < r) {
Expand All @@ -63,8 +63,8 @@ std::vector<std::pair<std::pair<Vector3, Vector3>, std::pair<Vector3, Vector3>>>
Vector3 next_center = next->get_center();
Vector3 next_position = next_center + next->inner_mesh()->get_base_normal_direction(next_center) * offset;

res.emplace_back(std::make_pair(cur_position, cur->inner_mesh()->get_base_normal_direction(cur_position)),
std::make_pair(next_position, next->inner_mesh()->get_base_normal_direction(next_position)));
res.emplace_back(RidgeVertex(cur_position, cur->inner_mesh()->get_base_normal_direction(cur_position)),
RidgeVertex(next_position, next->inner_mesh()->get_base_normal_direction(next_position)));
_visited.insert(cur);
cur = neighbours[next_idx];
}
Expand Down
3 changes: 2 additions & 1 deletion src/ridge_impl/ridge_set_maker.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
#include <vector>

#include "ridge.h"
#include "ridge_impl/ridge_connection.h"
#include "ridge_mesh.h"
#include "tal/vector3.h"

Expand All @@ -16,7 +17,7 @@ using RidgeVector = std::vector<Ridge>;
class RidgeSetMaker {
public:
RidgeSetMaker(RidgeMeshPointerVector meshes) : _meshes(meshes) {}
std::vector<std::pair<std::pair<Vector3, Vector3>, std::pair<Vector3, Vector3>>> construct(float offset);
std::vector<RidgeConnection> construct(float offset);

private:
RidgeMeshPointerVector _meshes;
Expand Down

0 comments on commit 6b8b124

Please # to comment.