mirror of
https://github.com/leozide/leocad
synced 2025-01-29 20:34:50 +01:00
Moved some drawing code out of the projet.
This commit is contained in:
parent
22d3c57b9b
commit
0a66fbeb82
10 changed files with 425 additions and 399 deletions
|
@ -32,7 +32,6 @@ void lcMainWindow::AddView(View* View)
|
||||||
mViews.Add(View);
|
mViews.Add(View);
|
||||||
|
|
||||||
View->MakeCurrent();
|
View->MakeCurrent();
|
||||||
lcGetActiveProject()->RenderInitialize();
|
|
||||||
|
|
||||||
if (!mActiveView)
|
if (!mActiveView)
|
||||||
{
|
{
|
||||||
|
|
|
@ -6,6 +6,8 @@
|
||||||
#include "image.h"
|
#include "image.h"
|
||||||
#include "system.h"
|
#include "system.h"
|
||||||
|
|
||||||
|
lcTexture* gGridTexture;
|
||||||
|
|
||||||
lcTexture::lcTexture()
|
lcTexture::lcTexture()
|
||||||
{
|
{
|
||||||
mTexture = 0;
|
mTexture = 0;
|
||||||
|
@ -17,6 +19,87 @@ lcTexture::~lcTexture()
|
||||||
Unload();
|
Unload();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void lcTexture::CreateGridTexture()
|
||||||
|
{
|
||||||
|
const int NumLevels = 9;
|
||||||
|
Image GridImages[NumLevels];
|
||||||
|
|
||||||
|
for (int ImageLevel = 0; ImageLevel < NumLevels; ImageLevel++)
|
||||||
|
{
|
||||||
|
Image& GridImage = GridImages[ImageLevel];
|
||||||
|
|
||||||
|
const int GridSize = 256 >> ImageLevel;
|
||||||
|
const float Radius1 = (80 >> ImageLevel) * (80 >> ImageLevel);
|
||||||
|
const float Radius2 = (72 >> ImageLevel) * (72 >> ImageLevel);
|
||||||
|
|
||||||
|
GridImage.Allocate(GridSize, GridSize, LC_PIXEL_FORMAT_A8);
|
||||||
|
lcuint8* BlurBuffer = new lcuint8[GridSize * GridSize];
|
||||||
|
|
||||||
|
for (int y = 0; y < GridSize; y++)
|
||||||
|
{
|
||||||
|
lcuint8* Pixel = GridImage.mData + y * GridSize;
|
||||||
|
memset(Pixel, 0, GridSize);
|
||||||
|
|
||||||
|
const float y2 = (y - GridSize / 2) * (y - GridSize / 2);
|
||||||
|
|
||||||
|
if (Radius1 <= y2)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (Radius2 <= y2)
|
||||||
|
{
|
||||||
|
int x1 = sqrtf(Radius1 - y2);
|
||||||
|
|
||||||
|
for (int x = GridSize / 2 - x1; x < GridSize / 2 + x1; x++)
|
||||||
|
Pixel[x] = 255;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int x1 = sqrtf(Radius1 - y2);
|
||||||
|
int x2 = sqrtf(Radius2 - y2);
|
||||||
|
|
||||||
|
for (int x = GridSize / 2 - x1; x < GridSize / 2 - x2; x++)
|
||||||
|
Pixel[x] = 255;
|
||||||
|
|
||||||
|
for (int x = GridSize / 2 + x2; x < GridSize / 2 + x1; x++)
|
||||||
|
Pixel[x] = 255;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int y = 0; y < GridSize - 1; y++)
|
||||||
|
{
|
||||||
|
for (int x = 0; x < GridSize - 1; x++)
|
||||||
|
{
|
||||||
|
lcuint8 a = GridImage.mData[x + y * GridSize];
|
||||||
|
lcuint8 b = GridImage.mData[x + 1 + y * GridSize];
|
||||||
|
lcuint8 c = GridImage.mData[x + (y + 1) * GridSize];
|
||||||
|
lcuint8 d = GridImage.mData[x + 1 + (y + 1) * GridSize];
|
||||||
|
BlurBuffer[x + y * GridSize] = (a + b + c + d) / 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
int x = GridSize - 1;
|
||||||
|
lcuint8 a = GridImage.mData[x + y * GridSize];
|
||||||
|
lcuint8 c = GridImage.mData[x + (y + 1) * GridSize];
|
||||||
|
BlurBuffer[x + y * GridSize] = (a + c) / 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
int y = GridSize - 1;
|
||||||
|
for (int x = 0; x < GridSize - 1; x++)
|
||||||
|
{
|
||||||
|
lcuint8 a = GridImage.mData[x + y * GridSize];
|
||||||
|
lcuint8 b = GridImage.mData[x + 1 + y * GridSize];
|
||||||
|
BlurBuffer[x + y * GridSize] = (a + b) / 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
int x = GridSize - 1;
|
||||||
|
BlurBuffer[x + y * GridSize] = GridImage.mData[x + y * GridSize];
|
||||||
|
|
||||||
|
memcpy(GridImage.mData, BlurBuffer, GridSize * GridSize);
|
||||||
|
delete[] BlurBuffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
Load(GridImages, NumLevels, LC_TEXTURE_WRAPU | LC_TEXTURE_WRAPV | LC_TEXTURE_MIPMAPS | LC_TEXTURE_ANISOTROPIC);
|
||||||
|
}
|
||||||
|
|
||||||
bool lcTexture::Load()
|
bool lcTexture::Load()
|
||||||
{
|
{
|
||||||
return lcGetPiecesLibrary()->LoadTexture(this);
|
return lcGetPiecesLibrary()->LoadTexture(this);
|
||||||
|
|
|
@ -25,6 +25,8 @@ public:
|
||||||
lcTexture();
|
lcTexture();
|
||||||
~lcTexture();
|
~lcTexture();
|
||||||
|
|
||||||
|
void CreateGridTexture();
|
||||||
|
|
||||||
bool Load(const char* FileName, int Flags = 0);
|
bool Load(const char* FileName, int Flags = 0);
|
||||||
bool Load(lcMemFile& File, int Flags = 0);
|
bool Load(lcMemFile& File, int Flags = 0);
|
||||||
bool Load(Image& image, int Flags);
|
bool Load(Image& image, int Flags);
|
||||||
|
@ -62,4 +64,6 @@ protected:
|
||||||
int mRefCount;
|
int mRefCount;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
extern lcTexture* gGridTexture;
|
||||||
|
|
||||||
#endif // _LC_TEXTURE_H_
|
#endif // _LC_TEXTURE_H_
|
||||||
|
|
|
@ -34,10 +34,7 @@ Project::Project()
|
||||||
mTransformType = LC_TRANSFORM_RELATIVE_TRANSLATION;
|
mTransformType = LC_TRANSFORM_RELATIVE_TRANSLATION;
|
||||||
m_pTerrain = new Terrain();
|
m_pTerrain = new Terrain();
|
||||||
m_pBackground = new lcTexture();
|
m_pBackground = new lcTexture();
|
||||||
mGridTexture = new lcTexture();
|
|
||||||
memset(&mSearchOptions, 0, sizeof(mSearchOptions));
|
memset(&mSearchOptions, 0, sizeof(mSearchOptions));
|
||||||
|
|
||||||
m_pScreenFont = new TexFont();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Project::~Project()
|
Project::~Project()
|
||||||
|
@ -46,8 +43,6 @@ Project::~Project()
|
||||||
|
|
||||||
delete m_pTerrain;
|
delete m_pTerrain;
|
||||||
delete m_pBackground;
|
delete m_pBackground;
|
||||||
delete mGridTexture;
|
|
||||||
delete m_pScreenFont;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Project::UpdateInterface()
|
void Project::UpdateInterface()
|
||||||
|
@ -65,17 +60,8 @@ void Project::UpdateInterface()
|
||||||
gMainWindow->UpdateSnap();
|
gMainWindow->UpdateSnap();
|
||||||
gMainWindow->UpdateCameraMenu();
|
gMainWindow->UpdateCameraMenu();
|
||||||
gMainWindow->UpdatePerspective();
|
gMainWindow->UpdatePerspective();
|
||||||
|
|
||||||
UpdateSelection();
|
|
||||||
gMainWindow->UpdateCurrentStep();
|
gMainWindow->UpdateCurrentStep();
|
||||||
|
|
||||||
const lcArray<View*> Views = gMainWindow->GetViews();
|
|
||||||
for (int i = 0; i < Views.GetSize(); i++)
|
|
||||||
{
|
|
||||||
Views[i]->MakeCurrent();
|
|
||||||
RenderInitialize();
|
|
||||||
}
|
|
||||||
|
|
||||||
UpdateSelection();
|
UpdateSelection();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1303,8 +1289,6 @@ void Project::Render(View* View, bool ToMemory)
|
||||||
if (!ToMemory)
|
if (!ToMemory)
|
||||||
{
|
{
|
||||||
RenderSceneObjects(View);
|
RenderSceneObjects(View);
|
||||||
|
|
||||||
RenderViewports(View);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1601,375 +1585,73 @@ void Project::RenderSceneObjects(View* view)
|
||||||
mLights[LightIdx]->Render(view);
|
mLights[LightIdx]->Render(view);
|
||||||
|
|
||||||
Context->SetLineWidth(Preferences.mLineWidth); // context remove
|
Context->SetLineWidth(Preferences.mLineWidth); // context remove
|
||||||
|
|
||||||
if (Preferences.mDrawGridStuds || Preferences.mDrawGridLines)
|
|
||||||
{
|
|
||||||
Context->SetWorldViewMatrix(ViewMatrix);
|
|
||||||
|
|
||||||
const int Spacing = lcMax(Preferences.mGridLineSpacing, 1);
|
|
||||||
int MinX = 0, MaxX = 0, MinY = 0, MaxY = 0;
|
|
||||||
|
|
||||||
if (!mPieces.IsEmpty() || view->mTrackTool == LC_TRACKTOOL_INSERT)
|
|
||||||
{
|
|
||||||
float bs[6] = { 10000, 10000, 10000, -10000, -10000, -10000 };
|
|
||||||
|
|
||||||
for (int PieceIdx = 0; PieceIdx < mPieces.GetSize(); PieceIdx++)
|
|
||||||
{
|
|
||||||
lcPiece* Piece = mPieces[PieceIdx];
|
|
||||||
|
|
||||||
if (Piece->IsVisible(mCurrentStep))
|
|
||||||
Piece->CompareBoundingBox(bs);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (view->mTrackTool == LC_TRACKTOOL_INSERT)
|
|
||||||
{
|
|
||||||
lcVector3 Position;
|
|
||||||
lcVector4 Rotation;
|
|
||||||
GetPieceInsertPosition(view, Position, Rotation);
|
|
||||||
|
|
||||||
lcVector3 Points[8] =
|
|
||||||
{
|
|
||||||
lcVector3(m_pCurPiece->m_fDimensions[0], m_pCurPiece->m_fDimensions[1], m_pCurPiece->m_fDimensions[5]),
|
|
||||||
lcVector3(m_pCurPiece->m_fDimensions[3], m_pCurPiece->m_fDimensions[1], m_pCurPiece->m_fDimensions[5]),
|
|
||||||
lcVector3(m_pCurPiece->m_fDimensions[0], m_pCurPiece->m_fDimensions[1], m_pCurPiece->m_fDimensions[2]),
|
|
||||||
lcVector3(m_pCurPiece->m_fDimensions[3], m_pCurPiece->m_fDimensions[4], m_pCurPiece->m_fDimensions[5]),
|
|
||||||
lcVector3(m_pCurPiece->m_fDimensions[3], m_pCurPiece->m_fDimensions[4], m_pCurPiece->m_fDimensions[2]),
|
|
||||||
lcVector3(m_pCurPiece->m_fDimensions[0], m_pCurPiece->m_fDimensions[4], m_pCurPiece->m_fDimensions[2]),
|
|
||||||
lcVector3(m_pCurPiece->m_fDimensions[0], m_pCurPiece->m_fDimensions[4], m_pCurPiece->m_fDimensions[5]),
|
|
||||||
lcVector3(m_pCurPiece->m_fDimensions[3], m_pCurPiece->m_fDimensions[1], m_pCurPiece->m_fDimensions[2])
|
|
||||||
};
|
|
||||||
|
|
||||||
lcMatrix44 ModelWorld = lcMatrix44FromAxisAngle(lcVector3(Rotation[0], Rotation[1], Rotation[2]), Rotation[3] * LC_DTOR);
|
|
||||||
ModelWorld.SetTranslation(Position);
|
|
||||||
|
|
||||||
for (int i = 0; i < 8; i++)
|
|
||||||
{
|
|
||||||
lcVector3 Point = lcMul31(Points[i], ModelWorld);
|
|
||||||
|
|
||||||
if (Point[0] < bs[0]) bs[0] = Point[0];
|
|
||||||
if (Point[1] < bs[1]) bs[1] = Point[1];
|
|
||||||
if (Point[2] < bs[2]) bs[2] = Point[2];
|
|
||||||
if (Point[0] > bs[3]) bs[3] = Point[0];
|
|
||||||
if (Point[1] > bs[4]) bs[4] = Point[1];
|
|
||||||
if (Point[2] > bs[5]) bs[5] = Point[2];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
MinX = (int)(floorf(bs[0] / (0.8f * Spacing))) - 1;
|
|
||||||
MinY = (int)(floorf(bs[1] / (0.8f * Spacing))) - 1;
|
|
||||||
MaxX = (int)(ceilf(bs[3] / (0.8f * Spacing))) + 1;
|
|
||||||
MaxY = (int)(ceilf(bs[4] / (0.8f * Spacing))) + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
MinX = lcMin(MinX, -2);
|
|
||||||
MinY = lcMin(MinY, -2);
|
|
||||||
MaxX = lcMax(MaxX, 2);
|
|
||||||
MaxY = lcMax(MaxY, 2);
|
|
||||||
|
|
||||||
if (Preferences.mDrawGridStuds)
|
|
||||||
{
|
|
||||||
float Left = MinX * 0.8f * Spacing;
|
|
||||||
float Right = MaxX * 0.8f * Spacing;
|
|
||||||
float Top = MinY * 0.8f * Spacing;
|
|
||||||
float Bottom = MaxY * 0.8f * Spacing;
|
|
||||||
float Z = 0;
|
|
||||||
float U = (MaxX - MinX) * Spacing;
|
|
||||||
float V = (MaxY - MinY) * Spacing;
|
|
||||||
|
|
||||||
float Verts[4 * 5];
|
|
||||||
float* CurVert = Verts;
|
|
||||||
|
|
||||||
*CurVert++ = Left;
|
|
||||||
*CurVert++ = Top;
|
|
||||||
*CurVert++ = Z;
|
|
||||||
*CurVert++ = 0.0f;
|
|
||||||
*CurVert++ = V;
|
|
||||||
|
|
||||||
*CurVert++ = Left;
|
|
||||||
*CurVert++ = Bottom;
|
|
||||||
*CurVert++ = Z;
|
|
||||||
*CurVert++ = 0.0f;
|
|
||||||
*CurVert++ = 0.0f;
|
|
||||||
|
|
||||||
*CurVert++ = Right;
|
|
||||||
*CurVert++ = Bottom;
|
|
||||||
*CurVert++ = Z;
|
|
||||||
*CurVert++ = U;
|
|
||||||
*CurVert++ = 0.0f;
|
|
||||||
|
|
||||||
*CurVert++ = Right;
|
|
||||||
*CurVert++ = Top;
|
|
||||||
*CurVert++ = Z;
|
|
||||||
*CurVert++ = U;
|
|
||||||
*CurVert++ = V;
|
|
||||||
|
|
||||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
|
||||||
glBindTexture(GL_TEXTURE_2D, mGridTexture->mTexture);
|
|
||||||
glEnable(GL_TEXTURE_2D);
|
|
||||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
||||||
glEnable(GL_BLEND);
|
|
||||||
|
|
||||||
glColor4fv(lcVector4FromColor(Preferences.mGridStudColor));
|
|
||||||
|
|
||||||
glVertexPointer(3, GL_FLOAT, 5 * sizeof(float), Verts);
|
|
||||||
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
|
||||||
glTexCoordPointer(2, GL_FLOAT, 5 * sizeof(float), Verts + 3);
|
|
||||||
|
|
||||||
glDrawArrays(GL_QUADS, 0, 4);
|
|
||||||
|
|
||||||
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
|
|
||||||
|
|
||||||
glDisable(GL_TEXTURE_2D);
|
|
||||||
glDisable(GL_BLEND);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Preferences.mDrawGridLines)
|
|
||||||
{
|
|
||||||
glColor4fv(lcVector4FromColor(Preferences.mGridLineColor));
|
|
||||||
|
|
||||||
int NumVerts = 2 * (MaxX - MinX + MaxY - MinY + 2);
|
|
||||||
float* Verts = (float*)malloc(NumVerts * sizeof(float[3]));
|
|
||||||
float* Vert = Verts;
|
|
||||||
float LineSpacing = Spacing * 0.8f;
|
|
||||||
|
|
||||||
for (int Step = MinX; Step < MaxX + 1; Step++)
|
|
||||||
{
|
|
||||||
*Vert++ = Step * LineSpacing;
|
|
||||||
*Vert++ = MinY * LineSpacing;
|
|
||||||
*Vert++ = 0.0f;
|
|
||||||
*Vert++ = Step * LineSpacing;
|
|
||||||
*Vert++ = MaxY * LineSpacing;
|
|
||||||
*Vert++ = 0.0f;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int Step = MinY; Step < MaxY + 1; Step++)
|
|
||||||
{
|
|
||||||
*Vert++ = MinX * LineSpacing;
|
|
||||||
*Vert++ = Step * LineSpacing;
|
|
||||||
*Vert++ = 0.0f;
|
|
||||||
*Vert++ = MaxX * LineSpacing;
|
|
||||||
*Vert++ = Step * LineSpacing;
|
|
||||||
*Vert++ = 0.0f;
|
|
||||||
}
|
|
||||||
|
|
||||||
glVertexPointer(3, GL_FLOAT, 0, Verts);
|
|
||||||
glDrawArrays(GL_LINES, 0, NumVerts);
|
|
||||||
free(Verts);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Preferences.mDrawAxes)
|
|
||||||
{
|
|
||||||
// glClear(GL_DEPTH_BUFFER_BIT);
|
|
||||||
|
|
||||||
lcMatrix44 Mats[3];
|
|
||||||
Mats[0] = view->mCamera->mWorldView;
|
|
||||||
Mats[0].SetTranslation(lcVector3(0, 0, 0));
|
|
||||||
Mats[1] = lcMul(lcMatrix44(lcVector4(0, 1, 0, 0), lcVector4(1, 0, 0, 0), lcVector4(0, 0, 1, 0), lcVector4(0, 0, 0, 1)), Mats[0]);
|
|
||||||
Mats[2] = lcMul(lcMatrix44(lcVector4(0, 0, 1, 0), lcVector4(0, 1, 0, 0), lcVector4(1, 0, 0, 0), lcVector4(0, 0, 0, 1)), Mats[0]);
|
|
||||||
|
|
||||||
lcVector3 pts[3] =
|
|
||||||
{
|
|
||||||
lcMul30(lcVector3(20, 0, 0), Mats[0]),
|
|
||||||
lcMul30(lcVector3(0, 20, 0), Mats[0]),
|
|
||||||
lcMul30(lcVector3(0, 0, 20), Mats[0]),
|
|
||||||
};
|
|
||||||
|
|
||||||
Context->SetProjectionMatrix(lcMatrix44Ortho(0, view->mWidth, 0, view->mHeight, -50, 50));
|
|
||||||
Context->SetWorldViewMatrix(lcMatrix44Translation(lcVector3(25.375f, 25.375f, 0.0f)));
|
|
||||||
|
|
||||||
// Draw the arrows.
|
|
||||||
lcVector3 Verts[11];
|
|
||||||
Verts[0] = lcVector3(0.0f, 0.0f, 0.0f);
|
|
||||||
|
|
||||||
glVertexPointer(3, GL_FLOAT, 0, Verts);
|
|
||||||
|
|
||||||
for (int i = 0; i < 3; i++)
|
|
||||||
{
|
|
||||||
switch (i)
|
|
||||||
{
|
|
||||||
case 0:
|
|
||||||
glColor4f(0.8f, 0.0f, 0.0f, 1.0f);
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
glColor4f(0.0f, 0.8f, 0.0f, 1.0f);
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
glColor4f(0.0f, 0.0f, 0.8f, 1.0f);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
Verts[1] = pts[i];
|
|
||||||
|
|
||||||
for (int j = 0; j < 9; j++)
|
|
||||||
Verts[j+2] = lcMul30(lcVector3(12.0f, cosf(LC_2PI * j / 8) * 3.0f, sinf(LC_2PI * j / 8) * 3.0f), Mats[i]);
|
|
||||||
|
|
||||||
glDrawArrays(GL_LINES, 0, 2);
|
|
||||||
glDrawArrays(GL_TRIANGLE_FAN, 1, 10);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Draw the text.
|
|
||||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
|
||||||
m_pScreenFont->MakeCurrent();
|
|
||||||
glEnable(GL_TEXTURE_2D);
|
|
||||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
||||||
glEnable(GL_BLEND);
|
|
||||||
|
|
||||||
glColor4f(0.0f, 0.0f, 0.0f, 1.0f);
|
|
||||||
m_pScreenFont->PrintText(pts[0][0], pts[0][1], 40.0f, "X");
|
|
||||||
m_pScreenFont->PrintText(pts[1][0], pts[1][1], 40.0f, "Y");
|
|
||||||
m_pScreenFont->PrintText(pts[2][0], pts[2][1], 40.0f, "Z");
|
|
||||||
|
|
||||||
glDisable(GL_BLEND);
|
|
||||||
glDisable(GL_TEXTURE_2D);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Project::RenderViewports(View* view)
|
|
||||||
{
|
|
||||||
lcContext* Context = view->mContext;
|
|
||||||
|
|
||||||
Context->SetProjectionMatrix(lcMatrix44Ortho(0.0f, view->mWidth, 0.0f, view->mHeight, -1.0f, 1.0f));
|
|
||||||
Context->SetWorldViewMatrix(lcMatrix44Translation(lcVector3(0.375f, 0.375f, 0.0f)));
|
|
||||||
|
|
||||||
glDepthMask(GL_FALSE);
|
|
||||||
glDisable(GL_DEPTH_TEST);
|
|
||||||
glDisable(GL_LIGHTING);
|
|
||||||
|
|
||||||
if (gMainWindow->GetActiveView() == view)
|
|
||||||
{
|
|
||||||
glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
|
|
||||||
float Verts[8] = { 0.0f, 0.0f, view->mWidth - 1, 0.0f, view->mWidth - 1, view->mHeight - 1, 0.0f, view->mHeight - 1 };
|
|
||||||
|
|
||||||
glVertexPointer(2, GL_FLOAT, 0, Verts);
|
|
||||||
glDrawArrays(GL_LINE_LOOP, 0, 4);
|
|
||||||
}
|
|
||||||
|
|
||||||
const char* CameraName = view->mCamera->GetName();
|
|
||||||
|
|
||||||
if (CameraName[0])
|
|
||||||
{
|
|
||||||
glColor4f(0.0f, 0.0f, 0.0f, 1.0f);
|
|
||||||
glEnable(GL_TEXTURE_2D);
|
|
||||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
|
||||||
m_pScreenFont->MakeCurrent();
|
|
||||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
||||||
glEnable(GL_BLEND);
|
|
||||||
|
|
||||||
m_pScreenFont->PrintText(3.0f, (float)view->mHeight - 1.0f - 6.0f, 0.0f, CameraName);
|
|
||||||
|
|
||||||
glDisable(GL_BLEND);
|
|
||||||
glDisable(GL_TEXTURE_2D);
|
|
||||||
}
|
|
||||||
|
|
||||||
glDepthMask(GL_TRUE);
|
|
||||||
glEnable(GL_DEPTH_TEST);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Initialize OpenGL
|
|
||||||
void Project::RenderInitialize()
|
void Project::RenderInitialize()
|
||||||
{
|
{
|
||||||
glEnable(GL_POLYGON_OFFSET_FILL);
|
|
||||||
glPolygonOffset(0.5f, 0.1f);
|
|
||||||
|
|
||||||
glEnable(GL_DEPTH_TEST);
|
|
||||||
glDepthFunc(GL_LEQUAL);
|
|
||||||
glDepthMask(GL_TRUE);
|
|
||||||
|
|
||||||
// Load font
|
|
||||||
if (!m_pScreenFont->IsLoaded())
|
|
||||||
m_pScreenFont->Initialize();
|
|
||||||
|
|
||||||
// if (m_nScene & LC_SCENE_FLOOR)
|
|
||||||
// m_pTerrain->LoadTexture();
|
|
||||||
|
|
||||||
if (mProperties.mBackgroundType == LC_BACKGROUND_IMAGE)
|
if (mProperties.mBackgroundType == LC_BACKGROUND_IMAGE)
|
||||||
if (!m_pBackground->Load(mProperties.mBackgroundImage.Buffer(), LC_TEXTURE_WRAPU | LC_TEXTURE_WRAPV))
|
if (!m_pBackground->Load(mProperties.mBackgroundImage.Buffer(), LC_TEXTURE_WRAPU | LC_TEXTURE_WRAPV))
|
||||||
{
|
{
|
||||||
mProperties.mBackgroundType = LC_BACKGROUND_SOLID;
|
mProperties.mBackgroundType = LC_BACKGROUND_SOLID;
|
||||||
// AfxMessageBox ("Could not load background");
|
// AfxMessageBox ("Could not load background");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!mGridTexture->mTexture)
|
bool Project::GetPiecesBoundingBox(View* view, float BoundingBox[6])
|
||||||
|
{
|
||||||
|
if (mPieces.IsEmpty() && view->mTrackTool != LC_TRACKTOOL_INSERT)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
BoundingBox[0] = FLT_MAX;
|
||||||
|
BoundingBox[1] = FLT_MAX;
|
||||||
|
BoundingBox[2] = FLT_MAX;
|
||||||
|
BoundingBox[3] = -FLT_MAX;
|
||||||
|
BoundingBox[4] = -FLT_MAX;
|
||||||
|
BoundingBox[5] = -FLT_MAX;
|
||||||
|
|
||||||
|
for (int PieceIdx = 0; PieceIdx < mPieces.GetSize(); PieceIdx++)
|
||||||
{
|
{
|
||||||
const int NumLevels = 9;
|
lcPiece* Piece = mPieces[PieceIdx];
|
||||||
Image GridImages[NumLevels];
|
|
||||||
|
|
||||||
for (int ImageLevel = 0; ImageLevel < NumLevels; ImageLevel++)
|
if (Piece->IsVisible(mCurrentStep))
|
||||||
{
|
Piece->CompareBoundingBox(BoundingBox);
|
||||||
Image& GridImage = GridImages[ImageLevel];
|
|
||||||
|
|
||||||
const int GridSize = 256 >> ImageLevel;
|
|
||||||
const float Radius1 = (80 >> ImageLevel) * (80 >> ImageLevel);
|
|
||||||
const float Radius2 = (72 >> ImageLevel) * (72 >> ImageLevel);
|
|
||||||
|
|
||||||
GridImage.Allocate(GridSize, GridSize, LC_PIXEL_FORMAT_A8);
|
|
||||||
lcuint8* BlurBuffer = new lcuint8[GridSize * GridSize];
|
|
||||||
|
|
||||||
for (int y = 0; y < GridSize; y++)
|
|
||||||
{
|
|
||||||
lcuint8* Pixel = GridImage.mData + y * GridSize;
|
|
||||||
memset(Pixel, 0, GridSize);
|
|
||||||
|
|
||||||
const float y2 = (y - GridSize / 2) * (y - GridSize / 2);
|
|
||||||
|
|
||||||
if (Radius1 <= y2)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (Radius2 <= y2)
|
|
||||||
{
|
|
||||||
int x1 = sqrtf(Radius1 - y2);
|
|
||||||
|
|
||||||
for (int x = GridSize / 2 - x1; x < GridSize / 2 + x1; x++)
|
|
||||||
Pixel[x] = 255;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
int x1 = sqrtf(Radius1 - y2);
|
|
||||||
int x2 = sqrtf(Radius2 - y2);
|
|
||||||
|
|
||||||
for (int x = GridSize / 2 - x1; x < GridSize / 2 - x2; x++)
|
|
||||||
Pixel[x] = 255;
|
|
||||||
|
|
||||||
for (int x = GridSize / 2 + x2; x < GridSize / 2 + x1; x++)
|
|
||||||
Pixel[x] = 255;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int y = 0; y < GridSize - 1; y++)
|
|
||||||
{
|
|
||||||
for (int x = 0; x < GridSize - 1; x++)
|
|
||||||
{
|
|
||||||
lcuint8 a = GridImage.mData[x + y * GridSize];
|
|
||||||
lcuint8 b = GridImage.mData[x + 1 + y * GridSize];
|
|
||||||
lcuint8 c = GridImage.mData[x + (y + 1) * GridSize];
|
|
||||||
lcuint8 d = GridImage.mData[x + 1 + (y + 1) * GridSize];
|
|
||||||
BlurBuffer[x + y * GridSize] = (a + b + c + d) / 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
int x = GridSize - 1;
|
|
||||||
lcuint8 a = GridImage.mData[x + y * GridSize];
|
|
||||||
lcuint8 c = GridImage.mData[x + (y + 1) * GridSize];
|
|
||||||
BlurBuffer[x + y * GridSize] = (a + c) / 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
int y = GridSize - 1;
|
|
||||||
for (int x = 0; x < GridSize - 1; x++)
|
|
||||||
{
|
|
||||||
lcuint8 a = GridImage.mData[x + y * GridSize];
|
|
||||||
lcuint8 b = GridImage.mData[x + 1 + y * GridSize];
|
|
||||||
BlurBuffer[x + y * GridSize] = (a + b) / 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
int x = GridSize - 1;
|
|
||||||
BlurBuffer[x + y * GridSize] = GridImage.mData[x + y * GridSize];
|
|
||||||
|
|
||||||
memcpy(GridImage.mData, BlurBuffer, GridSize * GridSize);
|
|
||||||
delete[] BlurBuffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
mGridTexture->Load(GridImages, NumLevels, LC_TEXTURE_WRAPU | LC_TEXTURE_WRAPV | LC_TEXTURE_MIPMAPS | LC_TEXTURE_ANISOTROPIC);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (view->mTrackTool == LC_TRACKTOOL_INSERT)
|
||||||
|
{
|
||||||
|
lcVector3 Position;
|
||||||
|
lcVector4 Rotation;
|
||||||
|
GetPieceInsertPosition(view, Position, Rotation);
|
||||||
|
|
||||||
|
lcVector3 Points[8] =
|
||||||
|
{
|
||||||
|
lcVector3(m_pCurPiece->m_fDimensions[0], m_pCurPiece->m_fDimensions[1], m_pCurPiece->m_fDimensions[5]),
|
||||||
|
lcVector3(m_pCurPiece->m_fDimensions[3], m_pCurPiece->m_fDimensions[1], m_pCurPiece->m_fDimensions[5]),
|
||||||
|
lcVector3(m_pCurPiece->m_fDimensions[0], m_pCurPiece->m_fDimensions[1], m_pCurPiece->m_fDimensions[2]),
|
||||||
|
lcVector3(m_pCurPiece->m_fDimensions[3], m_pCurPiece->m_fDimensions[4], m_pCurPiece->m_fDimensions[5]),
|
||||||
|
lcVector3(m_pCurPiece->m_fDimensions[3], m_pCurPiece->m_fDimensions[4], m_pCurPiece->m_fDimensions[2]),
|
||||||
|
lcVector3(m_pCurPiece->m_fDimensions[0], m_pCurPiece->m_fDimensions[4], m_pCurPiece->m_fDimensions[2]),
|
||||||
|
lcVector3(m_pCurPiece->m_fDimensions[0], m_pCurPiece->m_fDimensions[4], m_pCurPiece->m_fDimensions[5]),
|
||||||
|
lcVector3(m_pCurPiece->m_fDimensions[3], m_pCurPiece->m_fDimensions[1], m_pCurPiece->m_fDimensions[2])
|
||||||
|
};
|
||||||
|
|
||||||
|
lcMatrix44 ModelWorld = lcMatrix44FromAxisAngle(lcVector3(Rotation[0], Rotation[1], Rotation[2]), Rotation[3] * LC_DTOR);
|
||||||
|
ModelWorld.SetTranslation(Position);
|
||||||
|
|
||||||
|
for (int i = 0; i < 8; i++)
|
||||||
|
{
|
||||||
|
lcVector3 Point = lcMul31(Points[i], ModelWorld);
|
||||||
|
|
||||||
|
if (Point[0] < BoundingBox[0]) BoundingBox[0] = Point[0];
|
||||||
|
if (Point[1] < BoundingBox[1]) BoundingBox[1] = Point[1];
|
||||||
|
if (Point[2] < BoundingBox[2]) BoundingBox[2] = Point[2];
|
||||||
|
if (Point[0] > BoundingBox[3]) BoundingBox[3] = Point[0];
|
||||||
|
if (Point[1] > BoundingBox[4]) BoundingBox[4] = Point[1];
|
||||||
|
if (Point[2] > BoundingBox[5]) BoundingBox[5] = Point[2];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -2247,8 +1929,6 @@ void Project::CreateImages(Image* images, int width, int height, lcStep from, lc
|
||||||
if (!hilite)
|
if (!hilite)
|
||||||
ClearSelection(false);
|
ClearSelection(false);
|
||||||
|
|
||||||
RenderInitialize();
|
|
||||||
|
|
||||||
for (lcStep i = from; i <= to; i++)
|
for (lcStep i = from; i <= to; i++)
|
||||||
{
|
{
|
||||||
mCurrentStep = i;
|
mCurrentStep = i;
|
||||||
|
@ -4881,16 +4561,8 @@ void Project::HandleCommand(LC_COMMANDS id)
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case LC_VIEW_PREFERENCES:
|
case LC_VIEW_PREFERENCES:
|
||||||
{
|
|
||||||
g_App->ShowPreferencesDialog();
|
g_App->ShowPreferencesDialog();
|
||||||
|
break;
|
||||||
const lcArray<View*> Views = gMainWindow->GetViews();
|
|
||||||
for (int i = 0; i < Views.GetSize (); i++)
|
|
||||||
{
|
|
||||||
Views[i]->MakeCurrent();
|
|
||||||
RenderInitialize(); // TODO: get rid of RenderInitialize(), most of it can be done once per frame
|
|
||||||
}
|
|
||||||
} break;
|
|
||||||
|
|
||||||
case LC_VIEW_ZOOM_IN:
|
case LC_VIEW_ZOOM_IN:
|
||||||
{
|
{
|
||||||
|
@ -6707,7 +6379,7 @@ void Project::UpdateRollTool(lcCamera* Camera, float Mouse)
|
||||||
|
|
||||||
void Project::ZoomRegionToolClicked(lcCamera* Camera, const lcVector3* Points, float RatioX, float RatioY)
|
void Project::ZoomRegionToolClicked(lcCamera* Camera, const lcVector3* Points, float RatioX, float RatioY)
|
||||||
{
|
{
|
||||||
Camera->ZoomRegion(Points, mCurrentStep, gMainWindow->GetAddKeys(), RatioX, RatioY);
|
Camera->ZoomRegion(Points, RatioX, RatioY, mCurrentStep, gMainWindow->GetAddKeys());
|
||||||
|
|
||||||
gMainWindow->UpdateFocusObject(GetFocusObject());
|
gMainWindow->UpdateFocusObject(GetFocusObject());
|
||||||
gMainWindow->UpdateAllViews();
|
gMainWindow->UpdateAllViews();
|
||||||
|
|
|
@ -57,7 +57,6 @@ class Terrain;
|
||||||
class PieceInfo;
|
class PieceInfo;
|
||||||
class View;
|
class View;
|
||||||
class Image;
|
class Image;
|
||||||
class TexFont;
|
|
||||||
|
|
||||||
#include "lc_file.h"
|
#include "lc_file.h"
|
||||||
|
|
||||||
|
@ -174,6 +173,7 @@ public:
|
||||||
void LoadDefaults(bool cameras);
|
void LoadDefaults(bool cameras);
|
||||||
void RenderInitialize();
|
void RenderInitialize();
|
||||||
|
|
||||||
|
bool GetPiecesBoundingBox(View* view, float BoundingBox[6]);
|
||||||
void GetPiecesUsed(lcArray<lcPiecesUsedEntry>& PiecesUsed) const;
|
void GetPiecesUsed(lcArray<lcPiecesUsedEntry>& PiecesUsed) const;
|
||||||
void CreateImages(Image* images, int width, int height, lcStep from, lcStep to, bool hilite);
|
void CreateImages(Image* images, int width, int height, lcStep from, lcStep to, bool hilite);
|
||||||
void Render(View* view, bool bToMemory);
|
void Render(View* view, bool bToMemory);
|
||||||
|
@ -194,8 +194,6 @@ public:
|
||||||
|
|
||||||
void GetPieceInsertPosition(View* view, lcVector3& Position, lcVector4& Orientation);
|
void GetPieceInsertPosition(View* view, lcVector3& Position, lcVector4& Orientation);
|
||||||
|
|
||||||
TexFont* m_pScreenFont;
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void CheckPoint(const char* Description);
|
void CheckPoint(const char* Description);
|
||||||
|
|
||||||
|
@ -223,7 +221,6 @@ protected:
|
||||||
void RenderBackground(View* view);
|
void RenderBackground(View* view);
|
||||||
void RenderScenePieces(View* view, bool DrawInterface);
|
void RenderScenePieces(View* view, bool DrawInterface);
|
||||||
void RenderSceneObjects(View* view);
|
void RenderSceneObjects(View* view);
|
||||||
void RenderViewports(View* view);
|
|
||||||
|
|
||||||
void CreateHTMLPieceList(FILE* f, lcStep Step, bool bImages, const char* ext);
|
void CreateHTMLPieceList(FILE* f, lcStep Step, bool bImages, const char* ext);
|
||||||
void Export3DStudio();
|
void Export3DStudio();
|
||||||
|
@ -248,7 +245,6 @@ protected:
|
||||||
char m_strHeader[256];
|
char m_strHeader[256];
|
||||||
|
|
||||||
lcTexture* m_pBackground;
|
lcTexture* m_pBackground;
|
||||||
lcTexture* mGridTexture;
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool DoSave(const char* FileName);
|
bool DoSave(const char* FileName);
|
||||||
|
|
|
@ -88,24 +88,29 @@ static const unsigned char GlyphData[] =
|
||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
|
|
||||||
|
TexFont gTexFont;
|
||||||
|
|
||||||
TexFont::TexFont()
|
TexFont::TexFont()
|
||||||
{
|
{
|
||||||
|
mRefCount = 0;
|
||||||
mTexture = 0;
|
mTexture = 0;
|
||||||
memset(&mGlyphs, 0, sizeof(mGlyphs));
|
memset(&mGlyphs, 0, sizeof(mGlyphs));
|
||||||
}
|
}
|
||||||
|
|
||||||
TexFont::~TexFont()
|
TexFont::~TexFont()
|
||||||
{
|
{
|
||||||
glDeleteTextures(1, &mTexture);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TexFont::Initialize()
|
bool TexFont::Load()
|
||||||
{
|
{
|
||||||
|
mRefCount++;
|
||||||
|
|
||||||
|
if (mRefCount != 1)
|
||||||
|
return true;
|
||||||
|
|
||||||
mFontHeight = 16;
|
mFontHeight = 16;
|
||||||
|
|
||||||
if (mTexture == 0)
|
glGenTextures(1, &mTexture);
|
||||||
glGenTextures(1, &mTexture);
|
|
||||||
|
|
||||||
glBindTexture(GL_TEXTURE_2D, mTexture);
|
glBindTexture(GL_TEXTURE_2D, mTexture);
|
||||||
glDisable(GL_TEXTURE_GEN_S);
|
glDisable(GL_TEXTURE_GEN_S);
|
||||||
glDisable(GL_TEXTURE_GEN_T);
|
glDisable(GL_TEXTURE_GEN_T);
|
||||||
|
@ -148,6 +153,16 @@ bool TexFont::Initialize()
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TexFont::Release()
|
||||||
|
{
|
||||||
|
mRefCount--;
|
||||||
|
if (mRefCount == 0)
|
||||||
|
{
|
||||||
|
glDeleteTextures(1, &mTexture);
|
||||||
|
mTexture = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void TexFont::GetStringDimensions(int* cx, int* cy, const char* Text) const
|
void TexFont::GetStringDimensions(int* cx, int* cy, const char* Text) const
|
||||||
{
|
{
|
||||||
*cx = 0;
|
*cx = 0;
|
||||||
|
|
|
@ -19,7 +19,9 @@ public:
|
||||||
glBindTexture(GL_TEXTURE_2D, mTexture);
|
glBindTexture(GL_TEXTURE_2D, mTexture);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Initialize();
|
bool Load();
|
||||||
|
void Release();
|
||||||
|
|
||||||
void PrintText(float Left, float Top, float Z, const char* Text) const;
|
void PrintText(float Left, float Top, float Z, const char* Text) const;
|
||||||
void GetStringDimensions(int* cx, int* cy, const char* Text) const;
|
void GetStringDimensions(int* cx, int* cy, const char* Text) const;
|
||||||
|
|
||||||
|
@ -34,6 +36,9 @@ protected:
|
||||||
int mTextureWidth;
|
int mTextureWidth;
|
||||||
int mTextureHeight;
|
int mTextureHeight;
|
||||||
int mFontHeight;
|
int mFontHeight;
|
||||||
|
int mRefCount;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
extern TexFont gTexFont;
|
||||||
|
|
||||||
#endif // _TEXFONT_H_
|
#endif // _TEXFONT_H_
|
||||||
|
|
234
common/view.cpp
234
common/view.cpp
|
@ -7,6 +7,7 @@
|
||||||
#include "system.h"
|
#include "system.h"
|
||||||
#include "tr.h"
|
#include "tr.h"
|
||||||
#include "texfont.h"
|
#include "texfont.h"
|
||||||
|
#include "lc_texture.h"
|
||||||
|
|
||||||
View::View(Project *project)
|
View::View(Project *project)
|
||||||
{
|
{
|
||||||
|
@ -213,6 +214,14 @@ void View::OnDraw()
|
||||||
|
|
||||||
if (mWidget)
|
if (mWidget)
|
||||||
{
|
{
|
||||||
|
const lcPreferences& Preferences = lcGetPreferences();
|
||||||
|
|
||||||
|
if (Preferences.mDrawGridStuds || Preferences.mDrawGridLines)
|
||||||
|
DrawGrid();
|
||||||
|
|
||||||
|
if (Preferences.mDrawAxes)
|
||||||
|
DrawAxes();
|
||||||
|
|
||||||
lcTool Tool = gMainWindow->GetTool();
|
lcTool Tool = gMainWindow->GetTool();
|
||||||
|
|
||||||
if ((Tool == LC_TOOL_SELECT || Tool == LC_TOOL_MOVE) && mTrackButton == LC_TRACKBUTTON_NONE && mProject->AnyObjectsSelected(false))
|
if ((Tool == LC_TOOL_SELECT || Tool == LC_TOOL_MOVE) && mTrackButton == LC_TRACKBUTTON_NONE && mProject->AnyObjectsSelected(false))
|
||||||
|
@ -694,13 +703,12 @@ void View::DrawRotateOverlay()
|
||||||
|
|
||||||
// Draw text.
|
// Draw text.
|
||||||
lcVector3 ScreenPos = ProjectPoint(OverlayCenter);
|
lcVector3 ScreenPos = ProjectPoint(OverlayCenter);
|
||||||
TexFont* Font = mProject->m_pScreenFont;
|
|
||||||
|
|
||||||
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->SetWorldViewMatrix(lcMatrix44Translation(lcVector3(0.375, 0.375, 0.0)));
|
mContext->SetWorldViewMatrix(lcMatrix44Translation(lcVector3(0.375, 0.375, 0.0)));
|
||||||
|
|
||||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
||||||
Font->MakeCurrent();
|
gTexFont.MakeCurrent();
|
||||||
glEnable(GL_TEXTURE_2D);
|
glEnable(GL_TEXTURE_2D);
|
||||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
glEnable(GL_BLEND);
|
glEnable(GL_BLEND);
|
||||||
|
@ -709,10 +717,10 @@ void View::DrawRotateOverlay()
|
||||||
sprintf(buf, "[%.2f]", fabsf(Angle));
|
sprintf(buf, "[%.2f]", fabsf(Angle));
|
||||||
|
|
||||||
int cx, cy;
|
int cx, cy;
|
||||||
Font->GetStringDimensions(&cx, &cy, buf);
|
gTexFont.GetStringDimensions(&cx, &cy, buf);
|
||||||
|
|
||||||
glColor4f(0.8f, 0.8f, 0.0f, 1.0f);
|
glColor4f(0.8f, 0.8f, 0.0f, 1.0f);
|
||||||
Font->PrintText(ScreenPos[0] - (cx / 2), ScreenPos[1] + (cy / 2), 0.0f, buf);
|
gTexFont.PrintText(ScreenPos[0] - (cx / 2), ScreenPos[1] + (cy / 2), 0.0f, buf);
|
||||||
|
|
||||||
glDisable(GL_BLEND);
|
glDisable(GL_BLEND);
|
||||||
glDisable(GL_TEXTURE_2D);
|
glDisable(GL_TEXTURE_2D);
|
||||||
|
@ -861,8 +869,226 @@ void View::DrawRotateViewOverlay()
|
||||||
glEnable(GL_DEPTH_TEST);
|
glEnable(GL_DEPTH_TEST);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void View::DrawGrid()
|
||||||
|
{
|
||||||
|
const lcPreferences& Preferences = lcGetPreferences();
|
||||||
|
|
||||||
|
mContext->SetWorldViewMatrix(mCamera->mWorldView);
|
||||||
|
|
||||||
|
const int Spacing = lcMax(Preferences.mGridLineSpacing, 1);
|
||||||
|
int MinX, MaxX, MinY, MaxY;
|
||||||
|
float BoundingBox[6];
|
||||||
|
|
||||||
|
if (mProject->GetPiecesBoundingBox(this, BoundingBox))
|
||||||
|
{
|
||||||
|
MinX = (int)(floorf(BoundingBox[0] / (0.8f * Spacing))) - 1;
|
||||||
|
MinY = (int)(floorf(BoundingBox[1] / (0.8f * Spacing))) - 1;
|
||||||
|
MaxX = (int)(ceilf(BoundingBox[3] / (0.8f * Spacing))) + 1;
|
||||||
|
MaxY = (int)(ceilf(BoundingBox[4] / (0.8f * Spacing))) + 1;
|
||||||
|
|
||||||
|
MinX = lcMin(MinX, -2);
|
||||||
|
MinY = lcMin(MinY, -2);
|
||||||
|
MaxX = lcMax(MaxX, 2);
|
||||||
|
MaxY = lcMax(MaxY, 2);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
MinX = -2;
|
||||||
|
MinY = -2;
|
||||||
|
MaxX = 2;
|
||||||
|
MaxY = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Preferences.mDrawGridStuds)
|
||||||
|
{
|
||||||
|
float Left = MinX * 0.8f * Spacing;
|
||||||
|
float Right = MaxX * 0.8f * Spacing;
|
||||||
|
float Top = MinY * 0.8f * Spacing;
|
||||||
|
float Bottom = MaxY * 0.8f * Spacing;
|
||||||
|
float Z = 0;
|
||||||
|
float U = (MaxX - MinX) * Spacing;
|
||||||
|
float V = (MaxY - MinY) * Spacing;
|
||||||
|
|
||||||
|
float Verts[4 * 5];
|
||||||
|
float* CurVert = Verts;
|
||||||
|
|
||||||
|
*CurVert++ = Left;
|
||||||
|
*CurVert++ = Top;
|
||||||
|
*CurVert++ = Z;
|
||||||
|
*CurVert++ = 0.0f;
|
||||||
|
*CurVert++ = V;
|
||||||
|
|
||||||
|
*CurVert++ = Left;
|
||||||
|
*CurVert++ = Bottom;
|
||||||
|
*CurVert++ = Z;
|
||||||
|
*CurVert++ = 0.0f;
|
||||||
|
*CurVert++ = 0.0f;
|
||||||
|
|
||||||
|
*CurVert++ = Right;
|
||||||
|
*CurVert++ = Bottom;
|
||||||
|
*CurVert++ = Z;
|
||||||
|
*CurVert++ = U;
|
||||||
|
*CurVert++ = 0.0f;
|
||||||
|
|
||||||
|
*CurVert++ = Right;
|
||||||
|
*CurVert++ = Top;
|
||||||
|
*CurVert++ = Z;
|
||||||
|
*CurVert++ = U;
|
||||||
|
*CurVert++ = V;
|
||||||
|
|
||||||
|
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, gGridTexture->mTexture);
|
||||||
|
glEnable(GL_TEXTURE_2D);
|
||||||
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
|
glEnable(GL_BLEND);
|
||||||
|
|
||||||
|
glColor4fv(lcVector4FromColor(Preferences.mGridStudColor));
|
||||||
|
|
||||||
|
glVertexPointer(3, GL_FLOAT, 5 * sizeof(float), Verts);
|
||||||
|
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||||
|
glTexCoordPointer(2, GL_FLOAT, 5 * sizeof(float), Verts + 3);
|
||||||
|
|
||||||
|
glDrawArrays(GL_QUADS, 0, 4);
|
||||||
|
|
||||||
|
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||||
|
|
||||||
|
glDisable(GL_TEXTURE_2D);
|
||||||
|
glDisable(GL_BLEND);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Preferences.mDrawGridLines)
|
||||||
|
{
|
||||||
|
mContext->SetLineWidth(1.0f);
|
||||||
|
glColor4fv(lcVector4FromColor(Preferences.mGridLineColor));
|
||||||
|
|
||||||
|
int NumVerts = 2 * (MaxX - MinX + MaxY - MinY + 2);
|
||||||
|
float* Verts = (float*)malloc(NumVerts * sizeof(float[3]));
|
||||||
|
float* Vert = Verts;
|
||||||
|
float LineSpacing = Spacing * 0.8f;
|
||||||
|
|
||||||
|
for (int Step = MinX; Step < MaxX + 1; Step++)
|
||||||
|
{
|
||||||
|
*Vert++ = Step * LineSpacing;
|
||||||
|
*Vert++ = MinY * LineSpacing;
|
||||||
|
*Vert++ = 0.0f;
|
||||||
|
*Vert++ = Step * LineSpacing;
|
||||||
|
*Vert++ = MaxY * LineSpacing;
|
||||||
|
*Vert++ = 0.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int Step = MinY; Step < MaxY + 1; Step++)
|
||||||
|
{
|
||||||
|
*Vert++ = MinX * LineSpacing;
|
||||||
|
*Vert++ = Step * LineSpacing;
|
||||||
|
*Vert++ = 0.0f;
|
||||||
|
*Vert++ = MaxX * LineSpacing;
|
||||||
|
*Vert++ = Step * LineSpacing;
|
||||||
|
*Vert++ = 0.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
glVertexPointer(3, GL_FLOAT, 0, Verts);
|
||||||
|
glDrawArrays(GL_LINES, 0, NumVerts);
|
||||||
|
free(Verts);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void View::DrawAxes()
|
||||||
|
{
|
||||||
|
// glClear(GL_DEPTH_BUFFER_BIT);
|
||||||
|
|
||||||
|
lcMatrix44 Mats[3];
|
||||||
|
Mats[0] = mCamera->mWorldView;
|
||||||
|
Mats[0].SetTranslation(lcVector3(0, 0, 0));
|
||||||
|
Mats[1] = lcMul(lcMatrix44(lcVector4(0, 1, 0, 0), lcVector4(1, 0, 0, 0), lcVector4(0, 0, 1, 0), lcVector4(0, 0, 0, 1)), Mats[0]);
|
||||||
|
Mats[2] = lcMul(lcMatrix44(lcVector4(0, 0, 1, 0), lcVector4(0, 1, 0, 0), lcVector4(1, 0, 0, 0), lcVector4(0, 0, 0, 1)), Mats[0]);
|
||||||
|
|
||||||
|
lcVector3 pts[3] =
|
||||||
|
{
|
||||||
|
lcMul30(lcVector3(20, 0, 0), Mats[0]),
|
||||||
|
lcMul30(lcVector3(0, 20, 0), Mats[0]),
|
||||||
|
lcMul30(lcVector3(0, 0, 20), Mats[0]),
|
||||||
|
};
|
||||||
|
|
||||||
|
const lcVector4 Colors[3] =
|
||||||
|
{
|
||||||
|
lcVector4(0.8f, 0.0f, 0.0f, 1.0f),
|
||||||
|
lcVector4(0.0f, 0.8f, 0.0f, 1.0f),
|
||||||
|
lcVector4(0.0f, 0.0f, 0.8f, 1.0f)
|
||||||
|
};
|
||||||
|
|
||||||
|
mContext->SetProjectionMatrix(lcMatrix44Ortho(0, mWidth, 0, mHeight, -50, 50));
|
||||||
|
mContext->SetWorldViewMatrix(lcMatrix44Translation(lcVector3(25.375f, 25.375f, 0.0f)));
|
||||||
|
|
||||||
|
// Draw the arrows.
|
||||||
|
lcVector3 Verts[11];
|
||||||
|
Verts[0] = lcVector3(0.0f, 0.0f, 0.0f);
|
||||||
|
|
||||||
|
glVertexPointer(3, GL_FLOAT, 0, Verts);
|
||||||
|
|
||||||
|
for (int i = 0; i < 3; i++)
|
||||||
|
{
|
||||||
|
glColor4fv(Colors[i]);
|
||||||
|
Verts[1] = pts[i];
|
||||||
|
|
||||||
|
for (int j = 0; j < 9; j++)
|
||||||
|
Verts[j+2] = lcMul30(lcVector3(12.0f, cosf(LC_2PI * j / 8) * 3.0f, sinf(LC_2PI * j / 8) * 3.0f), Mats[i]);
|
||||||
|
|
||||||
|
glDrawArrays(GL_LINES, 0, 2);
|
||||||
|
glDrawArrays(GL_TRIANGLE_FAN, 1, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
||||||
|
gTexFont.MakeCurrent();
|
||||||
|
glEnable(GL_TEXTURE_2D);
|
||||||
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
|
glEnable(GL_BLEND);
|
||||||
|
|
||||||
|
glColor4f(0.0f, 0.0f, 0.0f, 1.0f);
|
||||||
|
gTexFont.PrintText(pts[0][0], pts[0][1], 40.0f, "X");
|
||||||
|
gTexFont.PrintText(pts[1][0], pts[1][1], 40.0f, "Y");
|
||||||
|
gTexFont.PrintText(pts[2][0], pts[2][1], 40.0f, "Z");
|
||||||
|
|
||||||
|
glDisable(GL_BLEND);
|
||||||
|
glDisable(GL_TEXTURE_2D);
|
||||||
|
}
|
||||||
|
|
||||||
void View::DrawViewport()
|
void View::DrawViewport()
|
||||||
{
|
{
|
||||||
|
mContext->SetProjectionMatrix(lcMatrix44Ortho(0.0f, mWidth, 0.0f, mHeight, -1.0f, 1.0f));
|
||||||
|
mContext->SetWorldViewMatrix(lcMatrix44Translation(lcVector3(0.375f, 0.375f, 0.0f)));
|
||||||
|
|
||||||
|
glDepthMask(GL_FALSE);
|
||||||
|
glDisable(GL_DEPTH_TEST);
|
||||||
|
glDisable(GL_LIGHTING);
|
||||||
|
|
||||||
|
if (gMainWindow->GetActiveView() == this)
|
||||||
|
{
|
||||||
|
glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
|
||||||
|
float Verts[8] = { 0.0f, 0.0f, mWidth - 1, 0.0f, mWidth - 1, mHeight - 1, 0.0f, mHeight - 1 };
|
||||||
|
|
||||||
|
glVertexPointer(2, GL_FLOAT, 0, Verts);
|
||||||
|
glDrawArrays(GL_LINE_LOOP, 0, 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* CameraName = mCamera->GetName();
|
||||||
|
|
||||||
|
if (CameraName[0])
|
||||||
|
{
|
||||||
|
glColor4f(0.0f, 0.0f, 0.0f, 1.0f);
|
||||||
|
glEnable(GL_TEXTURE_2D);
|
||||||
|
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
||||||
|
gTexFont.MakeCurrent();
|
||||||
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
|
glEnable(GL_BLEND);
|
||||||
|
|
||||||
|
gTexFont.PrintText(3.0f, (float)mHeight - 1.0f - 6.0f, 0.0f, CameraName);
|
||||||
|
|
||||||
|
glDisable(GL_BLEND);
|
||||||
|
glDisable(GL_TEXTURE_2D);
|
||||||
|
}
|
||||||
|
|
||||||
|
glDepthMask(GL_TRUE);
|
||||||
|
glEnable(GL_DEPTH_TEST);
|
||||||
}
|
}
|
||||||
|
|
||||||
void View::OnInitialUpdate()
|
void View::OnInitialUpdate()
|
||||||
|
|
|
@ -109,6 +109,8 @@ protected:
|
||||||
void DrawRotateOverlay();
|
void DrawRotateOverlay();
|
||||||
void DrawSelectZoomRegionOverlay();
|
void DrawSelectZoomRegionOverlay();
|
||||||
void DrawRotateViewOverlay();
|
void DrawRotateViewOverlay();
|
||||||
|
void DrawGrid();
|
||||||
|
void DrawAxes();
|
||||||
void DrawViewport();
|
void DrawViewport();
|
||||||
|
|
||||||
void UpdateTrackTool();
|
void UpdateTrackTool();
|
||||||
|
|
|
@ -8,6 +8,8 @@
|
||||||
#include "lc_mainwindow.h"
|
#include "lc_mainwindow.h"
|
||||||
#include "lc_context.h"
|
#include "lc_context.h"
|
||||||
#include "view.h"
|
#include "view.h"
|
||||||
|
#include "texfont.h"
|
||||||
|
#include "lc_texture.h"
|
||||||
|
|
||||||
void lcGLWidget::MakeCurrent()
|
void lcGLWidget::MakeCurrent()
|
||||||
{
|
{
|
||||||
|
@ -121,6 +123,15 @@ lcQGLWidget::lcQGLWidget(QWidget *parent, lcQGLWidget *share, lcGLWidget *owner,
|
||||||
GL_InitializeSharedExtensions(widget);
|
GL_InitializeSharedExtensions(widget);
|
||||||
widget->OnInitialUpdate();
|
widget->OnInitialUpdate();
|
||||||
|
|
||||||
|
// TODO: Find a better place for the grid texture and font
|
||||||
|
gTexFont.Load();
|
||||||
|
if (!gGridTexture)
|
||||||
|
{
|
||||||
|
gGridTexture = new lcTexture;
|
||||||
|
gGridTexture->CreateGridTexture();
|
||||||
|
}
|
||||||
|
gGridTexture->AddRef();
|
||||||
|
|
||||||
preferredSize = QSize(0, 0);
|
preferredSize = QSize(0, 0);
|
||||||
setMouseTracking(true);
|
setMouseTracking(true);
|
||||||
|
|
||||||
|
@ -134,6 +145,13 @@ lcQGLWidget::lcQGLWidget(QWidget *parent, lcQGLWidget *share, lcGLWidget *owner,
|
||||||
|
|
||||||
lcQGLWidget::~lcQGLWidget()
|
lcQGLWidget::~lcQGLWidget()
|
||||||
{
|
{
|
||||||
|
gTexFont.Release();
|
||||||
|
if (!gGridTexture->Release())
|
||||||
|
{
|
||||||
|
delete gGridTexture;
|
||||||
|
gGridTexture = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (isView)
|
if (isView)
|
||||||
delete widget;
|
delete widget;
|
||||||
}
|
}
|
||||||
|
@ -148,6 +166,12 @@ QSize lcQGLWidget::sizeHint() const
|
||||||
|
|
||||||
void lcQGLWidget::initializeGL()
|
void lcQGLWidget::initializeGL()
|
||||||
{
|
{
|
||||||
|
glEnable(GL_POLYGON_OFFSET_FILL);
|
||||||
|
glPolygonOffset(0.5f, 0.1f);
|
||||||
|
|
||||||
|
glEnable(GL_DEPTH_TEST);
|
||||||
|
glDepthFunc(GL_LEQUAL);
|
||||||
|
glDepthMask(GL_TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void lcQGLWidget::resizeGL(int width, int height)
|
void lcQGLWidget::resizeGL(int width, int height)
|
||||||
|
|
Loading…
Add table
Reference in a new issue