diff --git a/src/implicit.mesh.glsl b/src/implicit.mesh.glsl index 40019d29938983dc687478daf5016d0cb3356517..c4b294c6d20123b90da3cfb76fa2f7687195998b 100644 --- a/src/implicit.mesh.glsl +++ b/src/implicit.mesh.glsl @@ -60,45 +60,49 @@ void main() positions[i].x += (bounds[0]-bounds[3])*0.25 * (mod(gl_LocalInvocationID.x,4.)-1.5); positions[i].y += (bounds[1]-bounds[4])*0.25 * (mod(floor(gl_LocalInvocationID.x/4.),4.)-1.5); positions[i].z += (bounds[2]-bounds[5])*0.25 * (floor(gl_LocalInvocationID.x/16.)-1.5+gl_WorkGroupID.z*2.); - } - - //mat4 sw=pc.world; - gl_MeshVerticesEXT[vindex+0].gl_Position=mvp*(positions[0]); - gl_MeshVerticesEXT[vindex+1].gl_Position=mvp*(positions[1]); - gl_MeshVerticesEXT[vindex+2].gl_Position=mvp*(positions[2]); - gl_MeshVerticesEXT[vindex+3].gl_Position=mvp*(positions[3]); - gl_MeshVerticesEXT[vindex+4].gl_Position=mvp*(positions[4]); - gl_MeshVerticesEXT[vindex+5].gl_Position=mvp*(positions[5]); - gl_MeshVerticesEXT[vindex+6].gl_Position=mvp*(positions[6]); - gl_MeshVerticesEXT[vindex+7].gl_Position=mvp*(positions[7]); - vertexOutput[vindex+0].position=(positions[0]); - vertexOutput[vindex+1].position=(positions[1]); - vertexOutput[vindex+2].position=(positions[2]); - vertexOutput[vindex+3].position=(positions[3]); - vertexOutput[vindex+4].position=(positions[4]); - vertexOutput[vindex+5].position=(positions[5]); - vertexOutput[vindex+6].position=(positions[6]); - vertexOutput[vindex+7].position=(positions[7]); - - if(signingvec.x>0){ - gl_PrimitiveTriangleIndicesEXT[pindex+0]=uvec3(4,5,6)+uvec3(vindex); - gl_PrimitiveTriangleIndicesEXT[pindex+1]=uvec3(5,6,7)+uvec3(vindex); - }else{ - gl_PrimitiveTriangleIndicesEXT[pindex+0]=uvec3(0,1,2)+uvec3(vindex); - gl_PrimitiveTriangleIndicesEXT[pindex+1]=uvec3(1,2,3)+uvec3(vindex); - } - if(signingvec.y>0){ - gl_PrimitiveTriangleIndicesEXT[pindex+2]=uvec3(2,3,6)+uvec3(vindex); - gl_PrimitiveTriangleIndicesEXT[pindex+3]=uvec3(7,3,6)+uvec3(vindex); - }else{ - gl_PrimitiveTriangleIndicesEXT[pindex+2]=uvec3(0,1,4)+uvec3(vindex); - gl_PrimitiveTriangleIndicesEXT[pindex+3]=uvec3(5,1,4)+uvec3(vindex); } - if(signingvec.z>0){ - gl_PrimitiveTriangleIndicesEXT[pindex+4]=uvec3(1,3,5)+uvec3(vindex); - gl_PrimitiveTriangleIndicesEXT[pindex+5]=uvec3(3,5,7)+uvec3(vindex); - }else{ - gl_PrimitiveTriangleIndicesEXT[pindex+4]=uvec3(0,2,4)+uvec3(vindex); - gl_PrimitiveTriangleIndicesEXT[pindex+5]=uvec3(2,4,6)+uvec3(vindex); + + float[2] check = scene(vec3[2](vec3(positions[0].xyz),vec3(positions[7].xyz)), true); + if ((check[0] < 0) && (check[1] > 0)) + { + //mat4 sw=pc.world; + gl_MeshVerticesEXT[vindex+0].gl_Position=mvp*(positions[0]); + gl_MeshVerticesEXT[vindex+1].gl_Position=mvp*(positions[1]); + gl_MeshVerticesEXT[vindex+2].gl_Position=mvp*(positions[2]); + gl_MeshVerticesEXT[vindex+3].gl_Position=mvp*(positions[3]); + gl_MeshVerticesEXT[vindex+4].gl_Position=mvp*(positions[4]); + gl_MeshVerticesEXT[vindex+5].gl_Position=mvp*(positions[5]); + gl_MeshVerticesEXT[vindex+6].gl_Position=mvp*(positions[6]); + gl_MeshVerticesEXT[vindex+7].gl_Position=mvp*(positions[7]); + vertexOutput[vindex+0].position=(positions[0]); + vertexOutput[vindex+1].position=(positions[1]); + vertexOutput[vindex+2].position=(positions[2]); + vertexOutput[vindex+3].position=(positions[3]); + vertexOutput[vindex+4].position=(positions[4]); + vertexOutput[vindex+5].position=(positions[5]); + vertexOutput[vindex+6].position=(positions[6]); + vertexOutput[vindex+7].position=(positions[7]); + + if(signingvec.x>0){ + gl_PrimitiveTriangleIndicesEXT[pindex+0]=uvec3(4,5,6)+uvec3(vindex); + gl_PrimitiveTriangleIndicesEXT[pindex+1]=uvec3(5,6,7)+uvec3(vindex); + }else{ + gl_PrimitiveTriangleIndicesEXT[pindex+0]=uvec3(0,1,2)+uvec3(vindex); + gl_PrimitiveTriangleIndicesEXT[pindex+1]=uvec3(1,2,3)+uvec3(vindex); + } + if(signingvec.y>0){ + gl_PrimitiveTriangleIndicesEXT[pindex+2]=uvec3(2,3,6)+uvec3(vindex); + gl_PrimitiveTriangleIndicesEXT[pindex+3]=uvec3(7,3,6)+uvec3(vindex); + }else{ + gl_PrimitiveTriangleIndicesEXT[pindex+2]=uvec3(0,1,4)+uvec3(vindex); + gl_PrimitiveTriangleIndicesEXT[pindex+3]=uvec3(5,1,4)+uvec3(vindex); + } + if(signingvec.z>0){ + gl_PrimitiveTriangleIndicesEXT[pindex+4]=uvec3(1,3,5)+uvec3(vindex); + gl_PrimitiveTriangleIndicesEXT[pindex+5]=uvec3(3,5,7)+uvec3(vindex); + }else{ + gl_PrimitiveTriangleIndicesEXT[pindex+4]=uvec3(0,2,4)+uvec3(vindex); + gl_PrimitiveTriangleIndicesEXT[pindex+5]=uvec3(2,4,6)+uvec3(vindex); + } } } \ No newline at end of file diff --git a/src/intervals.glsl b/src/intervals.glsl index 6ac13871257226453e41b505adee70401fe7b8c6..49862f259ee4d0777c94fb11fe74aa5207aff598 100644 --- a/src/intervals.glsl +++ b/src/intervals.glsl @@ -52,7 +52,7 @@ layout(set=0,binding=11)restrict readonly buffer MatConst{ mat4 mats[]; }matconst; layout(set=0,binding=12)restrict readonly buffer DepInfo{ - uint8_t dependencies[2][]; + uint8_t dependencies[][2]; }depinfo; // unpack integers @@ -557,18 +557,55 @@ Description desc; void pruneall (uint8_t pos) { uint8_t[2] deps; - for (int i = 0; i < pos; i++) + for (uint8_t i = uint8_t(0); i < pos; i++) { deps = depinfo.dependencies[desc.dependencies+i]; if (deps[1] != 255) { - //this is a dual output function (dup) - //todo + if ((deps[0] == pos) || (deps[1] == pos)) + { + if ((mask[i>>3] & ~(1<<(i&7))) > 0) + { + mask[i>>3] &= uint8_t(~(1<<(i&7))); + } + else { + pruneall(i); + } + } } else if (deps[0] == pos) { pruneall(i); } } - mask[pos>>3] &= ~(1<<(pos&7)); + mask[pos>>3] &= uint8_t(~(1<<(pos&7))); +} + +void prunesome (uint8_t pos, bool prunemask[6]) { + uint8_t[2] deps; + int maskindex = 0; + for (uint8_t i = uint8_t(0); i < pos; i++) + { + deps = depinfo.dependencies[desc.dependencies+i]; + if (deps[1] != 255) { + if ((deps[0] == pos) || (deps[1] == pos)) + { + if (prunemask[maskindex++]) { + if ((mask[i>>3] & ~(1<<(i&7))) > 0) + { + mask[i>>3] &= uint8_t(~(1<<(i&7))); + } + else { + pruneall(i); + } + } + } + } + else if (deps[0] == pos) { + if (prunemask[maskindex++]) { + pruneall(i); + } + } + } + mask[pos>>3] &= uint8_t(~(1<<(pos&7))); } #ifdef debug @@ -2748,12 +2785,12 @@ float[2]scene(vec3 p[2], bool prune) #ifdef debug vec3 sceneoverride(vec3 p, bool m) { - return scene(vec3[2](p,p)); + return scene(vec3[2](p,p), false); } #else float sceneoverride(vec3 p, bool m) { - return scene(vec3[2](p,p))[0]; + return scene(vec3[2](p,p), false)[0]; } #endif