void Image::update () { //Prepare image data for rendering updateFlat(); updateBounds(); updateBuffers(); }
void updateGraphics(int x) { switch(renderMode){ case 2: updateFlat(); break; default: break; } }
void Image::encodeGpu (EncoderGpu *encoder) { //Prepare image data for encoding updateFlat(); updateBounds(); updateBuffers(); glViewport( 0, 0, gridSize.x, gridSize.y ); glDisable( GL_DEPTH_TEST ); glDisable( GL_MULTISAMPLE ); ///////////////////////////////////////////////////// // Init size counters and main grid { Shader *shader = encoder->shaderInit; shader->use(); Int32 uPtrInfo = shader->program->getUniform( "ptrInfo" ); glUniformui64( uPtrInfo, bufGpuInfo.getAddress() ); Int32 uPtrGrid = shader->program->getUniform( "ptrGrid" ); glUniformui64( uPtrGrid, bufGpuGrid.getAddress() ); Int32 uGridSize = shader->program->getUniform( "gridSize" ); glUniform2i( uGridSize, gridSize.x, gridSize.y ); renderFullScreenQuad( shader ); } ///////////////////////////////////////////////////// // Init object grids { Shader *shader = encoder->shaderInitObject; shader->use(); Int32 uPtrObjects = shader->program->getUniform( "ptrObjects" ); glUniformui64( uPtrObjects, bufObjInfos.getAddress() ); Int32 uPtrGrid = shader->program->getUniform( "ptrGrid" ); glUniformui64( uPtrGrid, bufGpuGrid.getAddress() ); Int32 uGridOrigin = shader->program->getUniform( "gridOrigin" ); glUniform2f( uGridOrigin, gridOrigin.x, gridOrigin.y ); Int32 uGridSize = shader->program->getUniform( "gridSize" ); glUniform2i( uGridSize, gridSize.x, gridSize.y ); Int32 uCellSize = shader->program->getUniform( "cellSize" ); glUniform2f( uCellSize, cellSize.x, cellSize.y ); Int32 aPos = shader->program->getAttribute( "in_pos" ); glBindBuffer( GL_ARRAY_BUFFER, bufObjs.getId() ); glVertexAttribPointer( aPos, 3, GL_FLOAT, false, sizeof(vec3), 0 ); glEnableVertexAttribArray( aPos ); glDrawArrays( GL_LINES, 0, objs.size() * 2 ); glDisableVertexAttribArray( aPos ); } glMemoryBarrier( GL_SHADER_GLOBAL_ACCESS_BARRIER_BIT_NV ); checkGlError( "encodeImage init" ); ///////////////////////////////////////////////////// // Encode object lines { Shader *shader = encoder->shaderLines; shader->use(); Int32 uPtrObjects = shader->program->getUniform( "ptrObjects" ); glUniformui64( uPtrObjects, bufObjInfos.getAddress() ); Int32 uPtrInfo = shader->program->getUniform( "ptrInfo" ); glUniformui64( uPtrInfo, bufGpuInfo.getAddress() ); Int32 uPtrGrid = shader->program->getUniform( "ptrGrid" ); glUniformui64( uPtrGrid, bufGpuGrid.getAddress() ); Int32 uPtrStream = shader->program->getUniform( "ptrStream" ); glUniformui64( uPtrStream, bufGpuStream.getAddress() ); Int32 uGridOrigin = shader->program->getUniform( "gridOrigin" ); glUniform2f( uGridOrigin, gridOrigin.x, gridOrigin.y ); Int32 uGridSize = shader->program->getUniform( "gridSize" ); glUniform2i( uGridSize, gridSize.x, gridSize.y ); Int32 uCellSize = shader->program->getUniform( "cellSize" ); glUniform2f( uCellSize, cellSize.x, cellSize.y ); for (int o=0; o<(int)objects.size(); ++o) { Object *object = objects[o]; Int32 uObjectId = shader->program->getUniform( "objectId" ); glUniform1i( uObjectId, o ); Int32 aPos = shader->program->getAttribute( "in_pos" ); glBindBuffer( GL_ARRAY_BUFFER, object->bufLines.getId() ); glVertexAttribPointer( aPos, 2, GL_FLOAT, false, sizeof( Vec2 ), 0 ); glEnableVertexAttribArray( aPos ); glDrawArrays( GL_LINES, 0, object->lines.size() * 2 ); glDisableVertexAttribArray( aPos ); } } ///////////////////////////////////////////////////// // Encode object quads { Shader *shader = encoder->shaderQuads; shader->use(); Int32 uPtrObjects = shader->program->getUniform( "ptrObjects" ); glUniformui64( uPtrObjects, bufObjInfos.getAddress() ); Int32 uPtrInfo = shader->program->getUniform( "ptrInfo" ); glUniformui64( uPtrInfo, bufGpuInfo.getAddress() ); Int32 uPtrGrid = shader->program->getUniform( "ptrGrid" ); glUniformui64( uPtrGrid, bufGpuGrid.getAddress() ); Int32 uPtrStream = shader->program->getUniform( "ptrStream" ); glUniformui64( uPtrStream, bufGpuStream.getAddress() ); Int32 uGridOrigin = shader->program->getUniform( "gridOrigin" ); glUniform2f( uGridOrigin, gridOrigin.x, gridOrigin.y ); Int32 uGridSize = shader->program->getUniform( "gridSize" ); glUniform2i( uGridSize, gridSize.x, gridSize.y ); Int32 uCellSize = shader->program->getUniform( "cellSize" ); glUniform2f( uCellSize, cellSize.x, cellSize.y ); for (int o=0; o<(int)objects.size(); ++o) { Object *object = objects[o]; Int32 uObjectId = shader->program->getUniform( "objectId" ); glUniform1i( uObjectId, o ); Int32 aPos = shader->program->getAttribute( "in_pos" ); glBindBuffer( GL_ARRAY_BUFFER, object->bufQuads.getId() ); glVertexAttribPointer( aPos, 2, GL_FLOAT, false, sizeof( Vec2 ), 0 ); glEnableVertexAttribArray( aPos ); glDrawArrays( GL_TRIANGLES, 0, object->quads.size() * 3 ); glDisableVertexAttribArray( aPos ); } } glMemoryBarrier( GL_SHADER_GLOBAL_ACCESS_BARRIER_BIT_NV ); checkGlError( "encodeImage lines quads" ); ///////////////////////////////////////////////////// // Encode object properties { Shader *shader = encoder->shaderObject; shader->use(); Int32 uPtrObjects = shader->program->getUniform( "ptrObjects" ); glUniformui64( uPtrObjects, bufObjInfos.getAddress() ); Int32 uPtrInfo = shader->program->getUniform( "ptrInfo" ); glUniformui64( uPtrInfo, bufGpuInfo.getAddress() ); Int32 uPtrGrid = shader->program->getUniform( "ptrGrid" ); glUniformui64( uPtrGrid, bufGpuGrid.getAddress() ); Int32 uPtrStream = shader->program->getUniform( "ptrStream" ); glUniformui64( uPtrStream, bufGpuStream.getAddress() ); Int32 uGridOrigin = shader->program->getUniform( "gridOrigin" ); glUniform2f( uGridOrigin, gridOrigin.x, gridOrigin.y ); Int32 uGridSize = shader->program->getUniform( "gridSize" ); glUniform2i( uGridSize, gridSize.x, gridSize.y ); Int32 uCellSize = shader->program->getUniform( "cellSize" ); glUniform2f( uCellSize, cellSize.x, cellSize.y ); for (int o=0; o<(int)objects.size(); ++o) { Object *object = objects[o]; ObjInfo &obj = objInfos[o]; // Int32 uPtrObjGrid = shader->program->getUniform( "ptrObjGrid" ); glUniformui64( uPtrObjGrid, bufGpuGrid.getAddress() + obj.gridOffset * sizeof(int) ); Int32 uObjGridOrigin = shader->program->getUniform( "objGridOrigin" ); glUniform2i( uObjGridOrigin, obj.gridOrigin.x, obj.gridOrigin.y ); Int32 uObjGridSize = shader->program->getUniform( "objGridSize" ); glUniform2i( uObjGridSize, obj.gridSize.x, obj.gridSize.y ); // Int32 uObjectId = shader->program->getUniform( "objectId" ); glUniform1i( uObjectId, o ); Int32 uColor = shader->program->getUniform( "color" ); glUniform4fv( uColor, 1, (GLfloat*) &object->color ); //Transform and round object bounds to grid space Vec2 min = Vec::Floor( (object->min - gridOrigin) / cellSize ); Vec2 max = Vec::Ceil( (object->max - gridOrigin) / cellSize ); //Transform to [-1,1] normalized coordinates (glViewport will transform back) min = (min / vec2( gridSize )) * 2.0f - Vec2(1.0f,1.0f); max = (max / vec2( gridSize )) * 2.0f - Vec2(1.0f,1.0f); renderQuad( shader, min, max ); } } glMemoryBarrier( GL_SHADER_GLOBAL_ACCESS_BARRIER_BIT_NV ); checkGlError( "encodeImage object" ); ///////////////////////////////////////////////////// // Sort objects in every cell back to front { Shader *shader = encoder->shaderSort; shader->use(); Int32 uPtrGrid = shader->program->getUniform( "ptrGrid" ); glUniformui64( uPtrGrid, bufGpuGrid.getAddress() ); Int32 uPtrStream = shader->program->getUniform( "ptrStream" ); glUniformui64( uPtrStream, bufGpuStream.getAddress() ); Int32 uGridSize = shader->program->getUniform( "gridSize" ); glUniform2i( uGridSize, gridSize.x, gridSize.y ); renderFullScreenQuad( shader ); } glMemoryBarrier( GL_SHADER_GLOBAL_ACCESS_BARRIER_BIT_NV ); checkGlError( "encodeImage sort" ); }
void Image::encodeCpu (EncoderCpu *encoder) { //Prepare image data for encoding updateFlat(); updateBounds(); updateBuffers(); //Reset cpu buffers if (ptrCpuInfo) delete[] ptrCpuInfo; if (ptrCpuGrid) delete[] ptrCpuGrid; if (ptrCpuStream) delete[] ptrCpuStream; //Init new buffers ptrCpuInfo = new int[ NUM_INFO_COUNTERS ]; ptrCpuGrid = new int[ MAX_STREAM_SIZE ]; ptrCpuStream = new float[ MAX_STREAM_SIZE ]; ///////////////////////////////////////////////////// // Init size counters and main grid encoder->ptrInfo = ptrCpuInfo; encoder->ptrGrid = ptrCpuGrid; encoder->ptrStream = ptrCpuStream; encoder->ptrObjects = (int*) &objInfos[0]; encoder->gridOrigin = gridOrigin; encoder->gridSize = gridSize; encoder->cellSize = cellSize; encoder->encodeInit(); ///////////////////////////////////////////////////// // Init object grids for (int o=0; o<(int)objects.size(); ++o) { Object *obj = objects[o]; encoder->objectId = o; encoder->objMin = obj->min; encoder->objMax = obj->max; encoder->encodeInitObject(); } ///////////////////////////////////////////////////// // Encode object lines for (int o=0; o<(int)objects.size(); ++o) { Object *obj = objects[o]; for (Uint32 l=0; l<obj->lines.size(); ++l) { Line &line = obj->lines[l]; encoder->objectId = o; encoder->line0 = line.p0; encoder->line1 = line.p1; encoder->encodeLine(); } } ///////////////////////////////////////////////////// // Encode object quads for (int o=0; o<(int)objects.size(); ++o) { Object *obj = objects[o]; for (Uint32 q=0; q < obj->quads.size(); ++q) { Quad &quad= obj->quads[q]; encoder->objectId = o; encoder->quad0 = quad.p0; encoder->quad1 = quad.p1; encoder->quad2 = quad.p2; encoder->encodeQuad(); } } ///////////////////////////////////////////////////// // Encode object properties for (int o=0; o<(int)objects.size(); ++o) { Object *obj = objects[o]; encoder->objectId = o; encoder->objMin = obj->min; encoder->objMax = obj->max; encoder->color = obj->color; encoder->encodeObject(); } ///////////////////////////////////////////////////// // Sort objects in every cell back to front encoder->encodeSort(); ///////////////////////////////////////////////////// // Upload data Uint32 streamLen = 0; encoder->getTotalStreamInfo( streamLen ); bufGpuGrid.upload( gridSize.x * gridSize.y * NUM_CELL_COUNTERS * sizeof(int), ptrCpuGrid ); bufGpuStream.upload( streamLen * sizeof(float), ptrCpuStream ); checkGlError( "Image::encodeCpu upload" ); }