mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2024-11-27 14:37:16 +00:00
rug:: an option to draw lines
This commit is contained in:
parent
bd20208fe0
commit
f41e149688
48
rug.cpp
48
rug.cpp
@ -14,6 +14,8 @@ bool rug_failure = false;
|
||||
|
||||
namespace rug {
|
||||
|
||||
ld lwidth = 2;
|
||||
|
||||
bool in_crystal() { return surface::sh == surface::dsCrystal; }
|
||||
|
||||
bool computed = false;
|
||||
@ -1173,9 +1175,12 @@ bool project_ods(hyperpoint azeq, hyperpoint& h1, hyperpoint& h2, bool eye) {
|
||||
|
||||
vector<glhr::ct_vertex> ct_array;
|
||||
|
||||
vector<glhr::ct_vertex> cp_array;
|
||||
|
||||
void drawTriangle(triangle& t) {
|
||||
int num = t.m[2] ? 3 : 2;
|
||||
using namespace hyperpoint_vec;
|
||||
for(int i: {0,1,2}) {
|
||||
for(int i=0; i<num; i++) {
|
||||
if(!t.m[i]->valid) return;
|
||||
// if(t.m[i]->dist >= get_sightrange()+.51) return;
|
||||
}
|
||||
@ -1184,7 +1189,11 @@ void drawTriangle(triangle& t) {
|
||||
#if CAP_ODS
|
||||
if(vid.stereo_mode == current_display->sODS) {
|
||||
hyperpoint pts[3];
|
||||
for(int i=0; i<3; i++)
|
||||
|
||||
// not implemented
|
||||
if(num == 2) return;
|
||||
|
||||
for(int i=0; i<num; i++)
|
||||
pts[i] = t.m[i]->getglue()->flat;
|
||||
|
||||
hyperpoint hc = (pts[1] - pts[0]) ^ (pts[2] - pts[0]);
|
||||
@ -1250,16 +1259,18 @@ void drawTriangle(triangle& t) {
|
||||
|
||||
int spherepoints = 0;
|
||||
array<hyperpoint,3> h;
|
||||
for(int i: {0,1,2}) getco(t.m[i], h[i], spherepoints);
|
||||
for(int i=0; i<num; i++) getco(t.m[i], h[i], spherepoints);
|
||||
if(spherepoints == 1 || spherepoints == 2) return;
|
||||
|
||||
hyperpoint hc = (h[1] - h[0]) ^ (h[2] - h[0]);
|
||||
double hch = hypot_d(3, hc);
|
||||
ld col = 1;
|
||||
if(num == 3) {
|
||||
hyperpoint hc = (h[1] - h[0]) ^ (h[2] - h[0]);
|
||||
double hch = hypot_d(3, hc);
|
||||
col = (2 + hc[0]/hch) / 3;
|
||||
}
|
||||
|
||||
ld col = (2 + hc[0]/hch) / 3;
|
||||
|
||||
for(int i: {0,1,2})
|
||||
ct_array.emplace_back(h[i], t.m[i]->x1, t.m[i]->y1, col);
|
||||
for(int i=0; i<num; i++)
|
||||
(num==3?ct_array:cp_array).emplace_back(h[i], t.m[i]->x1, t.m[i]->y1, col);
|
||||
}
|
||||
|
||||
renderbuffer *glbuf;
|
||||
@ -1327,6 +1338,7 @@ void drawRugScene() {
|
||||
for(int ed=current_display->stereo_active() && vid.stereo_mode != sODS ? -1 : 0; ed < 2; ed += 2) {
|
||||
use_precompute = false;
|
||||
ct_array.clear();
|
||||
cp_array.clear();
|
||||
current_display->set_mask(ed), current_display->set_viewport(ed);
|
||||
if(ed == 1 && vid.stereo_mode == sAnaglyph)
|
||||
glClear(GL_DEPTH_BUFFER_BIT);
|
||||
@ -1379,8 +1391,17 @@ void drawRugScene() {
|
||||
drawTriangle(triangles[t]);
|
||||
|
||||
glhr::id_modelview();
|
||||
glhr::prepare(ct_array);
|
||||
glDrawArrays(GL_TRIANGLES, 0, isize(ct_array));
|
||||
|
||||
if(isize(ct_array) > 0) {
|
||||
glhr::prepare(ct_array);
|
||||
glDrawArrays(GL_TRIANGLES, 0, isize(ct_array));
|
||||
}
|
||||
|
||||
if(isize(cp_array) > 0) {
|
||||
glhr::prepare(cp_array);
|
||||
glLineWidth(lwidth);
|
||||
glDrawArrays(GL_LINES, 0, isize(cp_array));
|
||||
}
|
||||
|
||||
current_display->set_mask(0);
|
||||
}
|
||||
@ -1719,6 +1740,7 @@ hyperpoint gethyper(ld x, ld y) {
|
||||
auto r0 = triangles[i].m[0];
|
||||
auto r1 = triangles[i].m[1];
|
||||
auto r2 = triangles[i].m[2];
|
||||
if(!r2) continue;
|
||||
hyperpoint p0, p1, p2;
|
||||
bool error = false;
|
||||
int spherepoints = 0;
|
||||
@ -1986,6 +2008,10 @@ int rugArgs() {
|
||||
renderonce = false;
|
||||
}
|
||||
|
||||
else if(argis("-ruglwidth")) {
|
||||
shift_arg_formula(lwidth);
|
||||
}
|
||||
|
||||
else if(argis("-rugauto")) {
|
||||
shift_arg_formula(ruggo);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user