mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2024-12-20 07:30:26 +00:00
support for weighted 3dwalls
This commit is contained in:
parent
9cb955757e
commit
24a23e477b
4
hyper.h
4
hyper.h
@ -4361,6 +4361,8 @@ static const int WINGS = (BADMODEL ? 1 : 4);
|
||||
|
||||
typedef array<hpcshape, WINGS+1> hpcshape_animated;
|
||||
|
||||
extern vector<ld> equal_weights;
|
||||
|
||||
struct geometry_information {
|
||||
|
||||
/* basic geometry parameters */
|
||||
@ -4577,7 +4579,7 @@ hpcshape
|
||||
void pushShape(usershapelayer& ds);
|
||||
void make_sidewalls();
|
||||
void procedural_shapes();
|
||||
void make_wall(int id, vector<hyperpoint> vertices, bool force_triangles = false);
|
||||
void make_wall(int id, const vector<hyperpoint> vertices, vector<ld> weights = equal_weights);
|
||||
void create_wall3d();
|
||||
void configure_floorshapes();
|
||||
|
||||
|
43
polygons.cpp
43
polygons.cpp
@ -682,12 +682,11 @@ void geometry_information::procedural_shapes() {
|
||||
|
||||
#if CAP_BT && MAXMDIM >= 4
|
||||
|
||||
// Make a wall for horocycle-based honeycombs
|
||||
// flags:
|
||||
// 1 = first edge should be doubled
|
||||
// 2 = use POLY_TRIANGLES
|
||||
// 4 = this is is a triangular face; otherwise, the face is rectangular, and x1+x2-x0 is the fourth vertex
|
||||
void geometry_information::make_wall(int id, vector<hyperpoint> vertices, bool force_triangles) {
|
||||
// Make a wall
|
||||
|
||||
vector<ld> equal_weights(20, 1);
|
||||
|
||||
void geometry_information::make_wall(int id, vector<hyperpoint> vertices, vector<ld> weights) {
|
||||
using namespace hyperpoint_vec;
|
||||
|
||||
// orient correctly
|
||||
@ -697,7 +696,8 @@ void geometry_information::make_wall(int id, vector<hyperpoint> vertices, bool f
|
||||
set_column(T, 2, vertices[2]);
|
||||
set_column(T, 3, C0);
|
||||
if(det(T) < 0)
|
||||
reverse(vertices.begin(), vertices.end());
|
||||
reverse(vertices.begin(), vertices.end()),
|
||||
reverse(weights.begin(), weights.end());
|
||||
|
||||
ld yy = log(2) / 2;
|
||||
|
||||
@ -705,9 +705,10 @@ void geometry_information::make_wall(int id, vector<hyperpoint> vertices, bool f
|
||||
last->flags |= POLY_TRIANGLES;
|
||||
|
||||
hyperpoint center = Hypc;
|
||||
for(auto v: vertices) center += v;
|
||||
int n = isize(vertices);
|
||||
center /= n;
|
||||
ld w = 0;
|
||||
for(int i=0; i<n; i++) center += vertices[i] * weights[i], w += weights[i];
|
||||
center /= w;
|
||||
|
||||
for(int a=0; a<n; a++) {
|
||||
hyperpoint v1 = vertices[a] - center;
|
||||
@ -765,10 +766,10 @@ void geometry_information::create_wall3d() {
|
||||
hyperpoint h22 = point3(+1,+1,-1);
|
||||
hyperpoint down = point3(0,0,2);
|
||||
|
||||
make_wall(0, make4(h11, h01, h10), true);
|
||||
make_wall(1, make4(h11, h21, h10), true);
|
||||
make_wall(2, make4(h11, h01, h12), true);
|
||||
make_wall(3, make4(h11, h21, h12), true);
|
||||
make_wall(0, make4(h11, h01, h10));
|
||||
make_wall(1, make4(h11, h21, h10));
|
||||
make_wall(2, make4(h11, h01, h12));
|
||||
make_wall(3, make4(h11, h21, h12));
|
||||
make_wall(4, make5(h00, h02, h00+down));
|
||||
make_wall(5, make5(h20, h22, h20+down));
|
||||
make_wall(6, make5(h00, h20, h00+down));
|
||||
@ -790,9 +791,9 @@ void geometry_information::create_wall3d() {
|
||||
hyperpoint d1 = -2 * t1 + shift;
|
||||
hyperpoint d2 = -2 * t2 + shift;
|
||||
|
||||
make_wall(0, {t0, t1, t2}, true);
|
||||
make_wall(1, {d0, t1, t2}, true);
|
||||
make_wall(2, {t0, d1, t2}, true);
|
||||
make_wall(0, {t0, t1, t2});
|
||||
make_wall(1, {d0, t1, t2});
|
||||
make_wall(2, {t0, d1, t2});
|
||||
make_wall(3, {t0, t1, d2});
|
||||
make_wall(4, make5(d2, d1, d2 + down));
|
||||
make_wall(5, make5(d0, d2, d0 + down));
|
||||
@ -813,8 +814,8 @@ void geometry_information::create_wall3d() {
|
||||
|
||||
hyperpoint down = point3(0,0,1);
|
||||
|
||||
make_wall(0, make4(a00, a01, a10), true);
|
||||
make_wall(1, make4(a10, a11, a20), true);
|
||||
make_wall(0, make4(a00, a01, a10));
|
||||
make_wall(1, make4(a10, a11, a20));
|
||||
make_wall(2, make5(a01, a21, a01+down));
|
||||
make_wall(3, make4(a21, a20, a21+down));
|
||||
make_wall(4, make5(a20, a00, a20+down));
|
||||
@ -846,7 +847,7 @@ void geometry_information::create_wall3d() {
|
||||
}
|
||||
|
||||
make_wall(12, {point3(3*h,r3,z), point3(0,2*r3,z), point3(-3*h,r3,z)});
|
||||
make_wall(13, {point3(3*h,r3,z), point3(3*h,-r3,z), point3(0,-2*r3,z), point3(-3*h,-r3,z), point3(-3*h,r3,z)}, true);
|
||||
make_wall(13, {point3(3*h,r3,z), point3(3*h,-r3,z), point3(0,-2*r3,z), point3(-3*h,-r3,z), point3(-3*h,r3,z)});
|
||||
}
|
||||
|
||||
if(DIM == 3 && euclid && S7 == 6) {
|
||||
@ -862,7 +863,7 @@ void geometry_information::create_wall3d() {
|
||||
int z = (y+2)%3;
|
||||
vertices.push_back(hpxy3(t[x]/2., t[y]/2., t[z]/2.));
|
||||
}
|
||||
make_wall(w, vertices, 0);
|
||||
make_wall(w, vertices);
|
||||
}
|
||||
}
|
||||
|
||||
@ -912,7 +913,7 @@ void geometry_information::create_wall3d() {
|
||||
vector<hyperpoint> vertices;
|
||||
for(int a=0; a<facesize; a++)
|
||||
vertices.push_back(reg3::cellshape[w*facesize+a]);
|
||||
make_wall(w, vertices, 0);
|
||||
make_wall(w, vertices);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user