ray:: two-dimensional cell lists

This commit is contained in:
Zeno Rogue 2019-10-26 00:01:12 +02:00
parent e0f243b11c
commit 7879a4abe1
1 changed files with 40 additions and 53 deletions

View File

@ -12,7 +12,7 @@ namespace hr {
EX namespace ray { EX namespace ray {
/** texture IDs */ /** texture IDs */
GLuint txConnections = 0, txWallcolor = 0, txMatrixid = 0; GLuint txConnections = 0, txWallcolor = 0;
EX bool in_use; EX bool in_use;
EX bool comparison_mode; EX bool comparison_mode;
@ -58,7 +58,7 @@ EX bool requested() {
struct raycaster : glhr::GLprogram { struct raycaster : glhr::GLprogram {
GLint uStart, uStartid, uN, uM, uLength, uFovX, uFovY, uIPD; GLint uStart, uStartid, uN, uM, uLength, uFovX, uFovY, uIPD;
GLint uWallstart, uWallX, uWallY; GLint uWallstart, uWallX, uWallY;
GLint tConnections, tWallcolor, tMatrixid; GLint tConnections, tWallcolor;
GLint uBinaryWidth; GLint uBinaryWidth;
GLint uLinearSightRange, uExpStart, uExpDecay; GLint uLinearSightRange, uExpStart, uExpDecay;
@ -85,7 +85,6 @@ struct raycaster : glhr::GLprogram {
tConnections = glGetUniformLocation(_program, "tConnections"); tConnections = glGetUniformLocation(_program, "tConnections");
tWallcolor = glGetUniformLocation(_program, "tWallcolor"); tWallcolor = glGetUniformLocation(_program, "tWallcolor");
tMatrixid = glGetUniformLocation(_program, "tMatrixid");
} }
}; };
@ -115,11 +114,9 @@ void enable_raycaster() {
"uniform mat4 uStart;\n" "uniform mat4 uStart;\n"
"uniform mat4 uM[80];\n" "uniform mat4 uM[80];\n"
"uniform mat4 uTest;\n" "uniform mat4 uTest;\n"
"uniform float uStartid;\n" "uniform vec2 uStartid;\n"
"uniform sampler1D tConnections;\n" "uniform sampler2D tConnections;\n"
"uniform sampler1D tWallcolor;\n" "uniform sampler2D tWallcolor;\n"
"uniform sampler2D tWallTexture;\n"
"uniform sampler1D tMatrixid;\n"
"uniform vec4 uWallX[60];\n" "uniform vec4 uWallX[60];\n"
"uniform vec4 uWallY[60];\n" "uniform vec4 uWallY[60];\n"
"uniform int uWallstart[16];\n" "uniform int uWallstart[16];\n"
@ -193,7 +190,7 @@ void enable_raycaster() {
" vec4 position = vw * vec4(0., 0., 0., 1.);\n" " vec4 position = vw * vec4(0., 0., 0., 1.);\n"
" vec4 tangent = vw * at0;\n" " vec4 tangent = vw * at0;\n"
" float go = 0.;\n" " float go = 0.;\n"
" float cid = uStartid;\n" " vec2 cid = uStartid;\n"
" for(int iter=0; iter<" + its(max_iter_current()) + "; iter++) {\n"; " for(int iter=0; iter<" + its(max_iter_current()) + "; iter++) {\n";
fmain += fmain +=
@ -379,8 +376,8 @@ void enable_raycaster() {
// apply wall color // apply wall color
fmain += fmain +=
" float u = cid + float(which) / float(uLength);\n" " vec2 u = cid + vec2(float(which) / float(uLength), 0);\n"
" vec4 col = texture1D(tWallcolor, u);\n" " vec4 col = texture2D(tWallcolor, u);\n"
" if(col[3] > 0.0) {\n" " if(col[3] > 0.0) {\n"
" vec2 inface = map_texture(position, which);\n" " vec2 inface = map_texture(position, which);\n"
" float bright = min(1., 10. * (1.-inface.x-inface.y));\n" // texture2D(tWallTexture, (inface.yz + vec2(1.,1.))/2.).r;\n" " float bright = min(1., 10. * (1.-inface.x-inface.y));\n" // texture2D(tWallTexture, (inface.yz + vec2(1.,1.))/2.).r;\n"
@ -402,11 +399,11 @@ void enable_raycaster() {
// next cell // next cell
fmain += fmain +=
" float rot = texture1D(tMatrixid, u).r;\n" " vec4 connection = texture2D(tConnections, u);\n"
" int mid = int(rot * 1024.);\n" " int mid = int(connection.z * 1024.);\n"
" position = uM[mid] * uM[which] * position;\n" " position = uM[mid] * uM[which] * position;\n"
" tangent = uM[mid] * uM[which] * tangent;\n" " tangent = uM[mid] * uM[which] * tangent;\n"
" cid = texture1D(tConnections, u).r;\n"; " cid = connection.xy;\n";
fmain += fmain +=
" }" " }"
@ -420,21 +417,8 @@ void enable_raycaster() {
full_enable(our_raycaster); full_enable(our_raycaster);
} }
void bind_array(vector<float>& v, GLint t, GLuint& tx, int id) { int length, per_row, rows;
if(t == -1) println(hlog, "bind to nothing");
glUniform1i(t, id);
if(tx == 0) glGenTextures(1, &tx);
glActiveTexture(GL_TEXTURE0 + id);
glBindTexture(GL_TEXTURE_1D, tx);
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexImage1D(GL_TEXTURE_1D, 0, GL_R32F, isize(v), 0, GL_RED, GL_FLOAT, &v[0]);
}
void bind_array(vector<array<float, 4>>& v, GLint t, GLuint& tx, int id) { 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);
@ -442,23 +426,25 @@ void bind_array(vector<array<float, 4>>& v, GLint t, GLuint& tx, int id) {
if(tx == 0) glGenTextures(1, &tx); if(tx == 0) glGenTextures(1, &tx);
glActiveTexture(GL_TEXTURE0 + id); glActiveTexture(GL_TEXTURE0 + id);
glBindTexture(GL_TEXTURE_1D, tx); glBindTexture(GL_TEXTURE_2D, tx);
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexImage1D(GL_TEXTURE_1D, 0, GL_RGBA, isize(v), 0, GL_RGBA, GL_FLOAT, &v[0]); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, length, isize(v)/length, 0, GL_RGBA, GL_FLOAT, &v[0]);
GLERR("bind_array"); GLERR("bind_array");
} }
ld& exp_decay_current() { void uniform2(GLint id, array<float, 2> fl) {
return (sol || hyperbolic) ? exp_decay_exp : exp_decay_poly; glUniform2f(id, fl[0], fl[1]);
} }
int& max_iter_current() { array<float, 2> enc(int i, int a) {
if(nonisotropic) return max_iter_sol; array<float, 2> res;
else return max_iter_iso; res[0] = ((i%per_row) * S7 + a + .5) / length;
} res[1] = ((i / per_row) + .5) / rows;
return res;
};
EX void cast() { EX void cast() {
enable_raycaster(); enable_raycaster();
@ -480,21 +466,22 @@ EX void cast() {
auto& cd = current_display; auto& cd = current_display;
glUniform1f(o->uFovX, cd->tanfov); glUniform1f(o->uFovX, cd->tanfov);
glUniform1f(o->uFovY, cd->tanfov * cd->ysize / cd->xsize); glUniform1f(o->uFovY, cd->tanfov * cd->ysize / cd->xsize);
celllister cl(viewctr.at->c7, 10, 3000, NULL);
length = 4096;
per_row = length / S7;
vector<cell*> lst;
celllister cl(viewctr.at->c7, 10, 10000, NULL);
vector<cell*> lst = cl.lst; vector<cell*> lst = cl.lst;
int maxl = 32768 / S7; rows = next_p2((isize(lst)+per_row-1) / per_row);
if(isize(lst) > maxl) lst.resize(maxl);
map<cell*, int> ids; map<cell*, int> ids;
for(int i=0; i<isize(lst); i++) ids[lst[i]] = i; for(int i=0; i<isize(lst); i++) ids[lst[i]] = i;
int length = next_p2(isize(lst) * S7);
glUniform1i(o->uLength, length); glUniform1i(o->uLength, length);
GLERR("uniform length"); GLERR("uniform length");
auto enc = [&] (int i) { return float((i+.5) / length); };
// for(auto &m: reg3::spins) println(hlog, m); // for(auto &m: reg3::spins) println(hlog, m);
@ -502,7 +489,7 @@ EX void cast() {
GLERR("uniform start"); GLERR("uniform start");
glUniform1i(o->uN, S7); glUniform1i(o->uN, S7);
GLERR("uniform N"); GLERR("uniform N");
glUniform1f(o->uStartid, enc(ids[viewctr.at->c7] * S7)); uniform2(o->uStartid, enc(ids[viewctr.at->c7], 0));
GLERR("uniform startid"); GLERR("uniform startid");
glUniform1f(o->uIPD, vid.ipd); glUniform1f(o->uIPD, vid.ipd);
GLERR("uniform IPD"); GLERR("uniform IPD");
@ -510,19 +497,20 @@ EX void cast() {
vector<transmatrix> ms; vector<transmatrix> ms;
for(int j=0; j<S7; j++) ms.push_back(currentmap->relative_matrix(cwt.at->master, cwt.at->cmove(j)->master)); for(int j=0; j<S7; j++) ms.push_back(currentmap->relative_matrix(cwt.at->master, cwt.at->cmove(j)->master));
vector<float> connections(length); vector<array<float, 4>> connections(length * rows);
vector<array<float, 4>> wallcolor(length); vector<array<float, 4>> wallcolor(length * rows);
vector<float> matrixid(length);
if(1) for(cell *c: lst) { if(1) for(cell *c: lst) {
int id = ids[c]; int id = ids[c];
forCellIdEx(c1, i, c) { forCellIdEx(c1, i, c) {
int u = id * S7 + i; int u = (id/per_row*length) + (id%per_row * S7) + i;
if(!ids.count(c1)) { if(!ids.count(c1)) {
wallcolor[u] = glhr::acolor(0xFF); wallcolor[u] = glhr::acolor(0xFF);
continue; continue;
} }
connections[u] = enc(ids[c1] * S7); auto code = enc(ids[c1], 0);
connections[u][0] = code[0];
connections[u][1] = code[1];
if(isWall3(c1)) { if(isWall3(c1)) {
celldrawer dd; celldrawer dd;
dd.cw.at = c1; dd.cw.at = c1;
@ -537,7 +525,7 @@ EX void cast() {
for(int k=0; k<=isize(ms); k++) { for(int k=0; k<=isize(ms); k++) {
if(k < isize(ms) && !eqmatrix(ms[k], T)) continue; if(k < isize(ms) && !eqmatrix(ms[k], T)) continue;
if(k == isize(ms)) ms.push_back(T); if(k == isize(ms)) ms.push_back(T);
matrixid[u] = (k+.5) / 1024.; connections[u][2] = (k+.5) / 1024.;
break; break;
} }
} }
@ -570,7 +558,6 @@ EX void cast() {
bind_array(wallcolor, o->tWallcolor, txWallcolor, 4); bind_array(wallcolor, o->tWallcolor, txWallcolor, 4);
bind_array(connections, o->tConnections, txConnections, 3); bind_array(connections, o->tConnections, txConnections, 3);
bind_array(matrixid, o->tMatrixid, txMatrixid, 5);
glVertexAttribPointer(hr::aPosition, 4, GL_FLOAT, GL_FALSE, sizeof(glvertex), &screen[0]); glVertexAttribPointer(hr::aPosition, 4, GL_FLOAT, GL_FALSE, sizeof(glvertex), &screen[0]);
glhr::set_depthtest(false); glhr::set_depthtest(false);