mirror of
https://github.com/leozide/leocad
synced 2025-01-30 20:34:56 +01:00
Context state cleanup.
This commit is contained in:
parent
155fa7cdc2
commit
57b8732ed6
13 changed files with 107 additions and 136 deletions
|
@ -92,6 +92,7 @@ lcContext::lcContext()
|
||||||
mLineWidth = 1.0f;
|
mLineWidth = 1.0f;
|
||||||
#ifndef LC_OPENGLES
|
#ifndef LC_OPENGLES
|
||||||
mMatrixMode = GL_MODELVIEW;
|
mMatrixMode = GL_MODELVIEW;
|
||||||
|
mTextureEnabled = false;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
mFramebufferObject = 0;
|
mFramebufferObject = 0;
|
||||||
|
@ -441,8 +442,8 @@ void lcContext::SetDefaultState()
|
||||||
mIndexBufferPointer = NULL;
|
mIndexBufferPointer = NULL;
|
||||||
mVertexBufferOffset = (char*)~0;
|
mVertexBufferOffset = (char*)~0;
|
||||||
|
|
||||||
glDisable(GL_TEXTURE_2D);
|
glBindTexture(GL_TEXTURE_2D, 0);
|
||||||
mTexture = NULL;
|
mTexture = 0;
|
||||||
|
|
||||||
glLineWidth(1.0f);
|
glLineWidth(1.0f);
|
||||||
mLineWidth = 1.0f;
|
mLineWidth = 1.0f;
|
||||||
|
@ -458,10 +459,20 @@ void lcContext::SetDefaultState()
|
||||||
glMatrixMode(GL_MODELVIEW);
|
glMatrixMode(GL_MODELVIEW);
|
||||||
mMatrixMode = GL_MODELVIEW;
|
mMatrixMode = GL_MODELVIEW;
|
||||||
glShadeModel(GL_FLAT);
|
glShadeModel(GL_FLAT);
|
||||||
|
|
||||||
|
glDisable(GL_TEXTURE_2D);
|
||||||
|
mTextureEnabled = false;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void lcContext::ClearResources()
|
||||||
|
{
|
||||||
|
ClearVertexBuffer();
|
||||||
|
ClearIndexBuffer();
|
||||||
|
SetTexture(0);
|
||||||
|
}
|
||||||
|
|
||||||
void lcContext::SetMaterial(lcMaterialType MaterialType)
|
void lcContext::SetMaterial(lcMaterialType MaterialType)
|
||||||
{
|
{
|
||||||
if (MaterialType == mMaterialType)
|
if (MaterialType == mMaterialType)
|
||||||
|
@ -483,16 +494,35 @@ void lcContext::SetMaterial(lcMaterialType MaterialType)
|
||||||
{
|
{
|
||||||
case LC_MATERIAL_UNLIT_TEXTURE_MODULATE:
|
case LC_MATERIAL_UNLIT_TEXTURE_MODULATE:
|
||||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
||||||
|
|
||||||
|
if (!mTextureEnabled)
|
||||||
|
{
|
||||||
|
glEnable(GL_TEXTURE_2D);
|
||||||
|
mTextureEnabled = true;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case LC_MATERIAL_FAKELIT_TEXTURE_DECAL:
|
case LC_MATERIAL_FAKELIT_TEXTURE_DECAL:
|
||||||
case LC_MATERIAL_UNLIT_TEXTURE_DECAL:
|
case LC_MATERIAL_UNLIT_TEXTURE_DECAL:
|
||||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
|
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
|
||||||
|
|
||||||
|
if (!mTextureEnabled)
|
||||||
|
{
|
||||||
|
glEnable(GL_TEXTURE_2D);
|
||||||
|
mTextureEnabled = true;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case LC_MATERIAL_UNLIT_COLOR:
|
case LC_MATERIAL_UNLIT_COLOR:
|
||||||
case LC_MATERIAL_UNLIT_VERTEX_COLOR:
|
case LC_MATERIAL_UNLIT_VERTEX_COLOR:
|
||||||
case LC_MATERIAL_FAKELIT_COLOR:
|
case LC_MATERIAL_FAKELIT_COLOR:
|
||||||
|
if (mTextureEnabled)
|
||||||
|
{
|
||||||
|
glDisable(GL_TEXTURE_2D);
|
||||||
|
mTextureEnabled = false;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case LC_NUM_MATERIALS:
|
case LC_NUM_MATERIALS:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -514,6 +544,15 @@ void lcContext::SetLineWidth(float LineWidth)
|
||||||
mLineWidth = LineWidth;
|
mLineWidth = LineWidth;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void lcContext::SetTexture(GLuint Texture)
|
||||||
|
{
|
||||||
|
if (mTexture == Texture)
|
||||||
|
return;
|
||||||
|
|
||||||
|
glBindTexture(GL_TEXTURE_2D, Texture);
|
||||||
|
mTexture = Texture;
|
||||||
|
}
|
||||||
|
|
||||||
void lcContext::SetColor(float Red, float Green, float Blue, float Alpha)
|
void lcContext::SetColor(float Red, float Green, float Blue, float Alpha)
|
||||||
{
|
{
|
||||||
SetColor(lcVector4(Red, Green, Blue, Alpha));
|
SetColor(lcVector4(Red, Green, Blue, Alpha));
|
||||||
|
@ -549,7 +588,7 @@ bool lcContext::BeginRenderToTexture(int Width, int Height)
|
||||||
|
|
||||||
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, mFramebufferObject);
|
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, mFramebufferObject);
|
||||||
|
|
||||||
glBindTexture(GL_TEXTURE_2D, mFramebufferTexture);
|
SetTexture(mFramebufferTexture);
|
||||||
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, Width, Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, Width, Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
|
||||||
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mFramebufferTexture, 0);
|
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mFramebufferTexture, 0);
|
||||||
|
@ -558,7 +597,7 @@ bool lcContext::BeginRenderToTexture(int Width, int Height)
|
||||||
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, Width, Height);
|
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, Width, Height);
|
||||||
glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, mDepthRenderbufferObject);
|
glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, mDepthRenderbufferObject);
|
||||||
|
|
||||||
glBindTexture(GL_TEXTURE_2D, 0);
|
SetTexture(0);
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, mFramebufferObject);
|
glBindFramebuffer(GL_FRAMEBUFFER, mFramebufferObject);
|
||||||
|
|
||||||
if (glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
|
if (glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
|
||||||
|
@ -576,7 +615,7 @@ bool lcContext::BeginRenderToTexture(int Width, int Height)
|
||||||
glGenFramebuffersEXT(1, &mFramebufferObject);
|
glGenFramebuffersEXT(1, &mFramebufferObject);
|
||||||
glGenTextures(1, &mFramebufferTexture);
|
glGenTextures(1, &mFramebufferTexture);
|
||||||
|
|
||||||
glBindTexture(GL_TEXTURE_2D, mFramebufferTexture);
|
SetTexture(mFramebufferTexture);
|
||||||
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, Width, Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, Width, Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
|
||||||
|
|
||||||
|
@ -591,7 +630,7 @@ bool lcContext::BeginRenderToTexture(int Width, int Height)
|
||||||
|
|
||||||
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, mDepthRenderbufferObject);
|
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, mDepthRenderbufferObject);
|
||||||
|
|
||||||
glBindTexture(GL_TEXTURE_2D, 0);
|
SetTexture(0);
|
||||||
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mFramebufferObject);
|
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mFramebufferObject);
|
||||||
|
|
||||||
if (glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) != GL_FRAMEBUFFER_COMPLETE_EXT)
|
if (glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) != GL_FRAMEBUFFER_COMPLETE_EXT)
|
||||||
|
@ -786,6 +825,24 @@ void lcContext::ClearVertexBuffer()
|
||||||
mVertexBufferObject = 0;
|
mVertexBufferObject = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (gSupportsShaderObjects)
|
||||||
|
{
|
||||||
|
if (mNormalEnabled)
|
||||||
|
glDisableVertexAttribArray(LC_ATTRIB_NORMAL);
|
||||||
|
|
||||||
|
if (mTexCoordEnabled)
|
||||||
|
glDisableVertexAttribArray(LC_ATTRIB_TEXCOORD);
|
||||||
|
|
||||||
|
if (mColorEnabled)
|
||||||
|
glDisableVertexAttribArray(LC_ATTRIB_COLOR);
|
||||||
|
|
||||||
|
glVertexAttribPointer(LC_ATTRIB_POSITION, 3, GL_FLOAT, false, 0, NULL);
|
||||||
|
glVertexAttribPointer(LC_ATTRIB_NORMAL, 4, GL_FLOAT, false, 0, NULL);
|
||||||
|
glVertexAttribPointer(LC_ATTRIB_TEXCOORD, 2, GL_FLOAT, false, 0, NULL);
|
||||||
|
glVertexAttribPointer(LC_ATTRIB_COLOR, 4, GL_FLOAT, false, 0, NULL);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
if (mNormalEnabled)
|
if (mNormalEnabled)
|
||||||
glDisableClientState(GL_NORMAL_ARRAY);
|
glDisableClientState(GL_NORMAL_ARRAY);
|
||||||
|
|
||||||
|
@ -794,6 +851,12 @@ void lcContext::ClearVertexBuffer()
|
||||||
|
|
||||||
if (mColorEnabled)
|
if (mColorEnabled)
|
||||||
glDisableClientState(GL_COLOR_ARRAY);
|
glDisableClientState(GL_COLOR_ARRAY);
|
||||||
|
|
||||||
|
glVertexPointer(3, GL_FLOAT, 0, NULL);
|
||||||
|
glNormalPointer(GL_BYTE, 0, NULL);
|
||||||
|
glTexCoordPointer(2, GL_FLOAT, 0, NULL);
|
||||||
|
glColorPointer(4, GL_FLOAT, 0, NULL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void lcContext::SetVertexBuffer(lcVertexBuffer VertexBuffer)
|
void lcContext::SetVertexBuffer(lcVertexBuffer VertexBuffer)
|
||||||
|
@ -1102,44 +1165,6 @@ void lcContext::BindMesh(lcMesh* Mesh)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void lcContext::UnbindMesh()
|
|
||||||
{
|
|
||||||
if (mTexture)
|
|
||||||
{
|
|
||||||
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
|
|
||||||
glDisable(GL_TEXTURE_2D);
|
|
||||||
mTexture = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (gSupportsVertexBufferObject)
|
|
||||||
{
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER_ARB, 0);
|
|
||||||
mVertexBufferObject = 0;
|
|
||||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);
|
|
||||||
mIndexBufferObject = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
mVertexBufferPointer = NULL;
|
|
||||||
mIndexBufferPointer = NULL;
|
|
||||||
|
|
||||||
if (gSupportsShaderObjects)
|
|
||||||
{
|
|
||||||
glDisableVertexAttribArray(LC_ATTRIB_TEXCOORD);
|
|
||||||
glDisableVertexAttribArray(LC_ATTRIB_NORMAL);
|
|
||||||
glDisableVertexAttribArray(LC_ATTRIB_COLOR);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
glVertexPointer(3, GL_FLOAT, 0, NULL);
|
|
||||||
glNormalPointer(GL_BYTE, 0, NULL);
|
|
||||||
glTexCoordPointer(2, GL_FLOAT, 0, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
mNormalEnabled = false;
|
|
||||||
mTexCoordEnabled = false;
|
|
||||||
mColorEnabled = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void lcContext::FlushState()
|
void lcContext::FlushState()
|
||||||
{
|
{
|
||||||
if (gSupportsShaderObjects)
|
if (gSupportsShaderObjects)
|
||||||
|
@ -1243,30 +1268,14 @@ void lcContext::DrawMeshSection(lcMesh* Mesh, lcMeshSection* Section)
|
||||||
{
|
{
|
||||||
SetMaterial(LightingMode == LC_LIGHTING_UNLIT ? LC_MATERIAL_UNLIT_COLOR : LC_MATERIAL_FAKELIT_COLOR);
|
SetMaterial(LightingMode == LC_LIGHTING_UNLIT ? LC_MATERIAL_UNLIT_COLOR : LC_MATERIAL_FAKELIT_COLOR);
|
||||||
SetVertexFormat(VertexBufferOffset, 3, 1, 0, 0, LightingMode != LC_LIGHTING_UNLIT);
|
SetVertexFormat(VertexBufferOffset, 3, 1, 0, 0, LightingMode != LC_LIGHTING_UNLIT);
|
||||||
|
SetTexture(0);
|
||||||
if (mTexture)
|
|
||||||
{
|
|
||||||
glDisable(GL_TEXTURE_2D);
|
|
||||||
mTexture = NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
VertexBufferOffset += Mesh->mNumVertices * sizeof(lcVertex);
|
VertexBufferOffset += Mesh->mNumVertices * sizeof(lcVertex);
|
||||||
SetMaterial(LightingMode == LC_LIGHTING_UNLIT ? LC_MATERIAL_UNLIT_TEXTURE_DECAL : LC_MATERIAL_FAKELIT_TEXTURE_DECAL);
|
SetMaterial(LightingMode == LC_LIGHTING_UNLIT ? LC_MATERIAL_UNLIT_TEXTURE_DECAL : LC_MATERIAL_FAKELIT_TEXTURE_DECAL);
|
||||||
SetVertexFormat(VertexBufferOffset, 3, 1, 2, 0, LightingMode != LC_LIGHTING_UNLIT);
|
SetVertexFormat(VertexBufferOffset, 3, 1, 2, 0, LightingMode != LC_LIGHTING_UNLIT);
|
||||||
|
SetTexture(Texture->mTexture);
|
||||||
if (Texture != mTexture)
|
|
||||||
{
|
|
||||||
glBindTexture(GL_TEXTURE_2D, Texture->mTexture);
|
|
||||||
|
|
||||||
if (!mTexture)
|
|
||||||
{
|
|
||||||
glEnable(GL_TEXTURE_2D);
|
|
||||||
}
|
|
||||||
|
|
||||||
mTexture = Texture;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const bool DrawConditional = false;
|
const bool DrawConditional = false;
|
||||||
|
@ -1541,12 +1550,7 @@ void lcContext::DrawRenderMeshes(const lcArray<lcRenderMesh>& RenderMeshes, cons
|
||||||
{
|
{
|
||||||
VertexBufferOffset += Mesh->mNumVertices * sizeof(lcVertex);
|
VertexBufferOffset += Mesh->mNumVertices * sizeof(lcVertex);
|
||||||
SetVertexFormat(VertexBufferOffset, 3, 1, 2, 0, EnableNormals);
|
SetVertexFormat(VertexBufferOffset, 3, 1, 2, 0, EnableNormals);
|
||||||
|
SetTexture(Texture->mTexture);
|
||||||
if (Texture != mTexture)
|
|
||||||
{
|
|
||||||
glBindTexture(GL_TEXTURE_2D, Texture->mTexture);
|
|
||||||
mTexture = Texture;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GLenum DrawPrimitiveType = (PrimitiveType == LC_MESH_TRIANGLES || PrimitiveType == LC_MESH_TEXTURED_TRIANGLES) ? GL_TRIANGLES : GL_LINES;
|
GLenum DrawPrimitiveType = (PrimitiveType == LC_MESH_TRIANGLES || PrimitiveType == LC_MESH_TEXTURED_TRIANGLES) ? GL_TRIANGLES : GL_LINES;
|
||||||
|
@ -1588,6 +1592,7 @@ void lcContext::DrawScene(const lcScene& Scene)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
bool DrawLines = lcGetPreferences().mDrawEdgeLines;
|
bool DrawLines = lcGetPreferences().mDrawEdgeLines;
|
||||||
|
SetTexture(0);
|
||||||
|
|
||||||
if (DrawLines)
|
if (DrawLines)
|
||||||
{
|
{
|
||||||
|
@ -1611,8 +1616,6 @@ void lcContext::DrawScene(const lcScene& Scene)
|
||||||
|
|
||||||
if (Scene.mHasTexture)
|
if (Scene.mHasTexture)
|
||||||
{
|
{
|
||||||
glEnable(GL_TEXTURE_2D);
|
|
||||||
|
|
||||||
if (DrawLines)
|
if (DrawLines)
|
||||||
{
|
{
|
||||||
SetMaterial(LC_MATERIAL_UNLIT_TEXTURE_DECAL);
|
SetMaterial(LC_MATERIAL_UNLIT_TEXTURE_DECAL);
|
||||||
|
@ -1633,9 +1636,7 @@ void lcContext::DrawScene(const lcScene& Scene)
|
||||||
glDisable(GL_BLEND);
|
glDisable(GL_BLEND);
|
||||||
}
|
}
|
||||||
|
|
||||||
glDisable(GL_TEXTURE_2D);
|
SetTexture(0);
|
||||||
glBindTexture(GL_TEXTURE_2D, 0);
|
|
||||||
mTexture = NULL;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -63,7 +63,6 @@ public:
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
enum lcMaterialType
|
enum lcMaterialType
|
||||||
{
|
{
|
||||||
LC_MATERIAL_UNLIT_COLOR,
|
LC_MATERIAL_UNLIT_COLOR,
|
||||||
|
@ -103,6 +102,7 @@ public:
|
||||||
static void DestroyResources();
|
static void DestroyResources();
|
||||||
|
|
||||||
void SetDefaultState();
|
void SetDefaultState();
|
||||||
|
void ClearResources();
|
||||||
|
|
||||||
void SetWorldMatrix(const lcMatrix44& WorldMatrix)
|
void SetWorldMatrix(const lcMatrix44& WorldMatrix)
|
||||||
{
|
{
|
||||||
|
@ -127,6 +127,7 @@ public:
|
||||||
void SetMaterial(lcMaterialType MaterialType);
|
void SetMaterial(lcMaterialType MaterialType);
|
||||||
void SetViewport(int x, int y, int Width, int Height);
|
void SetViewport(int x, int y, int Width, int Height);
|
||||||
void SetLineWidth(float LineWidth);
|
void SetLineWidth(float LineWidth);
|
||||||
|
void SetTexture(GLuint Texture);
|
||||||
|
|
||||||
void SetColor(const lcVector4& Color)
|
void SetColor(const lcVector4& Color)
|
||||||
{
|
{
|
||||||
|
@ -163,7 +164,6 @@ public:
|
||||||
void DrawPrimitives(GLenum Mode, GLint First, GLsizei Count);
|
void DrawPrimitives(GLenum Mode, GLint First, GLsizei Count);
|
||||||
void DrawIndexedPrimitives(GLenum Mode, GLsizei Count, GLenum Type, int Offset);
|
void DrawIndexedPrimitives(GLenum Mode, GLsizei Count, GLenum Type, int Offset);
|
||||||
|
|
||||||
void UnbindMesh();
|
|
||||||
void DrawScene(const lcScene& Scene);
|
void DrawScene(const lcScene& Scene);
|
||||||
void DrawInterfaceObjects(const lcArray<const lcObject*>& InterfaceObjects);
|
void DrawInterfaceObjects(const lcArray<const lcObject*>& InterfaceObjects);
|
||||||
|
|
||||||
|
@ -188,9 +188,10 @@ protected:
|
||||||
bool mTexCoordEnabled;
|
bool mTexCoordEnabled;
|
||||||
bool mColorEnabled;
|
bool mColorEnabled;
|
||||||
|
|
||||||
lcTexture* mTexture;
|
GLuint mTexture;
|
||||||
float mLineWidth;
|
float mLineWidth;
|
||||||
int mMatrixMode;
|
int mMatrixMode;
|
||||||
|
bool mTextureEnabled;
|
||||||
|
|
||||||
lcVector4 mColor;
|
lcVector4 mColor;
|
||||||
lcMatrix44 mWorldMatrix;
|
lcMatrix44 mWorldMatrix;
|
||||||
|
|
|
@ -826,6 +826,7 @@ void lcMainWindow::Print(QPrinter* Printer)
|
||||||
free(Buffer);
|
free(Buffer);
|
||||||
Model->SetTemporaryStep(PreviousTime);
|
Model->SetTemporaryStep(PreviousTime);
|
||||||
Context->EndRenderToTexture();
|
Context->EndRenderToTexture();
|
||||||
|
Context->ClearResources();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -997,6 +998,7 @@ void lcMainWindow::Print(QPrinter* Printer)
|
||||||
Model->SetTemporaryStep(PreviousTime);
|
Model->SetTemporaryStep(PreviousTime);
|
||||||
|
|
||||||
Context->EndRenderToTexture();
|
Context->EndRenderToTexture();
|
||||||
|
Context->ClearResources();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1196,16 +1196,13 @@ void lcModel::DrawBackground(lcGLWidget* Widget)
|
||||||
|
|
||||||
Context->DrawPrimitives(GL_TRIANGLE_FAN, 0, 4);
|
Context->DrawPrimitives(GL_TRIANGLE_FAN, 0, 4);
|
||||||
|
|
||||||
Context->ClearVertexBuffer(); // context remove
|
|
||||||
|
|
||||||
#ifndef LC_OPENGLES
|
#ifndef LC_OPENGLES
|
||||||
glShadeModel(GL_FLAT);
|
glShadeModel(GL_FLAT);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else if (mProperties.mBackgroundType == LC_BACKGROUND_IMAGE)
|
else if (mProperties.mBackgroundType == LC_BACKGROUND_IMAGE)
|
||||||
{
|
{
|
||||||
glEnable(GL_TEXTURE_2D);
|
Context->SetTexture(mBackgroundTexture->mTexture);
|
||||||
glBindTexture(GL_TEXTURE_2D, mBackgroundTexture->mTexture);
|
|
||||||
|
|
||||||
float TileWidth = 1.0f, TileHeight = 1.0f;
|
float TileWidth = 1.0f, TileHeight = 1.0f;
|
||||||
|
|
||||||
|
@ -1224,15 +1221,11 @@ void lcModel::DrawBackground(lcGLWidget* Widget)
|
||||||
};
|
};
|
||||||
|
|
||||||
Context->SetColor(1.0f, 1.0f, 1.0f, 1.0f);
|
Context->SetColor(1.0f, 1.0f, 1.0f, 1.0f);
|
||||||
Context->SetMaterial(LC_MATERIAL_UNLIT_TEXTURE_MODULATE);
|
Context->SetMaterial(LC_MATERIAL_UNLIT_TEXTURE_DECAL);
|
||||||
Context->SetVertexBufferPointer(Verts);
|
Context->SetVertexBufferPointer(Verts);
|
||||||
Context->SetVertexFormat(0, 2, 0, 2, 0, false);
|
Context->SetVertexFormat(0, 2, 0, 2, 0, false);
|
||||||
|
|
||||||
Context->DrawPrimitives(GL_TRIANGLE_FAN, 0, 4);
|
Context->DrawPrimitives(GL_TRIANGLE_FAN, 0, 4);
|
||||||
|
|
||||||
Context->ClearVertexBuffer(); // context remove
|
|
||||||
|
|
||||||
glDisable(GL_TEXTURE_2D);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
glEnable(GL_DEPTH_TEST);
|
glEnable(GL_DEPTH_TEST);
|
||||||
|
@ -1280,6 +1273,7 @@ void lcModel::SaveStepImages(const QString& BaseName, bool AddStepSuffix, bool Z
|
||||||
}
|
}
|
||||||
|
|
||||||
Context->EndRenderToTexture();
|
Context->EndRenderToTexture();
|
||||||
|
Context->ClearResources();
|
||||||
|
|
||||||
SetTemporaryStep(CurrentStep);
|
SetTemporaryStep(CurrentStep);
|
||||||
|
|
||||||
|
|
|
@ -354,13 +354,12 @@ void lcPartSelectionListModel::DrawPreview(int InfoIndex)
|
||||||
Context->SetViewMatrix(ViewMatrix);
|
Context->SetViewMatrix(ViewMatrix);
|
||||||
Context->DrawScene(Scene);
|
Context->DrawScene(Scene);
|
||||||
|
|
||||||
Context->UnbindMesh(); // context remove
|
mParts[InfoIndex].second = QPixmap::fromImage(Context->GetRenderToTextureImage(Width, Height)).scaled(mIconSize, mIconSize, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
|
||||||
|
|
||||||
Library->ReleasePieceInfo(Info);
|
Library->ReleasePieceInfo(Info);
|
||||||
|
|
||||||
mParts[InfoIndex].second = QPixmap::fromImage(Context->GetRenderToTextureImage(Width, Height)).scaled(mIconSize, mIconSize, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
|
|
||||||
|
|
||||||
Context->EndRenderToTexture();
|
Context->EndRenderToTexture();
|
||||||
|
Context->ClearResources();
|
||||||
|
|
||||||
#if (QT_VERSION >= QT_VERSION_CHECK(5, 2, 0))
|
#if (QT_VERSION >= QT_VERSION_CHECK(5, 2, 0))
|
||||||
emit dataChanged(index(InfoIndex, 0), index(InfoIndex, 0), QVector<int>() << Qt::DecorationRole);
|
emit dataChanged(index(InfoIndex, 0), index(InfoIndex, 0), QVector<int>() << Qt::DecorationRole);
|
||||||
|
|
|
@ -181,7 +181,7 @@ bool lcTexture::Load(lcMemFile& File, int Flags)
|
||||||
return Load(image, Flags);
|
return Load(image, Flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool lcTexture::Load(Image* images, int NumLevels, int Flags)
|
bool lcTexture::Load(Image* images, int NumLevels, int Flags) // todo: this should be part of lcContext, it can be called from multiple threads
|
||||||
{
|
{
|
||||||
mWidth = images[0].mWidth;
|
mWidth = images[0].mWidth;
|
||||||
mHeight = images[0].mHeight;
|
mHeight = images[0].mHeight;
|
||||||
|
|
|
@ -430,8 +430,6 @@ void lcLight::DrawSpotLight(lcContext* Context) const
|
||||||
|
|
||||||
Context->DrawIndexedPrimitives(GL_LINES, 2 + 40, GL_UNSIGNED_SHORT, (56 + 24) * 2);
|
Context->DrawIndexedPrimitives(GL_LINES, 2 + 40, GL_UNSIGNED_SHORT, (56 + 24) * 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
Context->ClearVertexBuffer(); // context remove
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void lcLight::DrawPointLight(lcContext* Context) const
|
void lcLight::DrawPointLight(lcContext* Context) const
|
||||||
|
|
|
@ -294,7 +294,7 @@ void MinifigWizard::OnDraw()
|
||||||
|
|
||||||
mContext->DrawScene(Scene);
|
mContext->DrawScene(Scene);
|
||||||
|
|
||||||
mContext->UnbindMesh(); // context remove
|
mContext->ClearResources();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MinifigWizard::OnLeftButtonDown()
|
void MinifigWizard::OnLeftButtonDown()
|
||||||
|
|
|
@ -1334,13 +1334,12 @@ void Project::ExportHTML()
|
||||||
Context->SetViewMatrix(ViewMatrix);
|
Context->SetViewMatrix(ViewMatrix);
|
||||||
Context->DrawScene(Scene);
|
Context->DrawScene(Scene);
|
||||||
|
|
||||||
Context->UnbindMesh(); // context remove
|
|
||||||
|
|
||||||
QString FileName = QFileInfo(Dir, QLatin1String(Info->m_strName) + QLatin1String(".png")).absoluteFilePath();
|
QString FileName = QFileInfo(Dir, QLatin1String(Info->m_strName) + QLatin1String(".png")).absoluteFilePath();
|
||||||
if (!Context->SaveRenderToTextureImage(FileName, Width, Height))
|
if (!Context->SaveRenderToTextureImage(FileName, Width, Height))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
Context->EndRenderToTexture();
|
Context->EndRenderToTexture();
|
||||||
|
Context->ClearResources();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -102,7 +102,7 @@ TexFont::~TexFont()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TexFont::Load()
|
bool TexFont::Load(lcContext* Context)
|
||||||
{
|
{
|
||||||
mRefCount++;
|
mRefCount++;
|
||||||
|
|
||||||
|
@ -112,7 +112,7 @@ bool TexFont::Load()
|
||||||
mFontHeight = 16;
|
mFontHeight = 16;
|
||||||
|
|
||||||
glGenTextures(1, &mTexture);
|
glGenTextures(1, &mTexture);
|
||||||
glBindTexture(GL_TEXTURE_2D, mTexture);
|
Context->SetTexture(mTexture);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||||
|
@ -236,8 +236,6 @@ void TexFont::PrintText(lcContext* Context, float Left, float Top, float Z, cons
|
||||||
|
|
||||||
Context->DrawPrimitives(GL_TRIANGLES, 0, 6 * (GLsizei)Length);
|
Context->DrawPrimitives(GL_TRIANGLES, 0, 6 * (GLsizei)Length);
|
||||||
|
|
||||||
Context->ClearVertexBuffer(); // context remove
|
|
||||||
|
|
||||||
delete[] Verts;
|
delete[] Verts;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -12,12 +12,12 @@ public:
|
||||||
return mTexture != 0;
|
return mTexture != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MakeCurrent()
|
GLuint GetTexture() const
|
||||||
{
|
{
|
||||||
glBindTexture(GL_TEXTURE_2D, mTexture);
|
return mTexture;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Load();
|
bool Load(lcContext* Context);
|
||||||
void Release();
|
void Release();
|
||||||
|
|
||||||
void PrintText(lcContext* Context, float Left, float Top, float Z, const char* Text) const;
|
void PrintText(lcContext* Context, float Left, float Top, float Z, const char* Text) const;
|
||||||
|
|
|
@ -586,8 +586,6 @@ void View::OnDraw()
|
||||||
|
|
||||||
mContext->DrawScene(mScene);
|
mContext->DrawScene(mScene);
|
||||||
|
|
||||||
mContext->UnbindMesh(); // context remove
|
|
||||||
|
|
||||||
#ifndef LC_OPENGLES
|
#ifndef LC_OPENGLES
|
||||||
if (Properties.mFogEnabled)
|
if (Properties.mFogEnabled)
|
||||||
glDisable(GL_FOG);
|
glDisable(GL_FOG);
|
||||||
|
@ -619,6 +617,8 @@ void View::OnDraw()
|
||||||
|
|
||||||
DrawViewport();
|
DrawViewport();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mContext->ClearResources();
|
||||||
}
|
}
|
||||||
|
|
||||||
void View::DrawSelectMoveOverlay()
|
void View::DrawSelectMoveOverlay()
|
||||||
|
@ -804,8 +804,6 @@ void View::DrawSelectMoveOverlay()
|
||||||
}
|
}
|
||||||
|
|
||||||
glEnable(GL_DEPTH_TEST);
|
glEnable(GL_DEPTH_TEST);
|
||||||
|
|
||||||
mContext->ClearIndexBuffer(); // context remove
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void View::DrawRotateOverlay()
|
void View::DrawRotateOverlay()
|
||||||
|
@ -1087,9 +1085,7 @@ void View::DrawRotateOverlay()
|
||||||
mContext->SetWorldMatrix(lcMatrix44Identity());
|
mContext->SetWorldMatrix(lcMatrix44Identity());
|
||||||
mContext->SetViewMatrix(lcMatrix44Translation(lcVector3(0.375, 0.375, 0.0)));
|
mContext->SetViewMatrix(lcMatrix44Translation(lcVector3(0.375, 0.375, 0.0)));
|
||||||
mContext->SetProjectionMatrix(lcMatrix44Ortho(0.0f, mWidth, 0.0f, mHeight, -1.0f, 1.0f));
|
mContext->SetProjectionMatrix(lcMatrix44Ortho(0.0f, mWidth, 0.0f, mHeight, -1.0f, 1.0f));
|
||||||
|
mContext->SetTexture(gTexFont.GetTexture());
|
||||||
gTexFont.MakeCurrent();
|
|
||||||
glEnable(GL_TEXTURE_2D);
|
|
||||||
glEnable(GL_BLEND);
|
glEnable(GL_BLEND);
|
||||||
|
|
||||||
char buf[32];
|
char buf[32];
|
||||||
|
@ -1102,7 +1098,6 @@ void View::DrawRotateOverlay()
|
||||||
gTexFont.PrintText(mContext, ScreenPos[0] - (cx / 2), ScreenPos[1] + (cy / 2), 0.0f, buf);
|
gTexFont.PrintText(mContext, ScreenPos[0] - (cx / 2), ScreenPos[1] + (cy / 2), 0.0f, buf);
|
||||||
|
|
||||||
glDisable(GL_BLEND);
|
glDisable(GL_BLEND);
|
||||||
glDisable(GL_TEXTURE_2D);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
glEnable(GL_DEPTH_TEST);
|
glEnable(GL_DEPTH_TEST);
|
||||||
|
@ -1185,8 +1180,6 @@ void View::DrawSelectZoomRegionOverlay()
|
||||||
|
|
||||||
glDisable(GL_BLEND);
|
glDisable(GL_BLEND);
|
||||||
glEnable(GL_DEPTH_TEST);
|
glEnable(GL_DEPTH_TEST);
|
||||||
|
|
||||||
mContext->ClearVertexBuffer(); // context remove
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void View::DrawRotateViewOverlay()
|
void View::DrawRotateViewOverlay()
|
||||||
|
@ -1253,8 +1246,6 @@ void View::DrawRotateViewOverlay()
|
||||||
mContext->DrawIndexedPrimitives(GL_LINES, 96, GL_UNSIGNED_SHORT, 0);
|
mContext->DrawIndexedPrimitives(GL_LINES, 96, GL_UNSIGNED_SHORT, 0);
|
||||||
|
|
||||||
glEnable(GL_DEPTH_TEST);
|
glEnable(GL_DEPTH_TEST);
|
||||||
|
|
||||||
mContext->ClearVertexBuffer(); // context remove
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void View::DrawGrid()
|
void View::DrawGrid()
|
||||||
|
@ -1406,8 +1397,7 @@ void View::DrawGrid()
|
||||||
|
|
||||||
if (Preferences.mDrawGridStuds)
|
if (Preferences.mDrawGridStuds)
|
||||||
{
|
{
|
||||||
glBindTexture(GL_TEXTURE_2D, gGridTexture->mTexture);
|
mContext->SetTexture(gGridTexture->mTexture);
|
||||||
glEnable(GL_TEXTURE_2D);
|
|
||||||
glEnable(GL_BLEND);
|
glEnable(GL_BLEND);
|
||||||
|
|
||||||
mContext->SetMaterial(LC_MATERIAL_UNLIT_TEXTURE_MODULATE);
|
mContext->SetMaterial(LC_MATERIAL_UNLIT_TEXTURE_MODULATE);
|
||||||
|
@ -1416,7 +1406,6 @@ void View::DrawGrid()
|
||||||
mContext->SetVertexFormat(0, 3, 0, 2, 0, false);
|
mContext->SetVertexFormat(0, 3, 0, 2, 0, false);
|
||||||
mContext->DrawPrimitives(GL_TRIANGLE_STRIP, 0, 4);
|
mContext->DrawPrimitives(GL_TRIANGLE_STRIP, 0, 4);
|
||||||
|
|
||||||
glDisable(GL_TEXTURE_2D);
|
|
||||||
glDisable(GL_BLEND);
|
glDisable(GL_BLEND);
|
||||||
|
|
||||||
BufferOffset = 4 * 5 * sizeof(float);
|
BufferOffset = 4 * 5 * sizeof(float);
|
||||||
|
@ -1433,8 +1422,6 @@ void View::DrawGrid()
|
||||||
mContext->SetVertexFormat(BufferOffset, 3, 0, 0, 0, false);
|
mContext->SetVertexFormat(BufferOffset, 3, 0, 0, 0, false);
|
||||||
mContext->DrawPrimitives(GL_LINES, 0, NumVerts);
|
mContext->DrawPrimitives(GL_LINES, 0, NumVerts);
|
||||||
}
|
}
|
||||||
|
|
||||||
mContext->ClearVertexBuffer(); // context remove
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void View::DrawAxes()
|
void View::DrawAxes()
|
||||||
|
@ -1485,8 +1472,7 @@ void View::DrawAxes()
|
||||||
|
|
||||||
mContext->SetMaterial(LC_MATERIAL_UNLIT_TEXTURE_MODULATE);
|
mContext->SetMaterial(LC_MATERIAL_UNLIT_TEXTURE_MODULATE);
|
||||||
mContext->SetViewMatrix(TranslationMatrix);
|
mContext->SetViewMatrix(TranslationMatrix);
|
||||||
gTexFont.MakeCurrent();
|
mContext->SetTexture(gTexFont.GetTexture());
|
||||||
glEnable(GL_TEXTURE_2D);
|
|
||||||
glEnable(GL_BLEND);
|
glEnable(GL_BLEND);
|
||||||
|
|
||||||
float TextBuffer[6 * 5 * 3];
|
float TextBuffer[6 * 5 * 3];
|
||||||
|
@ -1504,9 +1490,6 @@ void View::DrawAxes()
|
||||||
mContext->DrawPrimitives(GL_TRIANGLES, 0, 6 * 3);
|
mContext->DrawPrimitives(GL_TRIANGLES, 0, 6 * 3);
|
||||||
|
|
||||||
glDisable(GL_BLEND);
|
glDisable(GL_BLEND);
|
||||||
glDisable(GL_TEXTURE_2D);
|
|
||||||
|
|
||||||
mContext->ClearVertexBuffer(); // context remove
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void View::DrawViewport()
|
void View::DrawViewport()
|
||||||
|
@ -1529,23 +1512,19 @@ void View::DrawViewport()
|
||||||
mContext->DrawPrimitives(GL_LINE_LOOP, 0, 4);
|
mContext->DrawPrimitives(GL_LINE_LOOP, 0, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
mContext->ClearVertexBuffer(); // context remove
|
|
||||||
|
|
||||||
const char* CameraName = mCamera->GetName();
|
const char* CameraName = mCamera->GetName();
|
||||||
|
|
||||||
if (CameraName[0])
|
if (CameraName[0])
|
||||||
{
|
{
|
||||||
mContext->SetMaterial(LC_MATERIAL_UNLIT_TEXTURE_MODULATE);
|
mContext->SetMaterial(LC_MATERIAL_UNLIT_TEXTURE_MODULATE);
|
||||||
mContext->SetColor(0.0f, 0.0f, 0.0f, 1.0f);
|
mContext->SetColor(0.0f, 0.0f, 0.0f, 1.0f);
|
||||||
|
mContext->SetTexture(gTexFont.GetTexture());
|
||||||
|
|
||||||
glEnable(GL_TEXTURE_2D);
|
|
||||||
gTexFont.MakeCurrent();
|
|
||||||
glEnable(GL_BLEND);
|
glEnable(GL_BLEND);
|
||||||
|
|
||||||
gTexFont.PrintText(mContext, 3.0f, (float)mHeight - 1.0f - 6.0f, 0.0f, CameraName);
|
gTexFont.PrintText(mContext, 3.0f, (float)mHeight - 1.0f - 6.0f, 0.0f, CameraName);
|
||||||
|
|
||||||
glDisable(GL_BLEND);
|
glDisable(GL_BLEND);
|
||||||
glDisable(GL_TEXTURE_2D);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
glDepthMask(GL_TRUE);
|
glDepthMask(GL_TRUE);
|
||||||
|
|
|
@ -90,7 +90,7 @@ lcQGLWidget::lcQGLWidget(QWidget *parent, lcGLWidget *owner, bool view)
|
||||||
widget->MakeCurrent();
|
widget->MakeCurrent();
|
||||||
|
|
||||||
// TODO: Find a better place for the grid texture and font
|
// TODO: Find a better place for the grid texture and font
|
||||||
gTexFont.Load();
|
gTexFont.Load(widget->mContext);
|
||||||
if (gWidgetList.isEmpty())
|
if (gWidgetList.isEmpty())
|
||||||
{
|
{
|
||||||
lcInitializeGLExtensions(context());
|
lcInitializeGLExtensions(context());
|
||||||
|
|
Loading…
Add table
Reference in a new issue