mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2024-11-10 15:59:53 +00:00
an option to generate raycaster map just once
This commit is contained in:
parent
e775e7ada0
commit
ad2ee6d98f
453
raycaster.cpp
453
raycaster.cpp
@ -23,6 +23,9 @@ EX bool comparison_mode;
|
|||||||
/** 0 - never use, 2 - always use, 1 = smart selection */
|
/** 0 - never use, 2 - always use, 1 = smart selection */
|
||||||
EX int want_use = 1;
|
EX int want_use = 1;
|
||||||
|
|
||||||
|
/** generate the map for raycasting just once */
|
||||||
|
EX bool fixed_map = false;
|
||||||
|
|
||||||
EX ld exp_start = 1;
|
EX ld exp_start = 1;
|
||||||
EX ld exp_decay_exp = 4;
|
EX ld exp_decay_exp = 4;
|
||||||
EX ld exp_decay_poly = 10;
|
EX ld exp_decay_poly = 10;
|
||||||
@ -203,8 +206,6 @@ raycaster::raycaster(string vsh, string fsh) : GLprogram(vsh, fsh) {
|
|||||||
|
|
||||||
shared_ptr<raycaster> our_raycaster;
|
shared_ptr<raycaster> our_raycaster;
|
||||||
|
|
||||||
EX void reset_raycaster() { our_raycaster = nullptr; }
|
|
||||||
|
|
||||||
int deg, irays;
|
int deg, irays;
|
||||||
|
|
||||||
#ifdef GLES_ONLY
|
#ifdef GLES_ONLY
|
||||||
@ -1363,9 +1364,7 @@ void enable_raycaster() {
|
|||||||
full_enable(our_raycaster);
|
full_enable(our_raycaster);
|
||||||
}
|
}
|
||||||
|
|
||||||
int length, per_row, rows;
|
void bind_array(vector<array<float, 4>>& v, GLint t, GLuint& tx, int id, int length) {
|
||||||
|
|
||||||
void bind_array(vector<array<float, 4>>& v, GLint t, GLuint& tx, int id) {
|
|
||||||
if(t == -1) println(hlog, "bind to nothing");
|
if(t == -1) println(hlog, "bind to nothing");
|
||||||
glUniform1i(t, id);
|
glUniform1i(t, id);
|
||||||
|
|
||||||
@ -1393,13 +1392,6 @@ void uniform2(GLint id, array<float, 2> fl) {
|
|||||||
glUniform2f(id, fl[0], fl[1]);
|
glUniform2f(id, fl[0], fl[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
array<float, 2> enc(int i, int a) {
|
|
||||||
array<float, 2> res;
|
|
||||||
res[0] = ((i%per_row) * deg + a + .5) / length;
|
|
||||||
res[1] = ((i / per_row) + .5) / rows;
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
color_t color_out_of_range = 0x0F0800FF;
|
color_t color_out_of_range = 0x0F0800FF;
|
||||||
|
|
||||||
transmatrix get_ms(cell *c, int a, bool mirror) {
|
transmatrix get_ms(cell *c, int a, bool mirror) {
|
||||||
@ -1432,198 +1424,110 @@ transmatrix get_ms(cell *c, int a, bool mirror) {
|
|||||||
|
|
||||||
int nesting;
|
int nesting;
|
||||||
|
|
||||||
EX void cast() {
|
struct raycast_map {
|
||||||
// may call itself recursively in case of bugs -- just in case...
|
|
||||||
dynamicval<int> dn(nesting, nesting+1);
|
|
||||||
if(nesting > 10) return;
|
|
||||||
|
|
||||||
if(isize(cgi.raywall) > irays) reset_raycaster();
|
|
||||||
|
|
||||||
enable_raycaster();
|
|
||||||
|
|
||||||
auto& o = our_raycaster;
|
|
||||||
|
|
||||||
if(need_many_cell_types() && o->uWallOffset == -1) {
|
|
||||||
reset_raycaster();
|
|
||||||
cast();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(comparison_mode)
|
|
||||||
glColorMask( GL_TRUE,GL_FALSE,GL_FALSE,GL_TRUE );
|
|
||||||
|
|
||||||
vector<glvertex> screen = {
|
|
||||||
glhr::makevertex(-1, -1, 1),
|
|
||||||
glhr::makevertex(-1, +1, 1),
|
|
||||||
glhr::makevertex(+1, -1, 1),
|
|
||||||
glhr::makevertex(-1, +1, 1),
|
|
||||||
glhr::makevertex(+1, -1, 1),
|
|
||||||
glhr::makevertex(+1, +1, 1)
|
|
||||||
};
|
|
||||||
|
|
||||||
ld d = current_display->eyewidth();
|
|
||||||
if(vid.stereo_mode == sLR) d = 2 * d - 1;
|
|
||||||
else d = -d;
|
|
||||||
|
|
||||||
auto& cd = current_display;
|
|
||||||
cd->set_viewport(global_projection);
|
|
||||||
cd->set_mask(global_projection);
|
|
||||||
|
|
||||||
#if CAP_VR
|
|
||||||
if(o->uEyeShift != -1) {
|
|
||||||
transmatrix T = vrhr::eyeshift;
|
|
||||||
if(nonisotropic)
|
|
||||||
T = inverse(NLP) * T;
|
|
||||||
glUniformMatrix4fv(o->uEyeShift, 1, 0, glhr::tmtogl_transpose3(T).as_array());
|
|
||||||
glUniform1f(o->uAbsUnit, vrhr::absolute_unit_in_meters);
|
|
||||||
}
|
|
||||||
if(vrhr::rendering_eye()) {
|
|
||||||
glUniformMatrix4fv(o->uProjection, 1, 0, glhr::tmtogl_transpose3(vrhr::eyeproj).as_array());
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
if(0) ;
|
|
||||||
#endif
|
|
||||||
else {
|
|
||||||
transmatrix proj = Id;
|
|
||||||
proj = eupush(-global_projection * d, 0) * proj;
|
|
||||||
proj = euscale(cd->tanfov / (vid.stereo_mode == sLR ? 2 : 1), cd->tanfov * cd->ysize / cd->xsize) * proj;
|
|
||||||
proj = eupush(-((cd->xcenter-cd->xtop)*2./cd->xsize - 1), -((cd->ycenter-cd->ytop)*2./cd->ysize - 1)) * proj;
|
|
||||||
glUniformMatrix4fv(o->uProjection, 1, 0, glhr::tmtogl_transpose3(proj).as_array());
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!callhandlers(false, hooks_rayset, o)) {
|
|
||||||
|
|
||||||
length = 4096;
|
|
||||||
per_row = length / deg;
|
|
||||||
|
|
||||||
vector<cell*> lst;
|
vector<cell*> lst;
|
||||||
|
map<cell*, int> ids;
|
||||||
|
|
||||||
cell *cs = centerover;
|
vector<transmatrix> ms;
|
||||||
|
|
||||||
transmatrix T = cview().T;
|
int length, per_row, rows;
|
||||||
|
|
||||||
|
vector<array<float, 4>> connections, wallcolor, texturemap, volumetric;
|
||||||
|
|
||||||
if(global_projection)
|
void apply_shape() {
|
||||||
T = xpush(vid.ipd * global_projection/2) * T;
|
length = 4096;
|
||||||
|
per_row = length / deg;
|
||||||
if(nonisotropic) T = NLP * T;
|
rows = next_p2((isize(lst)+per_row-1) / per_row);
|
||||||
T = inverse(T);
|
int q = length * rows;
|
||||||
|
connections.resize(q);
|
||||||
virtualRebase(cs, T);
|
wallcolor.resize(q);
|
||||||
|
texturemap.resize(q);
|
||||||
|
volumetric.resize(q);
|
||||||
|
}
|
||||||
|
|
||||||
int ray_fixes = 0;
|
void generate_initial_ms(cell *cs) {
|
||||||
|
auto sa = hybrid::gen_sample_list();
|
||||||
transmatrix msm = stretch::mstretch_matrix;
|
|
||||||
|
ms.clear();
|
||||||
back:
|
ms.resize(sa.back().first, Id);
|
||||||
for(int a=0; a<cs->type; a++)
|
|
||||||
if(hdist0(hybrid::ray_iadj(cs, a) * tC0(T)) < hdist0(tC0(T))) {
|
for(auto& p: sa) {
|
||||||
println(hlog, "ray error");
|
int id = p.first;
|
||||||
T = currentmap->iadj(cs, a) * T;
|
cell *c = p.second;
|
||||||
if(o->uToOrig != -1) {
|
if(!c) continue;
|
||||||
transmatrix HT = currentmap->adj(cs, a);
|
for(int j=0; j<c->type; j++)
|
||||||
HT = stretch::itranslate(tC0(HT)) * HT;
|
ms[id+j] = hybrid::ray_iadj(c, j);
|
||||||
msm = HT * msm;
|
if(WDIM == 2) for(int a: {0, 1}) {
|
||||||
|
ms[id+c->type+a] = get_ms(c, a, false);
|
||||||
}
|
}
|
||||||
cs = cs->move(a);
|
|
||||||
ray_fixes++;
|
|
||||||
if(ray_fixes > 100) return;
|
|
||||||
goto back;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// println(hlog, ms);
|
||||||
|
|
||||||
|
if(!sol && !nil && (reflect_val || reg3::ultra_mirror_in())) {
|
||||||
|
if(BITRUNCATED) exit(1);
|
||||||
|
for(int j=0; j<cs->type; j++) {
|
||||||
|
transmatrix T = inverse(ms[j]);
|
||||||
|
hyperpoint h = tC0(T);
|
||||||
|
ld d = hdist0(h);
|
||||||
|
transmatrix U = rspintox(h) * xpush(d/2) * MirrorX * xpush(-d/2) * spintox(h);
|
||||||
|
ms.push_back(U);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(WDIM == 2)
|
||||||
|
for(int a: {0, 1}) {
|
||||||
|
ms.push_back(get_ms(cs, a, true));
|
||||||
|
}
|
||||||
|
|
||||||
|
if(reg3::ultra_mirror_in()) {
|
||||||
|
for(auto v: cgi.ultra_mirrors)
|
||||||
|
ms.push_back(v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(prod) {
|
||||||
|
for(auto p: sa) {
|
||||||
|
int id =p.first;
|
||||||
|
if(id == 0) continue;
|
||||||
|
ms[id-2] = Id;
|
||||||
|
ms[id-1] = Id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(true) {
|
void generate_cell_listing(cell *cs) {
|
||||||
manual_celllister cl;
|
manual_celllister cl;
|
||||||
cl.add(cs);
|
cl.add(cs);
|
||||||
bool optimize = !isWall3(cs);
|
bool optimize = !isWall3(cs);
|
||||||
|
// vector<int> legaldir = { -1 };
|
||||||
for(int i=0; i<isize(cl.lst); i++) {
|
for(int i=0; i<isize(cl.lst); i++) {
|
||||||
cell *c = cl.lst[i];
|
cell *c = cl.lst[i];
|
||||||
if(racing::on && i > 0 && c->wall == waBarrier) continue;
|
if(racing::on && i > 0 && c->wall == waBarrier) continue;
|
||||||
if(optimize && isWall3(c)) continue;
|
if(optimize && isWall3(c)) continue;
|
||||||
forCellCM(c2, c) {
|
forCellIdCM(c2, d, c) {
|
||||||
|
// if(reflect_val == 0 && !((1<<d) & legaldir[i])) continue;
|
||||||
if(rays_generate) setdist(c2, 7, c);
|
if(rays_generate) setdist(c2, 7, c);
|
||||||
|
/* if(!cl.listed(c2))
|
||||||
|
legaldir.push_back(legaldir[i] &~ (1<<((d+3)%6)) ); */
|
||||||
cl.add(c2);
|
cl.add(c2);
|
||||||
if(isize(cl.lst) >= max_cells) goto finish;
|
if(isize(cl.lst) >= max_cells) goto finish;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
finish:
|
finish:
|
||||||
lst = cl.lst;
|
lst = cl.lst;
|
||||||
}
|
ids.clear();
|
||||||
|
for(int i=0; i<isize(lst); i++) ids[lst[i]] = i;
|
||||||
rows = next_p2((isize(lst)+per_row-1) / per_row);
|
|
||||||
|
|
||||||
map<cell*, int> ids;
|
|
||||||
for(int i=0; i<isize(lst); i++) ids[lst[i]] = i;
|
|
||||||
|
|
||||||
glUniform1i(o->uLength, length);
|
|
||||||
GLERR("uniform mediump length");
|
|
||||||
|
|
||||||
glUniformMatrix4fv(o->uStart, 1, 0, glhr::tmtogl_transpose3(T).as_array());
|
|
||||||
if(o->uLP != -1) glUniformMatrix4fv(o->uLP, 1, 0, glhr::tmtogl_transpose3(inverse(NLP)).as_array());
|
|
||||||
GLERR("uniform mediump start");
|
|
||||||
uniform2(o->uStartid, enc(ids[cs], 0));
|
|
||||||
GLERR("uniform mediump startid");
|
|
||||||
glUniform1f(o->uIPD, vid.ipd);
|
|
||||||
GLERR("uniform mediump IPD");
|
|
||||||
|
|
||||||
if(o->uITOA != -1) {
|
|
||||||
glUniformMatrix4fv(o->uITOA, 1, 0, glhr::tmtogl_transpose3(stretch::m_itoa).as_array());
|
|
||||||
glUniformMatrix4fv(o->uATOI, 1, 0, glhr::tmtogl_transpose3(stretch::m_atoi).as_array());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(o->uToOrig != -1) {
|
array<float, 2> enc(int i, int a) {
|
||||||
glUniformMatrix4fv(o->uToOrig, 1, 0, glhr::tmtogl_transpose3(msm).as_array());
|
array<float, 2> res;
|
||||||
glUniformMatrix4fv(o->uFromOrig, 1, 0, glhr::tmtogl_transpose3(inverse(msm)).as_array());
|
res[0] = ((i%per_row) * deg + a + .5) / length;
|
||||||
}
|
res[1] = ((i / per_row) + .5) / rows;
|
||||||
|
return res;
|
||||||
if(o->uWallOffset != -1) {
|
|
||||||
glUniform1i(o->uWallOffset, wall_offset(cs));
|
|
||||||
glUniform1i(o->uSides, cs->type + (WDIM == 2 ? 2 : 0));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
auto sa = hybrid::gen_sample_list();
|
void generate_connections(cell *c, int id) {
|
||||||
|
|
||||||
vector<transmatrix> ms(sa.back().first, Id);
|
|
||||||
|
|
||||||
for(auto& p: sa) {
|
|
||||||
int id = p.first;
|
|
||||||
cell *c = p.second;
|
|
||||||
if(!c) continue;
|
|
||||||
for(int j=0; j<c->type; j++)
|
|
||||||
ms[id+j] = hybrid::ray_iadj(c, j);
|
|
||||||
if(WDIM == 2) for(int a: {0, 1}) {
|
|
||||||
ms[id+c->type+a] = get_ms(c, a, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// println(hlog, ms);
|
|
||||||
|
|
||||||
if(!sol && !nil && (reflect_val || reg3::ultra_mirror_in())) {
|
|
||||||
if(BITRUNCATED) exit(1);
|
|
||||||
for(int j=0; j<cs->type; j++) {
|
|
||||||
transmatrix T = inverse(ms[j]);
|
|
||||||
hyperpoint h = tC0(T);
|
|
||||||
ld d = hdist0(h);
|
|
||||||
transmatrix U = rspintox(h) * xpush(d/2) * MirrorX * xpush(-d/2) * spintox(h);
|
|
||||||
ms.push_back(U);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(WDIM == 2)
|
|
||||||
for(int a: {0, 1}) {
|
|
||||||
ms.push_back(get_ms(cs, a, true));
|
|
||||||
}
|
|
||||||
|
|
||||||
if(reg3::ultra_mirror_in()) {
|
|
||||||
for(auto v: cgi.ultra_mirrors)
|
|
||||||
ms.push_back(v);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
vector<array<float, 4>> connections(length * rows);
|
|
||||||
vector<array<float, 4>> wallcolor(length * rows);
|
|
||||||
vector<array<float, 4>> texturemap(length * rows);
|
|
||||||
vector<array<float, 4>> volumetric(length * rows);
|
|
||||||
|
|
||||||
if(1) for(cell *c: lst) {
|
|
||||||
int id = ids[c];
|
|
||||||
auto& vmap = volumetric::vmap;
|
auto& vmap = volumetric::vmap;
|
||||||
if(volumetric::on) {
|
if(volumetric::on) {
|
||||||
celldrawer dd;
|
celldrawer dd;
|
||||||
@ -1637,7 +1541,7 @@ EX void cast() {
|
|||||||
vcolor = (backcolor << 8);
|
vcolor = (backcolor << 8);
|
||||||
volumetric[u] = glhr::acolor(vcolor);
|
volumetric[u] = glhr::acolor(vcolor);
|
||||||
}
|
}
|
||||||
forCellIdEx(c1, i, c) {
|
forCellIdEx(c1, i, c) {
|
||||||
int u = (id/per_row*length) + (id%per_row * deg) + i;
|
int u = (id/per_row*length) + (id%per_row * deg) + i;
|
||||||
if(!ids.count(c1)) {
|
if(!ids.count(c1)) {
|
||||||
wallcolor[u] = glhr::acolor(color_out_of_range | 0xFF);
|
wallcolor[u] = glhr::acolor(color_out_of_range | 0xFF);
|
||||||
@ -1707,15 +1611,161 @@ EX void cast() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(prod) {
|
void generate_connections() {
|
||||||
for(auto p: sa) {
|
int id = 0;
|
||||||
int id =p.first;
|
for(cell* c: lst)
|
||||||
if(id == 0) continue;
|
generate_connections(c, id++);
|
||||||
ms[id-2] = Id;
|
|
||||||
ms[id-1] = Id;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool gms_exceeded() {
|
||||||
|
return isize(ms) > gms_array_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
void assign_uniforms(raycaster* o) {
|
||||||
|
glUniform1i(o->uLength, length);
|
||||||
|
GLERR("uniform mediump length");
|
||||||
|
|
||||||
|
vector<glhr::glmatrix> gms;
|
||||||
|
for(auto& m: ms) gms.push_back(glhr::tmtogl_transpose3(m));
|
||||||
|
glUniformMatrix4fv(o->uM, isize(gms), 0, gms[0].as_array());
|
||||||
|
|
||||||
|
bind_array(wallcolor, o->tWallcolor, txWallcolor, 4, length);
|
||||||
|
bind_array(connections, o->tConnections, txConnections, 3, length);
|
||||||
|
bind_array(texturemap, o->tTextureMap, txTextureMap, 5, length);
|
||||||
|
if(volumetric::on) bind_array(volumetric, o->tVolumetric, txVolumetric, 6, length);
|
||||||
|
}
|
||||||
|
|
||||||
|
void create_all(cell *cs) {
|
||||||
|
generate_initial_ms(cs);
|
||||||
|
generate_cell_listing(cs);
|
||||||
|
apply_shape();
|
||||||
|
generate_connections();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool need_to_create(cell *cs) {
|
||||||
|
if(!fixed_map) return true;
|
||||||
|
return !ids.count(cs);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
unique_ptr<raycast_map> rmap;
|
||||||
|
|
||||||
|
EX void reset_raycaster() { our_raycaster = nullptr; rmap = nullptr; }
|
||||||
|
|
||||||
|
EX void cast() {
|
||||||
|
// may call itself recursively in case of bugs -- just in case...
|
||||||
|
dynamicval<int> dn(nesting, nesting+1);
|
||||||
|
if(nesting > 10) return;
|
||||||
|
|
||||||
|
if(isize(cgi.raywall) > irays) reset_raycaster();
|
||||||
|
|
||||||
|
enable_raycaster();
|
||||||
|
|
||||||
|
auto& o = our_raycaster;
|
||||||
|
|
||||||
|
if(need_many_cell_types() && o->uWallOffset == -1) {
|
||||||
|
reset_raycaster();
|
||||||
|
cast();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(comparison_mode)
|
||||||
|
glColorMask( GL_TRUE,GL_FALSE,GL_FALSE,GL_TRUE );
|
||||||
|
|
||||||
|
vector<glvertex> screen = {
|
||||||
|
glhr::makevertex(-1, -1, 1),
|
||||||
|
glhr::makevertex(-1, +1, 1),
|
||||||
|
glhr::makevertex(+1, -1, 1),
|
||||||
|
glhr::makevertex(-1, +1, 1),
|
||||||
|
glhr::makevertex(+1, -1, 1),
|
||||||
|
glhr::makevertex(+1, +1, 1)
|
||||||
|
};
|
||||||
|
|
||||||
|
ld d = current_display->eyewidth();
|
||||||
|
if(vid.stereo_mode == sLR) d = 2 * d - 1;
|
||||||
|
else d = -d;
|
||||||
|
|
||||||
|
auto& cd = current_display;
|
||||||
|
cd->set_viewport(global_projection);
|
||||||
|
cd->set_mask(global_projection);
|
||||||
|
|
||||||
|
#if CAP_VR
|
||||||
|
if(o->uEyeShift != -1) {
|
||||||
|
transmatrix T = vrhr::eyeshift;
|
||||||
|
if(nonisotropic)
|
||||||
|
T = inverse(NLP) * T;
|
||||||
|
glUniformMatrix4fv(o->uEyeShift, 1, 0, glhr::tmtogl_transpose3(T).as_array());
|
||||||
|
glUniform1f(o->uAbsUnit, vrhr::absolute_unit_in_meters);
|
||||||
|
}
|
||||||
|
if(vrhr::rendering_eye()) {
|
||||||
|
glUniformMatrix4fv(o->uProjection, 1, 0, glhr::tmtogl_transpose3(vrhr::eyeproj).as_array());
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
if(0) ;
|
||||||
|
#endif
|
||||||
|
else {
|
||||||
|
transmatrix proj = Id;
|
||||||
|
proj = eupush(-global_projection * d, 0) * proj;
|
||||||
|
proj = euscale(cd->tanfov / (vid.stereo_mode == sLR ? 2 : 1), cd->tanfov * cd->ysize / cd->xsize) * proj;
|
||||||
|
proj = eupush(-((cd->xcenter-cd->xtop)*2./cd->xsize - 1), -((cd->ycenter-cd->ytop)*2./cd->ysize - 1)) * proj;
|
||||||
|
glUniformMatrix4fv(o->uProjection, 1, 0, glhr::tmtogl_transpose3(proj).as_array());
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!callhandlers(false, hooks_rayset, o)) {
|
||||||
|
|
||||||
|
cell *cs = centerover;
|
||||||
|
|
||||||
|
transmatrix T = cview().T;
|
||||||
|
|
||||||
|
if(global_projection)
|
||||||
|
T = xpush(vid.ipd * global_projection/2) * T;
|
||||||
|
|
||||||
|
if(nonisotropic) T = NLP * T;
|
||||||
|
T = inverse(T);
|
||||||
|
|
||||||
|
virtualRebase(cs, T);
|
||||||
|
|
||||||
|
int ray_fixes = 0;
|
||||||
|
|
||||||
|
transmatrix msm = stretch::mstretch_matrix;
|
||||||
|
|
||||||
|
back:
|
||||||
|
for(int a=0; a<cs->type; a++)
|
||||||
|
if(hdist0(hybrid::ray_iadj(cs, a) * tC0(T)) < hdist0(tC0(T))) {
|
||||||
|
println(hlog, "ray error");
|
||||||
|
T = currentmap->iadj(cs, a) * T;
|
||||||
|
if(o->uToOrig != -1) {
|
||||||
|
transmatrix HT = currentmap->adj(cs, a);
|
||||||
|
HT = stretch::itranslate(tC0(HT)) * HT;
|
||||||
|
msm = HT * msm;
|
||||||
|
}
|
||||||
|
cs = cs->move(a);
|
||||||
|
ray_fixes++;
|
||||||
|
if(ray_fixes > 100) return;
|
||||||
|
goto back;
|
||||||
|
}
|
||||||
|
|
||||||
|
glUniformMatrix4fv(o->uStart, 1, 0, glhr::tmtogl_transpose3(T).as_array());
|
||||||
|
if(o->uLP != -1) glUniformMatrix4fv(o->uLP, 1, 0, glhr::tmtogl_transpose3(inverse(NLP)).as_array());
|
||||||
|
GLERR("uniform mediump startid");
|
||||||
|
glUniform1f(o->uIPD, vid.ipd);
|
||||||
|
GLERR("uniform mediump IPD");
|
||||||
|
|
||||||
|
if(o->uITOA != -1) {
|
||||||
|
glUniformMatrix4fv(o->uITOA, 1, 0, glhr::tmtogl_transpose3(stretch::m_itoa).as_array());
|
||||||
|
glUniformMatrix4fv(o->uATOI, 1, 0, glhr::tmtogl_transpose3(stretch::m_atoi).as_array());
|
||||||
|
}
|
||||||
|
|
||||||
|
if(o->uToOrig != -1) {
|
||||||
|
glUniformMatrix4fv(o->uToOrig, 1, 0, glhr::tmtogl_transpose3(msm).as_array());
|
||||||
|
glUniformMatrix4fv(o->uFromOrig, 1, 0, glhr::tmtogl_transpose3(inverse(msm)).as_array());
|
||||||
|
}
|
||||||
|
|
||||||
|
if(o->uWallOffset != -1) {
|
||||||
|
glUniform1i(o->uWallOffset, wall_offset(cs));
|
||||||
|
glUniform1i(o->uSides, cs->type + (WDIM == 2 ? 2 : 0));
|
||||||
|
}
|
||||||
|
|
||||||
vector<GLint> wallstart;
|
vector<GLint> wallstart;
|
||||||
for(auto i: cgi.wallstart) wallstart.push_back(i);
|
for(auto i: cgi.wallstart) wallstart.push_back(i);
|
||||||
glUniform1iv(o->uWallstart, isize(wallstart), &wallstart[0]);
|
glUniform1iv(o->uWallstart, isize(wallstart), &wallstart[0]);
|
||||||
@ -1757,27 +1807,25 @@ EX void cast() {
|
|||||||
|
|
||||||
glUniform1f(o->uExpStart, exp_start);
|
glUniform1f(o->uExpStart, exp_start);
|
||||||
|
|
||||||
vector<glhr::glmatrix> gms;
|
|
||||||
for(auto& m: ms) gms.push_back(glhr::tmtogl_transpose3(m));
|
|
||||||
glUniformMatrix4fv(o->uM, isize(gms), 0, gms[0].as_array());
|
|
||||||
|
|
||||||
if(isize(gms) > gms_array_size) {
|
|
||||||
gms_array_size = isize(gms);
|
|
||||||
println(hlog, "changing gms_array_size to ", gms_array_size);
|
|
||||||
reset_raycaster();
|
|
||||||
cast();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
bind_array(wallcolor, o->tWallcolor, txWallcolor, 4);
|
|
||||||
bind_array(connections, o->tConnections, txConnections, 3);
|
|
||||||
bind_array(texturemap, o->tTextureMap, txTextureMap, 5);
|
|
||||||
if(volumetric::on) bind_array(volumetric, o->tVolumetric, txVolumetric, 6);
|
|
||||||
|
|
||||||
auto cols = glhr::acolor(darkena(backcolor, 0, 0xFF));
|
auto cols = glhr::acolor(darkena(backcolor, 0, 0xFF));
|
||||||
if(o->uFogColor != -1)
|
if(o->uFogColor != -1)
|
||||||
glUniform4f(o->uFogColor, cols[0], cols[1], cols[2], cols[3]);
|
glUniform4f(o->uFogColor, cols[0], cols[1], cols[2], cols[3]);
|
||||||
|
|
||||||
|
if(!rmap) rmap = (unique_ptr<raycast_map>) new raycast_map;
|
||||||
|
|
||||||
|
if(rmap->need_to_create(cs)) {
|
||||||
|
rmap->create_all(cs);
|
||||||
|
if(rmap->gms_exceeded()) {
|
||||||
|
gms_array_size = isize(rmap->ms);
|
||||||
|
println(hlog, "changing gms_array_size to ", gms_array_size);
|
||||||
|
reset_raycaster();
|
||||||
|
cast();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
rmap->assign_uniforms(&*o);
|
||||||
|
}
|
||||||
|
GLERR("uniform mediump start");
|
||||||
|
uniform2(o->uStartid, rmap->enc(rmap->ids[cs], 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
#if CAP_VERTEXBUFFER
|
#if CAP_VERTEXBUFFER
|
||||||
@ -2078,6 +2126,7 @@ void addconfig() {
|
|||||||
addsaver(max_iter_sol, "ray_max_iter_sol");
|
addsaver(max_iter_sol, "ray_max_iter_sol");
|
||||||
addsaver(max_cells, "ray_max_cells");
|
addsaver(max_cells, "ray_max_cells");
|
||||||
addsaver(rays_generate, "ray_generate");
|
addsaver(rays_generate, "ray_generate");
|
||||||
|
param_b(fixed_map, "ray_fixed_map");
|
||||||
}
|
}
|
||||||
auto hookc = addHook(hooks_configfile, 100, addconfig);
|
auto hookc = addHook(hooks_configfile, 100, addconfig);
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user