I’m studying and building 3D modeling tools with OpenGL and trying to improve overall performance in drawing with glscissor()
, however other objects are cleared up as well whenever I try to draw a new object in clipped area by glscissor()
.
Please help me out to check what can be the problem and how to fix it.
I was only able to see entire objects when I set force redraw flag to true in attached video.
So basically I want to keep the previous objects stay in the screen with no update, and to add new object and make all those to be visible at the same time.
I will post major function in my project
void Display_Handle::DisplayOperator(Objects &sourceObject, Textures &sourceTexture, GL_Window *glView, ViewportClipping *vClip, OperationMode CurMode, int viewPort, int cameraIndex) {
for (int viewPort = 0; viewPort < 4; viewPort++) {
for (int dataIndex = 0; dataIndex < vClip[i].count; dataIndex++) {
// Clear background with black
if (CurMode.operation == OPERATION_RENDERING)
glClearColor(0.0, 0.0, 0.0, 0.0);
// Clear background with own color
else
glClearColor(glView[viewPort].bgColor.r, glView[viewPort].bgColor.g, glView[viewPort].bgColor.b, glView[viewPort].bgColor.a);
// Clear color buffer
glClear(GL_COLOR_BUFFER_BIT);
// Select Projection Matrix
glMatrixMode(GL_PROJECTION);
// Clear depth buffer
glClear(GL_DEPTH_BUFFER_BIT);
// Enable scissor
glEnable(GL_SCISSOR_TEST);
// Scissor area
glScissor(vClip[viewPort].data[dataIndex].area.x, vClip[viewPort].data[dataIndex].area.y, vClip[viewPort].data[dataIndex].area.width, vClip[viewPort].data[dataIndex].area.height);
// Disable scissor
glDisable(GL_SCISSOR_TEST);
// Reset Projection Matrix
glLoadIdentity();
// Viewport
glViewport(0, 0, glView[viewPort].init.Width, glView[viewPort].init.Height);
// Range
ViewX = (GLdouble)(glView[viewPort].init.Width / 2);
ViewY = (GLdouble)(glView[viewPort].init.Height / 2);
// Projection
glOrtho(ViewX, -ViewX, ViewY, -ViewY, -500.0, 500.0);
// Select Modelview Matrix
glMatrixMode(GL_MODELVIEW);
// Reset Modelview Matrix
glLoadIdentity();
// Zoom in, out
glScaled(glView[viewPort].distance, glView[viewPort].distance, glView[viewPort].distance);
// Pan
if (glView[viewPort].viewType == VIEW_TOP || glView[viewPort].viewType == VIEW_BOTTOM)
glTranslated(glView[viewPort].translate.x, glView[viewPort].translate.z, 0.0);
else if (glView[viewPort].viewType == VIEW_FRONT || glView[viewPort].viewType == VIEW_BACK)
glTranslated(glView[viewPort].translate.x, glView[viewPort].translate.y, 0.0);
else if (glView[viewPort].viewType == VIEW_LEFT || glView[viewPort].viewType == VIEW_RIGHT)
glTranslated(glView[viewPort].translate.z, glView[viewPort].translate.y, 0.0);
// View
gluLookAt(glView[viewPort].eye.x, glView[viewPort].eye.y, glView[viewPort].eye.z, glView[viewPort].center.x, glView[viewPort].center.y, glView[viewPort].center.z, glView[viewPort].up.x, glView[viewPort].up.y, glView[viewPort].up.z);
// Get viewport axis
glGetDoublev(GL_MODELVIEW_MATRIX, glView[viewPort].mvMatrix);
glGetDoublev(GL_PROJECTION_MATRIX, glView[viewPort].prjMatrix);
glGetIntegerv(GL_VIEWPORT, glView[viewPort].viewport);
// Grid view
UpdateGridView(viewPort);
// Draw objects and textures
DrawObject(sourceObject, sourceTexture, vClip[viewPort].data[dataIndex].objectID, viewPort, CurMode.activeMode, cameraIndex);
// Swap buffers
SwapBuffers(glView[viewPort].hDC);
}
}