mirror of
https://github.com/leozide/leocad
synced 2025-01-29 20:34:50 +01:00
Added option to draw studs on the base grid.
This commit is contained in:
parent
7dfac75de5
commit
8609014e64
17 changed files with 652 additions and 244 deletions
111
common/image.cpp
111
common/image.cpp
|
@ -2,87 +2,118 @@
|
||||||
#include "image.h"
|
#include "image.h"
|
||||||
#include "opengl.h"
|
#include "opengl.h"
|
||||||
|
|
||||||
Image::Image ()
|
Image::Image()
|
||||||
{
|
{
|
||||||
mData = NULL;
|
mData = NULL;
|
||||||
mWidth = 0;
|
mWidth = 0;
|
||||||
mHeight = 0;
|
mHeight = 0;
|
||||||
mAlpha = false;
|
mFormat = LC_PIXEL_FORMAT_INVALID;
|
||||||
}
|
}
|
||||||
|
|
||||||
Image::~Image ()
|
Image::~Image()
|
||||||
{
|
{
|
||||||
FreeData();
|
FreeData();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Image::FreeData ()
|
int Image::GetBPP() const
|
||||||
|
{
|
||||||
|
switch (mFormat)
|
||||||
|
{
|
||||||
|
case LC_PIXEL_FORMAT_INVALID:
|
||||||
|
return 0;
|
||||||
|
case LC_PIXEL_FORMAT_A8:
|
||||||
|
return 1;
|
||||||
|
case LC_PIXEL_FORMAT_L8A8:
|
||||||
|
return 2;
|
||||||
|
case LC_PIXEL_FORMAT_R8G8B8:
|
||||||
|
return 3;
|
||||||
|
case LC_PIXEL_FORMAT_R8G8B8A8:
|
||||||
|
return 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Image::HasAlpha() const
|
||||||
|
{
|
||||||
|
switch (mFormat)
|
||||||
|
{
|
||||||
|
case LC_PIXEL_FORMAT_INVALID:
|
||||||
|
return false;
|
||||||
|
case LC_PIXEL_FORMAT_A8:
|
||||||
|
return true;
|
||||||
|
case LC_PIXEL_FORMAT_L8A8:
|
||||||
|
return true;
|
||||||
|
case LC_PIXEL_FORMAT_R8G8B8:
|
||||||
|
return false;
|
||||||
|
case LC_PIXEL_FORMAT_R8G8B8A8:
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Image::FreeData()
|
||||||
{
|
{
|
||||||
free(mData);
|
free(mData);
|
||||||
mData = NULL;
|
mData = NULL;
|
||||||
mWidth = 0;
|
mWidth = 0;
|
||||||
mHeight = 0;
|
mHeight = 0;
|
||||||
mAlpha = false;
|
mFormat = LC_PIXEL_FORMAT_INVALID;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Image::Allocate(int Width, int Height, bool Alpha)
|
void Image::Allocate(int Width, int Height, lcPixelFormat Format)
|
||||||
{
|
{
|
||||||
FreeData ();
|
FreeData();
|
||||||
|
|
||||||
mWidth = Width;
|
mWidth = Width;
|
||||||
mHeight = Height;
|
mHeight = Height;
|
||||||
mAlpha = Alpha;
|
mFormat = Format;
|
||||||
|
mData = (unsigned char*)malloc(mWidth * mHeight * GetBPP());
|
||||||
if (mAlpha)
|
|
||||||
mData = (unsigned char*)malloc(mWidth * mHeight * 4);
|
|
||||||
else
|
|
||||||
mData = (unsigned char*)malloc(mWidth * mHeight * 3);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Image::ResizePow2 ()
|
void Image::ResizePow2()
|
||||||
{
|
{
|
||||||
int i, shifted_x, shifted_y;
|
int i, shifted_x, shifted_y;
|
||||||
|
|
||||||
shifted_x = mWidth;
|
shifted_x = mWidth;
|
||||||
for (i = 0; ((i < 16) && (shifted_x != 0)); i++)
|
for (i = 0; ((i < 16) && (shifted_x != 0)); i++)
|
||||||
shifted_x = shifted_x >> 1;
|
shifted_x = shifted_x >> 1;
|
||||||
shifted_x = (i != 0) ? 1 << (i-1) : 1;
|
shifted_x = (i != 0) ? 1 << (i-1) : 1;
|
||||||
|
|
||||||
shifted_y = mHeight;
|
shifted_y = mHeight;
|
||||||
for (i = 0; ((i < 16) && (shifted_y != 0)); i++)
|
for (i = 0; ((i < 16) && (shifted_y != 0)); i++)
|
||||||
shifted_y = shifted_y >> 1;
|
shifted_y = shifted_y >> 1;
|
||||||
shifted_y = (i != 0) ? 1 << (i-1) : 1;
|
shifted_y = (i != 0) ? 1 << (i-1) : 1;
|
||||||
|
|
||||||
if ((shifted_x != mWidth) || (shifted_y != mHeight))
|
if ((shifted_x != mWidth) || (shifted_y != mHeight))
|
||||||
Resize (shifted_x, shifted_y);
|
Resize (shifted_x, shifted_y);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Image::Resize (int width, int height)
|
void Image::Resize(int width, int height)
|
||||||
{
|
{
|
||||||
int i, j, k, components, stx, sty;
|
int i, j, k, components, stx, sty;
|
||||||
float accumx, accumy;
|
float accumx, accumy;
|
||||||
unsigned char* bits;
|
unsigned char* bits;
|
||||||
|
|
||||||
if (mAlpha)
|
components = GetBPP();
|
||||||
components = 4;
|
|
||||||
else
|
|
||||||
components = 3;
|
|
||||||
|
|
||||||
bits = (unsigned char*)malloc (width * height * components);
|
bits = (unsigned char*)malloc(width * height * components);
|
||||||
|
|
||||||
for (j = 0; j < mHeight; j++)
|
for (j = 0; j < mHeight; j++)
|
||||||
{
|
{
|
||||||
accumy = (float)height*j/(float)mHeight;
|
accumy = (float)height*j/(float)mHeight;
|
||||||
sty = (int)floor(accumy);
|
sty = (int)floor(accumy);
|
||||||
|
|
||||||
for (i = 0; i < mWidth; i++)
|
for (i = 0; i < mWidth; i++)
|
||||||
{
|
{
|
||||||
accumx = (float)width*i/(float)mWidth;
|
accumx = (float)width*i/(float)mWidth;
|
||||||
stx = (int)floor(accumx);
|
stx = (int)floor(accumx);
|
||||||
|
|
||||||
for (k = 0; k < components; k++)
|
for (k = 0; k < components; k++)
|
||||||
bits[(stx+sty*width)*components+k] = mData[(i+j*mWidth)*components+k];
|
bits[(stx+sty*width)*components+k] = mData[(i+j*mWidth)*components+k];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
free (mData);
|
free (mData);
|
||||||
mData = bits;
|
mData = bits;
|
||||||
|
@ -92,11 +123,11 @@ void Image::Resize (int width, int height)
|
||||||
|
|
||||||
void Image::FromOpenGL(int Width, int Height)
|
void Image::FromOpenGL(int Width, int Height)
|
||||||
{
|
{
|
||||||
Allocate(Width, Height, true);
|
Allocate(Width, Height, LC_PIXEL_FORMAT_R8G8B8A8);
|
||||||
|
|
||||||
lcuint8* Buffer = (lcuint8*)malloc(Width * Height * 4);
|
lcuint8* Buffer = (lcuint8*)malloc(Width * Height * 4);
|
||||||
|
|
||||||
glPixelStorei (GL_PACK_ALIGNMENT, 1);
|
glPixelStorei (GL_PACK_ALIGNMENT, 1);
|
||||||
glReadPixels(0, 0, Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, Buffer);
|
glReadPixels(0, 0, Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, Buffer);
|
||||||
|
|
||||||
for (int Row = 0; Row < Height; Row++)
|
for (int Row = 0; Row < Height; Row++)
|
||||||
|
|
|
@ -14,12 +14,24 @@ enum LC_IMAGE_FORMAT
|
||||||
LC_IMAGE_PNG
|
LC_IMAGE_PNG
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum lcPixelFormat
|
||||||
|
{
|
||||||
|
LC_PIXEL_FORMAT_INVALID,
|
||||||
|
LC_PIXEL_FORMAT_A8,
|
||||||
|
LC_PIXEL_FORMAT_L8A8,
|
||||||
|
LC_PIXEL_FORMAT_R8G8B8,
|
||||||
|
LC_PIXEL_FORMAT_R8G8B8A8
|
||||||
|
};
|
||||||
|
|
||||||
class Image
|
class Image
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Image();
|
Image();
|
||||||
virtual ~Image();
|
virtual ~Image();
|
||||||
|
|
||||||
|
int GetBPP() const;
|
||||||
|
bool HasAlpha() const;
|
||||||
|
|
||||||
bool FileSave(lcMemFile& File, LC_IMAGE_FORMAT Format, bool Transparent) const;
|
bool FileSave(lcMemFile& File, LC_IMAGE_FORMAT Format, bool Transparent) const;
|
||||||
bool FileSave(const char* FileName, LC_IMAGE_FORMAT Format, bool Transparent) const;
|
bool FileSave(const char* FileName, LC_IMAGE_FORMAT Format, bool Transparent) const;
|
||||||
bool FileLoad(lcMemFile& File);
|
bool FileLoad(lcMemFile& File);
|
||||||
|
@ -28,12 +40,12 @@ public:
|
||||||
void Resize(int Width, int Height);
|
void Resize(int Width, int Height);
|
||||||
void ResizePow2();
|
void ResizePow2();
|
||||||
void FromOpenGL(int Width, int Height);
|
void FromOpenGL(int Width, int Height);
|
||||||
void Allocate(int Width, int Height, bool Alpha);
|
void Allocate(int Width, int Height, lcPixelFormat Format);
|
||||||
void FreeData();
|
void FreeData();
|
||||||
|
|
||||||
int mWidth;
|
int mWidth;
|
||||||
int mHeight;
|
int mHeight;
|
||||||
bool mAlpha;
|
lcPixelFormat mFormat;
|
||||||
unsigned char* mData;
|
unsigned char* mData;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -151,7 +151,11 @@ struct lcPreferencesDialogOptions
|
||||||
lcuint32 Detail;
|
lcuint32 Detail;
|
||||||
float LineWidth;
|
float LineWidth;
|
||||||
int AASamples;
|
int AASamples;
|
||||||
int GridSize;
|
bool GridStuds;
|
||||||
|
lcuint32 GridStudColor;
|
||||||
|
bool GridLines;
|
||||||
|
int GridLineSpacing;
|
||||||
|
lcuint32 GridLineColor;
|
||||||
|
|
||||||
lcArray<lcLibraryCategory> Categories;
|
lcArray<lcLibraryCategory> Categories;
|
||||||
bool CategoriesModified;
|
bool CategoriesModified;
|
||||||
|
|
|
@ -9,7 +9,12 @@
|
||||||
#define LC_PI 3.141592f
|
#define LC_PI 3.141592f
|
||||||
#define LC_2PI 6.283185f
|
#define LC_2PI 6.283185f
|
||||||
|
|
||||||
#define LC_RGB(r,g,b) ((lcuint32)(((lcuint8) (r) | ((lcuint16) (g) << 8))|(((lcuint32) (lcuint8) (b)) << 16)))
|
#define LC_RGB(r,g,b) LC_RGBA(r,g,b,255)
|
||||||
|
#define LC_RGBA(r,g,b,a) ((lcuint32)(((lcuint8) (r) | ((lcuint16) (g) << 8)) | (((lcuint32) (lcuint8) (b)) << 16) | (((lcuint32) (lcuint8) (a)) << 24)))
|
||||||
|
#define LC_RGBA_RED(rgba) ((lcuint8)(((rgba) >> 0) & 0xff))
|
||||||
|
#define LC_RGBA_GREEN(rgba) ((lcuint8)(((rgba) >> 8) & 0xff))
|
||||||
|
#define LC_RGBA_BLUE(rgba) ((lcuint8)(((rgba) >> 16) & 0xff))
|
||||||
|
#define LC_RGBA_ALPHA(rgba) ((lcuint8)(((rgba) >> 24) & 0xff))
|
||||||
#define LC_FLOATRGB(f) LC_RGB(f[0]*255, f[1]*255, f[2]*255)
|
#define LC_FLOATRGB(f) LC_RGB(f[0]*255, f[1]*255, f[2]*255)
|
||||||
|
|
||||||
template <typename T, typename U>
|
template <typename T, typename U>
|
||||||
|
@ -442,6 +447,13 @@ inline lcVector4& operator/=(lcVector4& a, float b)
|
||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline lcVector4 lcVector4FromColor(lcuint32 Color)
|
||||||
|
{
|
||||||
|
lcVector4 v(LC_RGBA_RED(Color), LC_RGBA_GREEN(Color), LC_RGBA_BLUE(Color), LC_RGBA_ALPHA(Color));
|
||||||
|
v /= 255.0f;
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
inline lcVector3 lcMul31(const lcVector3& a, const lcMatrix44& b)
|
inline lcVector3 lcMul31(const lcVector3& a, const lcMatrix44& b)
|
||||||
{
|
{
|
||||||
lcVector4 v = b.r[0] * a[0] + b.r[1] * a[1] + b.r[2] * a[2] + b.r[3];
|
lcVector4 v = b.r[0] * a[0] + b.r[1] * a[1] + b.r[2] * a[2] + b.r[3];
|
||||||
|
|
|
@ -49,7 +49,11 @@ lcProfileEntry gProfileEntries[LC_NUM_PROFILE_KEYS] =
|
||||||
lcProfileEntry("Settings", "Snap", LC_DRAW_SNAP_A | LC_DRAW_SNAP_XYZ), // LC_PROFILE_SNAP
|
lcProfileEntry("Settings", "Snap", LC_DRAW_SNAP_A | LC_DRAW_SNAP_XYZ), // LC_PROFILE_SNAP
|
||||||
lcProfileEntry("Settings", "AngleSnap", 30), // LC_PROFILE_ANGLE_SNAP
|
lcProfileEntry("Settings", "AngleSnap", 30), // LC_PROFILE_ANGLE_SNAP
|
||||||
lcProfileEntry("Settings", "LineWidth", 1.0f), // LC_PROFILE_LINE_WIDTH
|
lcProfileEntry("Settings", "LineWidth", 1.0f), // LC_PROFILE_LINE_WIDTH
|
||||||
lcProfileEntry("Settings", "GridSize", 20), // LC_PROFILE_GRID_SIZE
|
lcProfileEntry("Settings", "GridStuds", 1), // LC_PROFILE_GRID_STUDS
|
||||||
|
lcProfileEntry("Settings", "GridStudColor", LC_RGBA(64, 64, 64, 128)), // LC_PROFILE_GRID_STUD_COLOR
|
||||||
|
lcProfileEntry("Settings", "GridLines", 1), // LC_PROFILE_GRID_LINES
|
||||||
|
lcProfileEntry("Settings", "GridLineSpacing", 5), // LC_PROFILE_GRID_LINE_SPACING
|
||||||
|
lcProfileEntry("Settings", "GridLineColor", LC_RGBA(0, 0, 0, 255)), // LC_PROFILE_GRID_LINE_COLOR
|
||||||
lcProfileEntry("Settings", "AASamples", 1), // LC_PROFILE_ANTIALIASING_SAMPLES
|
lcProfileEntry("Settings", "AASamples", 1), // LC_PROFILE_ANTIALIASING_SAMPLES
|
||||||
|
|
||||||
lcProfileEntry("Settings", "CheckUpdates", 1), // LC_PROFILE_CHECK_UPDATES
|
lcProfileEntry("Settings", "CheckUpdates", 1), // LC_PROFILE_CHECK_UPDATES
|
||||||
|
|
|
@ -8,7 +8,11 @@ enum LC_PROFILE_KEY
|
||||||
LC_PROFILE_SNAP,
|
LC_PROFILE_SNAP,
|
||||||
LC_PROFILE_ANGLE_SNAP,
|
LC_PROFILE_ANGLE_SNAP,
|
||||||
LC_PROFILE_LINE_WIDTH,
|
LC_PROFILE_LINE_WIDTH,
|
||||||
LC_PROFILE_GRID_SIZE,
|
LC_PROFILE_GRID_STUDS,
|
||||||
|
LC_PROFILE_GRID_STUD_COLOR,
|
||||||
|
LC_PROFILE_GRID_LINES,
|
||||||
|
LC_PROFILE_GRID_LINE_SPACING,
|
||||||
|
LC_PROFILE_GRID_LINE_COLOR,
|
||||||
LC_PROFILE_ANTIALIASING_SAMPLES,
|
LC_PROFILE_ANTIALIASING_SAMPLES,
|
||||||
|
|
||||||
LC_PROFILE_CHECK_UPDATES,
|
LC_PROFILE_CHECK_UPDATES,
|
||||||
|
|
|
@ -41,51 +41,80 @@ bool lcTexture::Load(lcMemFile& File, int Flags)
|
||||||
return Load(image, Flags);
|
return Load(image, Flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool lcTexture::Load(Image& image, int Flags)
|
bool lcTexture::Load(Image* images, int NumLevels, int Flags)
|
||||||
{
|
{
|
||||||
image.ResizePow2();
|
mWidth = images[0].mWidth;
|
||||||
|
mHeight = images[0].mHeight;
|
||||||
mWidth = image.mWidth;
|
|
||||||
mHeight = image.mHeight;
|
|
||||||
|
|
||||||
glGenTextures(1, &mTexture);
|
glGenTextures(1, &mTexture);
|
||||||
|
|
||||||
|
int Filters[2][5] =
|
||||||
|
{
|
||||||
|
{ GL_NEAREST_MIPMAP_NEAREST, GL_NEAREST_MIPMAP_LINEAR, GL_LINEAR_MIPMAP_NEAREST, GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR_MIPMAP_LINEAR },
|
||||||
|
{ GL_NEAREST, GL_LINEAR, GL_LINEAR, GL_LINEAR, GL_LINEAR },
|
||||||
|
};
|
||||||
|
|
||||||
|
int FilterFlags = Flags & LC_TEXTURE_FILTER_MASK;
|
||||||
|
int FilterIndex = FilterFlags >> LC_TEXTURE_FILTER_SHIFT;
|
||||||
|
int MipIndex = Flags & LC_TEXTURE_MIPMAPS ? 0 : 1;
|
||||||
|
|
||||||
glBindTexture(GL_TEXTURE_2D, mTexture);
|
glBindTexture(GL_TEXTURE_2D, mTexture);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, (Flags & LC_TEXTURE_WRAPU) ? GL_REPEAT : GL_CLAMP);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, (Flags & LC_TEXTURE_WRAPU) ? GL_REPEAT : GL_CLAMP);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, (Flags & LC_TEXTURE_WRAPV) ? GL_REPEAT : GL_CLAMP);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, (Flags & LC_TEXTURE_WRAPV) ? GL_REPEAT : GL_CLAMP);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, (Flags & LC_TEXTURE_MIPMAPS) ? GL_LINEAR_MIPMAP_NEAREST : GL_LINEAR);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, Filters[MipIndex][FilterIndex]);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, Filters[1][FilterIndex]);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
|
||||||
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
|
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
|
||||||
|
|
||||||
int Format = image.mAlpha ? GL_RGBA : GL_RGB;
|
if (GL_SupportsAnisotropic && FilterFlags == LC_TEXTURE_ANISOTROPIC)
|
||||||
void* Data = image.mData;
|
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, lcMin(4.0f, GL_MaxAnisotropy));
|
||||||
|
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, image.mAlpha ? GL_RGBA : GL_RGB, mWidth, mHeight, 0, Format, GL_UNSIGNED_BYTE, Data);
|
int Format;
|
||||||
|
switch (images[0].mFormat)
|
||||||
|
{
|
||||||
|
case LC_PIXEL_FORMAT_A8:
|
||||||
|
Format = GL_ALPHA;
|
||||||
|
break;
|
||||||
|
case LC_PIXEL_FORMAT_L8A8:
|
||||||
|
Format = GL_LUMINANCE_ALPHA;
|
||||||
|
break;
|
||||||
|
case LC_PIXEL_FORMAT_R8G8B8:
|
||||||
|
Format = GL_RGB;
|
||||||
|
break;
|
||||||
|
case LC_PIXEL_FORMAT_R8G8B8A8:
|
||||||
|
Format = GL_RGBA;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
void* Data = images[0].mData;
|
||||||
|
glTexImage2D(GL_TEXTURE_2D, 0, Format, mWidth, mHeight, 0, Format, GL_UNSIGNED_BYTE, Data);
|
||||||
|
|
||||||
if (Flags & LC_TEXTURE_MIPMAPS)
|
if (Flags & LC_TEXTURE_MIPMAPS)
|
||||||
{
|
{
|
||||||
int Width = mWidth;
|
int Width = mWidth;
|
||||||
int Height = mHeight;
|
int Height = mHeight;
|
||||||
int Components = (Format == GL_RGBA) ? 4 : 3;
|
int Components = images[0].GetBPP();
|
||||||
|
|
||||||
for (int Level = 1; ((Width != 1) || (Height != 1)); Level++)
|
for (int Level = 1; ((Width != 1) || (Height != 1)); Level++)
|
||||||
{
|
{
|
||||||
GLubyte *Out, *In;
|
|
||||||
int RowStride = Width * Components;
|
|
||||||
|
|
||||||
Width = lcMax(1, Width >> 1);
|
Width = lcMax(1, Width >> 1);
|
||||||
Height = lcMax(1, Height >> 1);
|
Height = lcMax(1, Height >> 1);
|
||||||
|
|
||||||
In = Out = (GLubyte*)Data;
|
if (NumLevels == 1)
|
||||||
|
{
|
||||||
|
GLubyte *Out, *In;
|
||||||
|
int RowStride = Width * Components;
|
||||||
|
|
||||||
for (int y = 0; y < Height; y++, In += RowStride)
|
In = Out = (GLubyte*)Data;
|
||||||
for (int x = 0; x < Width; x++, Out += Components, In += 2 * Components)
|
|
||||||
for (int c = 0; c < Components; c++)
|
|
||||||
Out[c] = (In[c] + In[c + Components] + In[RowStride] + In[c + RowStride + Components]) / 4;
|
|
||||||
|
|
||||||
glTexImage2D(GL_TEXTURE_2D, Level, Components, Width, Height, 0, Format, GL_UNSIGNED_BYTE, Data);
|
for (int y = 0; y < Height; y++, In += RowStride)
|
||||||
|
for (int x = 0; x < Width; x++, Out += Components, In += 2 * Components)
|
||||||
|
for (int c = 0; c < Components; c++)
|
||||||
|
Out[c] = (In[c] + In[c + Components] + In[RowStride] + In[c + RowStride + Components]) / 4;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
Data = images[Level].mData;
|
||||||
|
|
||||||
|
glTexImage2D(GL_TEXTURE_2D, Level, Format, Width, Height, 0, Format, GL_UNSIGNED_BYTE, Data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -94,6 +123,13 @@ bool lcTexture::Load(Image& image, int Flags)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool lcTexture::Load(Image& image, int Flags)
|
||||||
|
{
|
||||||
|
image.ResizePow2();
|
||||||
|
|
||||||
|
return Load(&image, 1, Flags);
|
||||||
|
}
|
||||||
|
|
||||||
void lcTexture::Unload()
|
void lcTexture::Unload()
|
||||||
{
|
{
|
||||||
if (mTexture)
|
if (mTexture)
|
||||||
|
|
|
@ -3,9 +3,17 @@
|
||||||
|
|
||||||
#include "opengl.h"
|
#include "opengl.h"
|
||||||
|
|
||||||
#define LC_TEXTURE_WRAPU 0x01
|
#define LC_TEXTURE_WRAPU 0x01
|
||||||
#define LC_TEXTURE_WRAPV 0x02
|
#define LC_TEXTURE_WRAPV 0x02
|
||||||
#define LC_TEXTURE_MIPMAPS 0x04
|
#define LC_TEXTURE_MIPMAPS 0x04
|
||||||
|
|
||||||
|
#define LC_TEXTURE_POINT 0x00
|
||||||
|
#define LC_TEXTURE_LINEAR 0x10
|
||||||
|
#define LC_TEXTURE_BILINEAR 0x20
|
||||||
|
#define LC_TEXTURE_TRILINEAR 0x30
|
||||||
|
#define LC_TEXTURE_ANISOTROPIC 0x40
|
||||||
|
#define LC_TEXTURE_FILTER_MASK 0xf0
|
||||||
|
#define LC_TEXTURE_FILTER_SHIFT 4
|
||||||
|
|
||||||
#define LC_TEXTURE_NAME_LEN 256
|
#define LC_TEXTURE_NAME_LEN 256
|
||||||
|
|
||||||
|
@ -20,6 +28,7 @@ public:
|
||||||
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);
|
||||||
|
bool Load(Image* images, int NumLevels, int Flags);
|
||||||
void Unload();
|
void Unload();
|
||||||
|
|
||||||
int AddRef()
|
int AddRef()
|
||||||
|
|
|
@ -42,6 +42,8 @@ GLFRAMEBUFFERTEXTURELAYERARBPROC lcFramebufferTextureLayerARB;
|
||||||
bool GL_SupportsVertexBufferObject;
|
bool GL_SupportsVertexBufferObject;
|
||||||
bool GL_UseVertexBufferObject;
|
bool GL_UseVertexBufferObject;
|
||||||
bool GL_SupportsFramebufferObject;
|
bool GL_SupportsFramebufferObject;
|
||||||
|
bool GL_SupportsAnisotropic;
|
||||||
|
GLfloat GL_MaxAnisotropy;
|
||||||
|
|
||||||
bool GL_ExtensionSupported(const GLubyte* Extensions, const char* Name)
|
bool GL_ExtensionSupported(const GLubyte* Extensions, const char* Name)
|
||||||
{
|
{
|
||||||
|
@ -76,6 +78,13 @@ void GL_InitializeSharedExtensions(lcGLWidget* Window)
|
||||||
{
|
{
|
||||||
const GLubyte* Extensions = glGetString(GL_EXTENSIONS);
|
const GLubyte* Extensions = glGetString(GL_EXTENSIONS);
|
||||||
|
|
||||||
|
if (GL_ExtensionSupported(Extensions, "GL_EXT_texture_filter_anisotropic"))
|
||||||
|
{
|
||||||
|
glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &GL_MaxAnisotropy);
|
||||||
|
|
||||||
|
GL_SupportsAnisotropic = true;
|
||||||
|
}
|
||||||
|
|
||||||
if (GL_ExtensionSupported(Extensions, "GL_ARB_vertex_buffer_object"))
|
if (GL_ExtensionSupported(Extensions, "GL_ARB_vertex_buffer_object"))
|
||||||
{
|
{
|
||||||
lcBindBufferARB = (GLBINDBUFFERARBPROC)Window->GetExtensionAddress("glBindBufferARB");
|
lcBindBufferARB = (GLBINDBUFFERARBPROC)Window->GetExtensionAddress("glBindBufferARB");
|
||||||
|
|
|
@ -9,6 +9,8 @@ bool GL_ExtensionSupported(const GLubyte* Extensions, const char* Name);
|
||||||
extern bool GL_SupportsVertexBufferObject;
|
extern bool GL_SupportsVertexBufferObject;
|
||||||
extern bool GL_UseVertexBufferObject;
|
extern bool GL_UseVertexBufferObject;
|
||||||
extern bool GL_SupportsFramebufferObject;
|
extern bool GL_SupportsFramebufferObject;
|
||||||
|
extern bool GL_SupportsAnisotropic;
|
||||||
|
extern GLfloat GL_MaxAnisotropy;
|
||||||
|
|
||||||
inline void GL_DisableVertexBufferObject()
|
inline void GL_DisableVertexBufferObject()
|
||||||
{
|
{
|
||||||
|
@ -88,6 +90,11 @@ typedef ptrdiff_t GLintptrARB;
|
||||||
typedef ptrdiff_t GLsizeiptrARB;
|
typedef ptrdiff_t GLsizeiptrARB;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef GL_EXT_texture_filter_anisotropic
|
||||||
|
#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE
|
||||||
|
#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef GL_ARB_vertex_buffer_object
|
#ifndef GL_ARB_vertex_buffer_object
|
||||||
#define GL_BUFFER_SIZE_ARB 0x8764
|
#define GL_BUFFER_SIZE_ARB 0x8764
|
||||||
#define GL_BUFFER_USAGE_ARB 0x8765
|
#define GL_BUFFER_USAGE_ARB 0x8765
|
||||||
|
|
|
@ -47,12 +47,12 @@ Project::Project()
|
||||||
m_pGroups = NULL;
|
m_pGroups = NULL;
|
||||||
m_pUndoList = NULL;
|
m_pUndoList = NULL;
|
||||||
m_pRedoList = NULL;
|
m_pRedoList = NULL;
|
||||||
m_nGridList = 0;
|
|
||||||
m_pTrackFile = NULL;
|
m_pTrackFile = NULL;
|
||||||
m_nCurAction = 0;
|
m_nCurAction = 0;
|
||||||
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();
|
||||||
m_nAutosave = lcGetProfileInt(LC_PROFILE_AUTOSAVE_INTERVAL);
|
m_nAutosave = lcGetProfileInt(LC_PROFILE_AUTOSAVE_INTERVAL);
|
||||||
m_nMouse = lcGetProfileInt(LC_PROFILE_MOUSE_SENSITIVITY);
|
m_nMouse = lcGetProfileInt(LC_PROFILE_MOUSE_SENSITIVITY);
|
||||||
m_nDownX = 0;
|
m_nDownX = 0;
|
||||||
|
@ -69,6 +69,7 @@ Project::~Project()
|
||||||
delete m_pTrackFile;
|
delete m_pTrackFile;
|
||||||
delete m_pTerrain;
|
delete m_pTerrain;
|
||||||
delete m_pBackground;
|
delete m_pBackground;
|
||||||
|
delete mGridTexture;
|
||||||
delete m_pScreenFont;
|
delete m_pScreenFont;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -222,7 +223,11 @@ void Project::LoadDefaults(bool cameras)
|
||||||
m_fFogColor[1] = (float)((unsigned char) (((unsigned short) (rgb)) >> 8))/255;
|
m_fFogColor[1] = (float)((unsigned char) (((unsigned short) (rgb)) >> 8))/255;
|
||||||
m_fFogColor[2] = (float)((unsigned char) ((rgb) >> 16))/255;
|
m_fFogColor[2] = (float)((unsigned char) ((rgb) >> 16))/255;
|
||||||
m_fFogColor[3] = 1.0f;
|
m_fFogColor[3] = 1.0f;
|
||||||
m_nGridSize = (unsigned short)lcGetProfileInt(LC_PROFILE_GRID_SIZE);
|
mGridStuds = lcGetProfileInt(LC_PROFILE_GRID_STUDS);
|
||||||
|
mGridStudColor = lcGetProfileInt(LC_PROFILE_GRID_STUD_COLOR);
|
||||||
|
mGridLines = lcGetProfileInt(LC_PROFILE_GRID_LINES);
|
||||||
|
mGridLineSpacing = lcGetProfileInt(LC_PROFILE_GRID_LINE_SPACING);
|
||||||
|
mGridLineColor = lcGetProfileInt(LC_PROFILE_GRID_LINE_COLOR);
|
||||||
rgb = lcGetProfileInt(LC_PROFILE_DEFAULT_AMBIENT_COLOR);
|
rgb = lcGetProfileInt(LC_PROFILE_DEFAULT_AMBIENT_COLOR);
|
||||||
m_fAmbient[0] = (float)((unsigned char) (rgb))/255;
|
m_fAmbient[0] = (float)((unsigned char) (rgb))/255;
|
||||||
m_fAmbient[1] = (float)((unsigned char) (((unsigned short) (rgb)) >> 8))/255;
|
m_fAmbient[1] = (float)((unsigned char) (((unsigned short) (rgb)) >> 8))/255;
|
||||||
|
@ -646,7 +651,7 @@ bool Project::FileLoad(lcFile* file, bool bUndo, bool bMerge)
|
||||||
file->ReadU8(&m_nFPS, 1);
|
file->ReadU8(&m_nFPS, 1);
|
||||||
file->ReadS32(&i, 1); m_nCurFrame = i;
|
file->ReadS32(&i, 1); m_nCurFrame = i;
|
||||||
file->ReadU16(&m_nTotalFrames, 1);
|
file->ReadU16(&m_nTotalFrames, 1);
|
||||||
file->ReadS32(&i, 1); m_nGridSize = i;
|
file->ReadS32(&i, 1); //m_nGridSize = i;
|
||||||
file->ReadS32(&i, 1); //m_nMoveSnap = i;
|
file->ReadS32(&i, 1); //m_nMoveSnap = i;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -656,7 +661,7 @@ bool Project::FileLoad(lcFile* file, bool bUndo, bool bMerge)
|
||||||
file->ReadU8(&m_nFPS, 1);
|
file->ReadU8(&m_nFPS, 1);
|
||||||
file->ReadU16(&m_nCurFrame, 1);
|
file->ReadU16(&m_nCurFrame, 1);
|
||||||
file->ReadU16(&m_nTotalFrames, 1);
|
file->ReadU16(&m_nTotalFrames, 1);
|
||||||
file->ReadU16(&m_nGridSize, 1);
|
file->ReadU16(&sh, 1); // m_nGridSize = sh;
|
||||||
file->ReadU16(&sh, 1);
|
file->ReadU16(&sh, 1);
|
||||||
if (fv >= 1.4f)
|
if (fv >= 1.4f)
|
||||||
m_nMoveSnap = sh;
|
m_nMoveSnap = sh;
|
||||||
|
@ -827,7 +832,7 @@ void Project::FileSave(lcFile* file, bool bUndo)
|
||||||
file->WriteU8 (&m_nFPS, 1);
|
file->WriteU8 (&m_nFPS, 1);
|
||||||
file->WriteU16(&m_nCurFrame, 1);
|
file->WriteU16(&m_nCurFrame, 1);
|
||||||
file->WriteU16(&m_nTotalFrames, 1);
|
file->WriteU16(&m_nTotalFrames, 1);
|
||||||
file->WriteU16(&m_nGridSize, 1);
|
file->WriteU16(0); // m_nGridSize
|
||||||
file->WriteU16(&m_nMoveSnap, 1);
|
file->WriteU16(&m_nMoveSnap, 1);
|
||||||
// 0.62 (1.1)
|
// 0.62 (1.1)
|
||||||
rgb = LC_FLOATRGB(m_fGradient1);
|
rgb = LC_FLOATRGB(m_fGradient1);
|
||||||
|
@ -1667,12 +1672,6 @@ void Project::RenderScenePieces(View* view)
|
||||||
float AspectRatio = (float)view->mWidth / (float)view->mHeight;
|
float AspectRatio = (float)view->mWidth / (float)view->mHeight;
|
||||||
view->mCamera->LoadProjection(AspectRatio);
|
view->mCamera->LoadProjection(AspectRatio);
|
||||||
|
|
||||||
if (m_nSnap & LC_DRAW_GRID)
|
|
||||||
{
|
|
||||||
glColor4f(1.0f - m_fBackground[0], 1.0f - m_fBackground[1], 1.0f - m_fBackground[2], 1.0f);
|
|
||||||
glCallList (m_nGridList);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m_nDetail & LC_DET_LIGHTING)
|
if (m_nDetail & LC_DET_LIGHTING)
|
||||||
{
|
{
|
||||||
glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT);
|
glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT);
|
||||||
|
@ -2064,6 +2063,104 @@ void Project::RenderSceneObjects(View* view)
|
||||||
if (pLight->IsVisible ())
|
if (pLight->IsVisible ())
|
||||||
pLight->Render(m_fLineWidth);
|
pLight->Render(m_fLineWidth);
|
||||||
|
|
||||||
|
if (mGridStuds || mGridLines)
|
||||||
|
{
|
||||||
|
float m_nGridSize = 20;
|
||||||
|
|
||||||
|
if (mGridLines)
|
||||||
|
{
|
||||||
|
float Left = -m_nGridSize*0.8f;
|
||||||
|
float Right = m_nGridSize*0.8f;
|
||||||
|
float Top = -m_nGridSize*0.8f;
|
||||||
|
float Bottom = m_nGridSize*0.8f;
|
||||||
|
float Z = 0;
|
||||||
|
float U = m_nGridSize * 2;
|
||||||
|
float V = m_nGridSize * 2;
|
||||||
|
|
||||||
|
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);
|
||||||
|
glEnable(GL_ALPHA_TEST);
|
||||||
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
|
glEnable(GL_BLEND);
|
||||||
|
|
||||||
|
glColor4fv(lcVector4FromColor(mGridStudColor));
|
||||||
|
|
||||||
|
glEnableClientState(GL_VERTEX_ARRAY);
|
||||||
|
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_VERTEX_ARRAY);
|
||||||
|
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||||
|
|
||||||
|
glDisable(GL_TEXTURE_2D);
|
||||||
|
glDisable(GL_BLEND);
|
||||||
|
glDisable(GL_ALPHA_TEST);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mGridLines)
|
||||||
|
{
|
||||||
|
glColor4fv(lcVector4FromColor(mGridLineColor));
|
||||||
|
|
||||||
|
glEnableClientState(GL_VERTEX_ARRAY);
|
||||||
|
int GridStep = 5;
|
||||||
|
int NumVerts = 2 * 2 * (2 * m_nGridSize / GridStep + 1);
|
||||||
|
float* Verts = (float*)malloc(NumVerts * sizeof(float[3]));
|
||||||
|
float x = m_nGridSize * 0.8f;
|
||||||
|
|
||||||
|
for (int Step = 0; Step < 2 * m_nGridSize / GridStep + 1; Step++)
|
||||||
|
{
|
||||||
|
Verts[Step * 12] = x;
|
||||||
|
Verts[Step * 12 + 1] = m_nGridSize * 0.8f;
|
||||||
|
Verts[Step * 12 + 2] = 0;
|
||||||
|
Verts[Step * 12 + 3] = x;
|
||||||
|
Verts[Step * 12 + 4] = -m_nGridSize * 0.8f;
|
||||||
|
Verts[Step * 12 + 5] = 0;
|
||||||
|
Verts[Step * 12 + 6] = m_nGridSize * 0.8f;
|
||||||
|
Verts[Step * 12 + 7] = x;
|
||||||
|
Verts[Step * 12 + 8] = 0;
|
||||||
|
Verts[Step * 12 + 9] = -m_nGridSize * 0.8f;
|
||||||
|
Verts[Step * 12 + 10] = x;
|
||||||
|
Verts[Step * 12 + 11] = 0;
|
||||||
|
x -= GridStep * 0.8f;
|
||||||
|
}
|
||||||
|
glVertexPointer(3, GL_FLOAT, 0, Verts);
|
||||||
|
glDrawArrays(GL_LINES, 0, NumVerts);
|
||||||
|
glDisableClientState(GL_VERTEX_ARRAY);
|
||||||
|
free(Verts);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Draw axis icon
|
// Draw axis icon
|
||||||
if (m_nSnap & LC_DRAW_AXIS)
|
if (m_nSnap & LC_DRAW_AXIS)
|
||||||
{
|
{
|
||||||
|
@ -2891,8 +2988,6 @@ void Project::RenderViewports(View* view)
|
||||||
// Initialize OpenGL
|
// Initialize OpenGL
|
||||||
void Project::RenderInitialize()
|
void Project::RenderInitialize()
|
||||||
{
|
{
|
||||||
int i;
|
|
||||||
|
|
||||||
glEnable(GL_POLYGON_OFFSET_FILL);
|
glEnable(GL_POLYGON_OFFSET_FILL);
|
||||||
glPolygonOffset(0.5f, 0.1f);
|
glPolygonOffset(0.5f, 0.1f);
|
||||||
|
|
||||||
|
@ -2916,35 +3011,86 @@ void Project::RenderInitialize()
|
||||||
// AfxMessageBox ("Could not load background");
|
// AfxMessageBox ("Could not load background");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Grid display list
|
if (!mGridTexture->mTexture)
|
||||||
if (m_nGridList == 0)
|
|
||||||
m_nGridList = glGenLists(1);
|
|
||||||
glNewList (m_nGridList, GL_COMPILE);
|
|
||||||
glEnableClientState(GL_VERTEX_ARRAY);
|
|
||||||
i = 2*(4*m_nGridSize+2); // verts needed (2*lines)
|
|
||||||
float *grid = (float*)malloc(i*sizeof(float[3]));
|
|
||||||
float x = m_nGridSize*0.8f;
|
|
||||||
|
|
||||||
for (int j = 0; j <= m_nGridSize*2; j++)
|
|
||||||
{
|
{
|
||||||
grid[j*12] = x;
|
const int NumLevels = 9;
|
||||||
grid[j*12+1] = m_nGridSize*0.8f;
|
Image GridImages[NumLevels];
|
||||||
grid[j*12+2] = 0;
|
|
||||||
grid[j*12+3] = x;
|
for (int ImageLevel = 0; ImageLevel < NumLevels; ImageLevel++)
|
||||||
grid[j*12+4] = -m_nGridSize*0.8f;
|
{
|
||||||
grid[j*12+5] = 0;
|
Image& GridImage = GridImages[ImageLevel];
|
||||||
grid[j*12+6] = m_nGridSize*0.8f;
|
|
||||||
grid[j*12+7] = x;
|
const int GridSize = 256 >> ImageLevel;
|
||||||
grid[j*12+8] = 0;
|
const float Radius1 = (80 >> ImageLevel) * (80 >> ImageLevel);
|
||||||
grid[j*12+9] = -m_nGridSize*0.8f;
|
const float Radius2 = (72 >> ImageLevel) * (72 >> ImageLevel);
|
||||||
grid[j*12+10] = x;
|
|
||||||
grid[j*12+11] = 0;
|
GridImage.Allocate(GridSize, GridSize, LC_PIXEL_FORMAT_A8);
|
||||||
x -= 0.8f;
|
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);
|
||||||
}
|
}
|
||||||
glVertexPointer(3, GL_FLOAT, 0, grid);
|
|
||||||
glDrawArrays(GL_LINES, 0, i);
|
|
||||||
glEndList();
|
|
||||||
free(grid);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -6201,7 +6347,11 @@ void Project::HandleCommand(LC_COMMANDS id)
|
||||||
Options.Snap = m_nSnap;
|
Options.Snap = m_nSnap;
|
||||||
Options.LineWidth = m_fLineWidth;
|
Options.LineWidth = m_fLineWidth;
|
||||||
Options.AASamples = CurrentAASamples;
|
Options.AASamples = CurrentAASamples;
|
||||||
Options.GridSize = m_nGridSize;
|
Options.GridStuds = mGridStuds;
|
||||||
|
Options.GridStudColor = mGridStudColor;
|
||||||
|
Options.GridLines = mGridLines;
|
||||||
|
Options.GridLineSpacing = mGridLineSpacing;
|
||||||
|
Options.GridLineColor = mGridLineColor;
|
||||||
|
|
||||||
Options.Categories = gCategories;
|
Options.Categories = gCategories;
|
||||||
Options.CategoriesModified = false;
|
Options.CategoriesModified = false;
|
||||||
|
@ -6221,7 +6371,11 @@ void Project::HandleCommand(LC_COMMANDS id)
|
||||||
m_nSnap = Options.Snap;
|
m_nSnap = Options.Snap;
|
||||||
m_nDetail = Options.Detail;
|
m_nDetail = Options.Detail;
|
||||||
m_fLineWidth = Options.LineWidth;
|
m_fLineWidth = Options.LineWidth;
|
||||||
m_nGridSize = Options.GridSize;
|
mGridStuds = Options.GridStuds;
|
||||||
|
mGridStudColor = Options.GridStudColor;
|
||||||
|
mGridLines = Options.GridLines;
|
||||||
|
mGridLineSpacing = Options.GridLineSpacing;
|
||||||
|
mGridLineColor = Options.GridLineColor;
|
||||||
|
|
||||||
lcSetProfileString(LC_PROFILE_DEFAULT_AUTHOR_NAME, Options.DefaultAuthor);
|
lcSetProfileString(LC_PROFILE_DEFAULT_AUTHOR_NAME, Options.DefaultAuthor);
|
||||||
lcSetProfileString(LC_PROFILE_PROJECTS_PATH, Options.ProjectsPath);
|
lcSetProfileString(LC_PROFILE_PROJECTS_PATH, Options.ProjectsPath);
|
||||||
|
@ -6232,7 +6386,11 @@ void Project::HandleCommand(LC_COMMANDS id)
|
||||||
lcSetProfileInt(LC_PROFILE_CHECK_UPDATES, Options.CheckForUpdates);
|
lcSetProfileInt(LC_PROFILE_CHECK_UPDATES, Options.CheckForUpdates);
|
||||||
lcSetProfileInt(LC_PROFILE_SNAP, Options.Snap);
|
lcSetProfileInt(LC_PROFILE_SNAP, Options.Snap);
|
||||||
lcSetProfileInt(LC_PROFILE_DETAIL, Options.Detail);
|
lcSetProfileInt(LC_PROFILE_DETAIL, Options.Detail);
|
||||||
lcSetProfileInt(LC_PROFILE_GRID_SIZE, Options.GridSize);
|
lcSetProfileInt(LC_PROFILE_GRID_STUDS, Options.GridStuds);
|
||||||
|
lcSetProfileInt(LC_PROFILE_GRID_STUD_COLOR, Options.GridStudColor);
|
||||||
|
lcSetProfileInt(LC_PROFILE_GRID_LINES, Options.GridLines);
|
||||||
|
lcSetProfileInt(LC_PROFILE_GRID_LINE_SPACING, Options.GridLineSpacing);
|
||||||
|
lcSetProfileInt(LC_PROFILE_GRID_LINE_COLOR, Options.GridLineColor);
|
||||||
lcSetProfileFloat(LC_PROFILE_LINE_WIDTH, Options.LineWidth);
|
lcSetProfileFloat(LC_PROFILE_LINE_WIDTH, Options.LineWidth);
|
||||||
lcSetProfileInt(LC_PROFILE_ANTIALIASING_SAMPLES, Options.AASamples);
|
lcSetProfileInt(LC_PROFILE_ANTIALIASING_SAMPLES, Options.AASamples);
|
||||||
|
|
||||||
|
@ -6276,7 +6434,7 @@ void Project::HandleCommand(LC_COMMANDS id)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
for (int i = 0; i < m_ViewList.GetSize (); i++)
|
for (int i = 0; i < m_ViewList.GetSize (); i++)
|
||||||
{
|
{
|
||||||
m_ViewList[i]->MakeCurrent();
|
m_ViewList[i]->MakeCurrent();
|
||||||
RenderInitialize(); // TODO: get rid of RenderInitialize(), most of it can be done once per frame
|
RenderInitialize(); // TODO: get rid of RenderInitialize(), most of it can be done once per frame
|
||||||
}
|
}
|
||||||
|
@ -6633,6 +6791,14 @@ void Project::HandleCommand(LC_COMMANDS id)
|
||||||
Info += GL_HasVertexBufferObject() ? "supported" : "not supported";
|
Info += GL_HasVertexBufferObject() ? "supported" : "not supported";
|
||||||
Info += "\nGL_ARB_framebuffer_object extension: ";
|
Info += "\nGL_ARB_framebuffer_object extension: ";
|
||||||
Info += GL_HasFramebufferObject() ? "supported" : "not supported";
|
Info += GL_HasFramebufferObject() ? "supported" : "not supported";
|
||||||
|
Info += "\nGL_EXT_texture_filter_anisotropic extension: ";
|
||||||
|
if (GL_SupportsAnisotropic)
|
||||||
|
{
|
||||||
|
sprintf(Text, "supported (max %d)", (int)GL_MaxAnisotropy);
|
||||||
|
Info += Text;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
Info += "not supported";
|
||||||
|
|
||||||
gMainWindow->DoDialog(LC_DIALOG_ABOUT, (char*)Info);
|
gMainWindow->DoDialog(LC_DIALOG_ABOUT, (char*)Info);
|
||||||
} break;
|
} break;
|
||||||
|
@ -7213,7 +7379,7 @@ void Project::GetPieceInsertPosition(View* view, int MouseX, int MouseY, lcVecto
|
||||||
lcUnprojectPoints(ClickPoints, 2, ModelView, Projection, Viewport);
|
lcUnprojectPoints(ClickPoints, 2, ModelView, Projection, Viewport);
|
||||||
|
|
||||||
lcVector3 Intersection;
|
lcVector3 Intersection;
|
||||||
if (lcLinePlaneIntersection(&Intersection, ClickPoints[0], ClickPoints[1], lcVector4(0, 0, 1, 0)))
|
if (lcLinePlaneIntersection(&Intersection, ClickPoints[0], ClickPoints[1], lcVector4(0, 0, 1, m_pCurPiece->m_fDimensions[5])))
|
||||||
{
|
{
|
||||||
SnapVector(Intersection);
|
SnapVector(Intersection);
|
||||||
Position = Intersection;
|
Position = Intersection;
|
||||||
|
|
|
@ -411,12 +411,17 @@ protected:
|
||||||
lcuint16 m_nCurFrame;
|
lcuint16 m_nCurFrame;
|
||||||
lcuint16 m_nTotalFrames;
|
lcuint16 m_nTotalFrames;
|
||||||
|
|
||||||
|
bool mGridStuds;
|
||||||
|
lcuint32 mGridStudColor;
|
||||||
|
bool mGridLines;
|
||||||
|
int mGridLineSpacing;
|
||||||
|
lcuint32 mGridLineColor;
|
||||||
|
|
||||||
lcuint32 m_nScene;
|
lcuint32 m_nScene;
|
||||||
lcuint32 m_nDetail;
|
lcuint32 m_nDetail;
|
||||||
lcuint32 m_nSnap;
|
lcuint32 m_nSnap;
|
||||||
lcuint16 m_nMoveSnap;
|
lcuint16 m_nMoveSnap;
|
||||||
lcuint16 m_nAngleSnap;
|
lcuint16 m_nAngleSnap;
|
||||||
lcuint16 m_nGridSize;
|
|
||||||
float m_fLineWidth;
|
float m_fLineWidth;
|
||||||
float m_fFogDensity;
|
float m_fFogDensity;
|
||||||
float m_fFogColor[4];
|
float m_fFogColor[4];
|
||||||
|
@ -427,11 +432,11 @@ protected:
|
||||||
char m_strFooter[256];
|
char m_strFooter[256];
|
||||||
char m_strHeader[256];
|
char m_strHeader[256];
|
||||||
|
|
||||||
GLuint m_nGridList;
|
|
||||||
unsigned long m_nAutosave;
|
unsigned long m_nAutosave;
|
||||||
unsigned long m_nSaveTimer;
|
unsigned long m_nSaveTimer;
|
||||||
char m_strBackground[LC_MAXPATH];
|
char m_strBackground[LC_MAXPATH];
|
||||||
lcTexture* m_pBackground;
|
lcTexture* m_pBackground;
|
||||||
|
lcTexture* mGridTexture;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// File load/save implementation.
|
// File load/save implementation.
|
||||||
|
|
|
@ -211,4 +211,6 @@ void TexFont::PrintText(float Left, float Top, float Z, const char* Text) const
|
||||||
|
|
||||||
glDisableClientState(GL_VERTEX_ARRAY);
|
glDisableClientState(GL_VERTEX_ARRAY);
|
||||||
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
|
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||||
|
|
||||||
|
delete[] Verts;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,34 +1,37 @@
|
||||||
#include "lc_global.h"
|
#include "lc_global.h"
|
||||||
#include "image.h"
|
#include "image.h"
|
||||||
#include "lc_file.h"
|
#include "lc_file.h"
|
||||||
|
#include "system.h"
|
||||||
|
|
||||||
static void copyToQImage(const Image& src, QImage& dest, bool transparent)
|
static void copyToQImage(const Image& src, QImage& dest, bool transparent)
|
||||||
{
|
{
|
||||||
dest = QImage(src.mWidth, src.mWidth, src.mAlpha ? QImage::Format_ARGB32 : QImage::Format_RGB32);
|
bool alpha = src.HasAlpha();
|
||||||
|
dest = QImage(src.mWidth, src.mHeight, alpha ? QImage::Format_ARGB32 : QImage::Format_RGB32);
|
||||||
|
|
||||||
lcuint8* bytes = (lcuint8*)src.mData;
|
lcuint8* bytes = (lcuint8*)src.mData;
|
||||||
|
int bpp = src.GetBPP();
|
||||||
|
|
||||||
if (transparent && src.mAlpha)
|
LC_ASSERT(src.mFormat == LC_PIXEL_FORMAT_R8G8B8 || src.mFormat == LC_PIXEL_FORMAT_R8G8B8A8);
|
||||||
|
|
||||||
|
if (transparent && alpha)
|
||||||
{
|
{
|
||||||
for (int y = 0; y < src.mHeight; y++)
|
for (int y = 0; y < src.mHeight; y++)
|
||||||
{
|
{
|
||||||
for (int x = 0; x < src.mWidth; x++)
|
for (int x = 0; x < src.mWidth; x++)
|
||||||
{
|
{
|
||||||
dest.setPixel(x, y, qRgba(bytes[0], bytes[1], bytes[2], bytes[3]));
|
dest.setPixel(x, y, qRgba(bytes[0], bytes[1], bytes[2], bytes[3]));
|
||||||
bytes += 4;
|
bytes += bpp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
int pixelSize = src.mAlpha ? 4 : 3;
|
|
||||||
|
|
||||||
for (int y = 0; y < src.mHeight; y++)
|
for (int y = 0; y < src.mHeight; y++)
|
||||||
{
|
{
|
||||||
for (int x = 0; x < src.mWidth; x++)
|
for (int x = 0; x < src.mWidth; x++)
|
||||||
{
|
{
|
||||||
dest.setPixel(x, y, qRgb(bytes[0], bytes[1], bytes[2]));
|
dest.setPixel(x, y, qRgb(bytes[0], bytes[1], bytes[2]));
|
||||||
bytes += pixelSize;
|
bytes += bpp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -36,7 +39,8 @@ static void copyToQImage(const Image& src, QImage& dest, bool transparent)
|
||||||
|
|
||||||
static void copyFromQImage(const QImage& src, Image& dest)
|
static void copyFromQImage(const QImage& src, Image& dest)
|
||||||
{
|
{
|
||||||
dest.Allocate(src.width(), src.height(), src.hasAlphaChannel());
|
bool alpha = src.hasAlphaChannel();
|
||||||
|
dest.Allocate(src.width(), src.height(), alpha ? LC_PIXEL_FORMAT_R8G8B8A8 : LC_PIXEL_FORMAT_R8G8B8);
|
||||||
|
|
||||||
lcuint8* bytes = (lcuint8*)dest.mData;
|
lcuint8* bytes = (lcuint8*)dest.mData;
|
||||||
|
|
||||||
|
@ -50,7 +54,7 @@ static void copyFromQImage(const QImage& src, Image& dest)
|
||||||
*bytes++ = qGreen(pixel);
|
*bytes++ = qGreen(pixel);
|
||||||
*bytes++ = qBlue(pixel);
|
*bytes++ = qBlue(pixel);
|
||||||
|
|
||||||
if (dest.mAlpha)
|
if (alpha)
|
||||||
*bytes++ = qAlpha(pixel);
|
*bytes++ = qAlpha(pixel);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,6 +15,8 @@ lcQPreferencesDialog::lcQPreferencesDialog(QWidget *parent, void *data) :
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
|
|
||||||
ui->lineWidth->setValidator(new QDoubleValidator());
|
ui->lineWidth->setValidator(new QDoubleValidator());
|
||||||
|
connect(ui->gridStudColor, SIGNAL(clicked()), this, SLOT(colorClicked()));
|
||||||
|
connect(ui->gridLineColor, SIGNAL(clicked()), this, SLOT(colorClicked()));
|
||||||
connect(ui->categoriesTree, SIGNAL(itemSelectionChanged()), this, SLOT(updateParts()));
|
connect(ui->categoriesTree, SIGNAL(itemSelectionChanged()), this, SLOT(updateParts()));
|
||||||
ui->shortcutEdit->installEventFilter(this);
|
ui->shortcutEdit->installEventFilter(this);
|
||||||
connect(ui->commandList, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)), this, SLOT(commandChanged(QTreeWidgetItem*)));
|
connect(ui->commandList, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)), this, SLOT(commandChanged(QTreeWidgetItem*)));
|
||||||
|
@ -41,15 +43,25 @@ lcQPreferencesDialog::lcQPreferencesDialog(QWidget *parent, void *data) :
|
||||||
ui->antiAliasingSamples->setCurrentIndex(0);
|
ui->antiAliasingSamples->setCurrentIndex(0);
|
||||||
ui->edgeLines->setChecked((options->Detail & LC_DET_BRICKEDGES) != 0);
|
ui->edgeLines->setChecked((options->Detail & LC_DET_BRICKEDGES) != 0);
|
||||||
ui->lineWidth->setText(QString::number(options->LineWidth));
|
ui->lineWidth->setText(QString::number(options->LineWidth));
|
||||||
ui->baseGrid->setChecked((options->Snap & LC_DRAW_GRID) != 0);
|
ui->gridStuds->setChecked(options->GridStuds);
|
||||||
ui->gridUnits->setText(QString::number(options->GridSize));
|
ui->gridLines->setChecked(options->GridLines);
|
||||||
|
ui->gridLineSpacing->setText(QString::number(options->GridLineSpacing));
|
||||||
ui->axisIcon->setChecked((options->Snap & LC_DRAW_AXIS) != 0);
|
ui->axisIcon->setChecked((options->Snap & LC_DRAW_AXIS) != 0);
|
||||||
ui->enableLighting->setChecked((options->Detail & LC_DET_LIGHTING) != 0);
|
ui->enableLighting->setChecked((options->Detail & LC_DET_LIGHTING) != 0);
|
||||||
ui->fastRendering->setChecked((options->Detail & LC_DET_FAST) != 0);
|
ui->fastRendering->setChecked((options->Detail & LC_DET_FAST) != 0);
|
||||||
|
|
||||||
|
QPixmap pix(12, 12);
|
||||||
|
|
||||||
|
pix.fill(QColor(LC_RGBA_RED(options->GridStudColor), LC_RGBA_GREEN(options->GridStudColor), LC_RGBA_BLUE(options->GridStudColor)));
|
||||||
|
ui->gridStudColor->setIcon(pix);
|
||||||
|
|
||||||
|
pix.fill(QColor(LC_RGBA_RED(options->GridLineColor), LC_RGBA_GREEN(options->GridLineColor), LC_RGBA_BLUE(options->GridLineColor)));
|
||||||
|
ui->gridLineColor->setIcon(pix);
|
||||||
|
|
||||||
on_antiAliasing_toggled();
|
on_antiAliasing_toggled();
|
||||||
on_edgeLines_toggled();
|
on_edgeLines_toggled();
|
||||||
on_baseGrid_toggled();
|
on_gridStuds_toggled();
|
||||||
|
on_gridLines_toggled();
|
||||||
|
|
||||||
updateCategories();
|
updateCategories();
|
||||||
ui->categoriesTree->setCurrentItem(ui->categoriesTree->topLevelItem(0));
|
ui->categoriesTree->setCurrentItem(ui->categoriesTree->topLevelItem(0));
|
||||||
|
@ -102,11 +114,9 @@ void lcQPreferencesDialog::accept()
|
||||||
options->LineWidth = ui->lineWidth->text().toFloat();
|
options->LineWidth = ui->lineWidth->text().toFloat();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ui->baseGrid->isChecked())
|
options->GridStuds = ui->gridStuds->isChecked();
|
||||||
{
|
options->GridLines = ui->gridLines->isChecked();
|
||||||
options->Snap |= LC_DRAW_GRID;
|
options->GridLineSpacing = ui->gridLineSpacing->text().toInt();
|
||||||
options->GridSize = ui->gridUnits->text().toInt();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ui->axisIcon->isChecked())
|
if (ui->axisIcon->isChecked())
|
||||||
options->Snap |= LC_DRAW_AXIS;
|
options->Snap |= LC_DRAW_AXIS;
|
||||||
|
@ -158,6 +168,40 @@ void lcQPreferencesDialog::on_lgeoPathBrowse_clicked()
|
||||||
ui->lgeoPathBrowse->setText(QDir::toNativeSeparators(result));
|
ui->lgeoPathBrowse->setText(QDir::toNativeSeparators(result));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void lcQPreferencesDialog::colorClicked()
|
||||||
|
{
|
||||||
|
QObject *button = sender();
|
||||||
|
QString title;
|
||||||
|
lcuint32 *color = NULL;
|
||||||
|
QColorDialog::ColorDialogOptions dialogOptions;
|
||||||
|
|
||||||
|
if (button == ui->gridStudColor)
|
||||||
|
{
|
||||||
|
color = &options->GridStudColor;
|
||||||
|
title = tr("Select Grid Stud Color");
|
||||||
|
dialogOptions = QColorDialog::ShowAlphaChannel;
|
||||||
|
}
|
||||||
|
else if (button == ui->gridLineColor)
|
||||||
|
{
|
||||||
|
color = &options->GridLineColor;
|
||||||
|
title = tr("Select Grid Line Color");
|
||||||
|
dialogOptions = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
QColor oldColor = QColor(LC_RGBA_RED(*color), LC_RGBA_GREEN(*color), LC_RGBA_BLUE(*color), LC_RGBA_ALPHA(*color));
|
||||||
|
QColor newColor = QColorDialog::getColor(oldColor, this, title, dialogOptions);
|
||||||
|
|
||||||
|
if (newColor == oldColor || !newColor.isValid())
|
||||||
|
return;
|
||||||
|
|
||||||
|
*color = LC_RGBA(newColor.red(), newColor.green(), newColor.blue(), newColor.alpha());
|
||||||
|
|
||||||
|
QPixmap pix(12, 12);
|
||||||
|
|
||||||
|
pix.fill(newColor);
|
||||||
|
((QToolButton*)button)->setIcon(pix);
|
||||||
|
}
|
||||||
|
|
||||||
void lcQPreferencesDialog::on_antiAliasing_toggled()
|
void lcQPreferencesDialog::on_antiAliasing_toggled()
|
||||||
{
|
{
|
||||||
ui->antiAliasingSamples->setEnabled(ui->antiAliasing->isChecked());
|
ui->antiAliasingSamples->setEnabled(ui->antiAliasing->isChecked());
|
||||||
|
@ -168,9 +212,14 @@ void lcQPreferencesDialog::on_edgeLines_toggled()
|
||||||
ui->lineWidth->setEnabled(ui->edgeLines->isChecked());
|
ui->lineWidth->setEnabled(ui->edgeLines->isChecked());
|
||||||
}
|
}
|
||||||
|
|
||||||
void lcQPreferencesDialog::on_baseGrid_toggled()
|
void lcQPreferencesDialog::on_gridStuds_toggled()
|
||||||
{
|
{
|
||||||
ui->gridUnits->setEnabled(ui->baseGrid->isChecked());
|
ui->gridStudColor->setEnabled(ui->gridStuds->isChecked());
|
||||||
|
}
|
||||||
|
|
||||||
|
void lcQPreferencesDialog::on_gridLines_toggled()
|
||||||
|
{
|
||||||
|
ui->gridLineColor->setEnabled(ui->gridLines->isChecked());
|
||||||
}
|
}
|
||||||
|
|
||||||
void lcQPreferencesDialog::updateCategories()
|
void lcQPreferencesDialog::updateCategories()
|
||||||
|
|
|
@ -31,9 +31,11 @@ public slots:
|
||||||
void on_partsLibraryBrowse_clicked();
|
void on_partsLibraryBrowse_clicked();
|
||||||
void on_povrayExecutableBrowse_clicked();
|
void on_povrayExecutableBrowse_clicked();
|
||||||
void on_lgeoPathBrowse_clicked();
|
void on_lgeoPathBrowse_clicked();
|
||||||
|
void colorClicked();
|
||||||
void on_antiAliasing_toggled();
|
void on_antiAliasing_toggled();
|
||||||
void on_edgeLines_toggled();
|
void on_edgeLines_toggled();
|
||||||
void on_baseGrid_toggled();
|
void on_gridStuds_toggled();
|
||||||
|
void on_gridLines_toggled();
|
||||||
void updateParts();
|
void updateParts();
|
||||||
void on_newCategory_clicked();
|
void on_newCategory_clicked();
|
||||||
void on_editCategory_clicked();
|
void on_editCategory_clicked();
|
||||||
|
|
|
@ -218,29 +218,165 @@
|
||||||
<attribute name="title">
|
<attribute name="title">
|
||||||
<string>Rendering</string>
|
<string>Rendering</string>
|
||||||
</attribute>
|
</attribute>
|
||||||
<layout class="QGridLayout" name="gridLayout">
|
<layout class="QVBoxLayout" name="verticalLayout_8">
|
||||||
<item row="2" column="0">
|
<item>
|
||||||
<widget class="QCheckBox" name="baseGrid">
|
<widget class="QWidget" name="widget" native="true">
|
||||||
<property name="text">
|
<layout class="QGridLayout" name="gridLayout">
|
||||||
<string>Base grid</string>
|
<item row="4" column="0">
|
||||||
</property>
|
<widget class="QCheckBox" name="fastRendering">
|
||||||
|
<property name="text">
|
||||||
|
<string>Fast rendering</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="1">
|
||||||
|
<widget class="QLineEdit" name="lineWidth">
|
||||||
|
<property name="maximumSize">
|
||||||
|
<size>
|
||||||
|
<width>75</width>
|
||||||
|
<height>16777215</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QCheckBox" name="edgeLines">
|
||||||
|
<property name="text">
|
||||||
|
<string>Edge lines</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0">
|
||||||
|
<widget class="QCheckBox" name="axisIcon">
|
||||||
|
<property name="text">
|
||||||
|
<string>Axis icon</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="2">
|
||||||
|
<widget class="QLabel" name="label_2">
|
||||||
|
<property name="text">
|
||||||
|
<string>width</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QCheckBox" name="antiAliasing">
|
||||||
|
<property name="text">
|
||||||
|
<string>Anti-aliasing</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="0">
|
||||||
|
<widget class="QCheckBox" name="enableLighting">
|
||||||
|
<property name="text">
|
||||||
|
<string>Enable lighting</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1">
|
||||||
|
<widget class="QComboBox" name="antiAliasingSamples">
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>2x</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>4x</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>8x</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="3">
|
||||||
|
<spacer name="horizontalSpacer_2">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="0" column="0">
|
<item>
|
||||||
<widget class="QCheckBox" name="antiAliasing">
|
<widget class="QGroupBox" name="groupBox_4">
|
||||||
<property name="text">
|
<property name="title">
|
||||||
<string>Anti-aliasing</string>
|
<string>Base Grid</string>
|
||||||
</property>
|
</property>
|
||||||
|
<layout class="QGridLayout" name="gridLayout_2">
|
||||||
|
<item row="1" column="3">
|
||||||
|
<widget class="QToolButton" name="gridLineColor">
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="1">
|
||||||
|
<widget class="QLineEdit" name="gridLineSpacing">
|
||||||
|
<property name="maximumSize">
|
||||||
|
<size>
|
||||||
|
<width>75</width>
|
||||||
|
<height>16777215</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="4">
|
||||||
|
<spacer name="horizontalSpacer_5">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QCheckBox" name="gridStuds">
|
||||||
|
<property name="text">
|
||||||
|
<string>Draw studs</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="2">
|
||||||
|
<widget class="QLabel" name="label">
|
||||||
|
<property name="text">
|
||||||
|
<string>studs</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QCheckBox" name="gridLines">
|
||||||
|
<property name="text">
|
||||||
|
<string>Draw lines every</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1">
|
||||||
|
<widget class="QToolButton" name="gridStudColor">
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="0">
|
<item>
|
||||||
<widget class="QCheckBox" name="edgeLines">
|
|
||||||
<property name="text">
|
|
||||||
<string>Edge lines</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="8" column="0">
|
|
||||||
<spacer name="verticalSpacer">
|
<spacer name="verticalSpacer">
|
||||||
<property name="orientation">
|
<property name="orientation">
|
||||||
<enum>Qt::Vertical</enum>
|
<enum>Qt::Vertical</enum>
|
||||||
|
@ -253,93 +389,6 @@
|
||||||
</property>
|
</property>
|
||||||
</spacer>
|
</spacer>
|
||||||
</item>
|
</item>
|
||||||
<item row="5" column="0">
|
|
||||||
<widget class="QCheckBox" name="fastRendering">
|
|
||||||
<property name="text">
|
|
||||||
<string>Fast rendering</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="4" column="0">
|
|
||||||
<widget class="QCheckBox" name="enableLighting">
|
|
||||||
<property name="text">
|
|
||||||
<string>Enable lighting</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="1">
|
|
||||||
<widget class="QLineEdit" name="lineWidth">
|
|
||||||
<property name="maximumSize">
|
|
||||||
<size>
|
|
||||||
<width>75</width>
|
|
||||||
<height>16777215</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="0" column="1">
|
|
||||||
<widget class="QComboBox" name="antiAliasingSamples">
|
|
||||||
<item>
|
|
||||||
<property name="text">
|
|
||||||
<string>2x</string>
|
|
||||||
</property>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<property name="text">
|
|
||||||
<string>4x</string>
|
|
||||||
</property>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<property name="text">
|
|
||||||
<string>8x</string>
|
|
||||||
</property>
|
|
||||||
</item>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="3" column="0">
|
|
||||||
<widget class="QCheckBox" name="axisIcon">
|
|
||||||
<property name="text">
|
|
||||||
<string>Axis icon</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="1">
|
|
||||||
<widget class="QLineEdit" name="gridUnits">
|
|
||||||
<property name="maximumSize">
|
|
||||||
<size>
|
|
||||||
<width>75</width>
|
|
||||||
<height>16777215</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="2">
|
|
||||||
<widget class="QLabel" name="label">
|
|
||||||
<property name="text">
|
|
||||||
<string>units</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="2">
|
|
||||||
<widget class="QLabel" name="label_2">
|
|
||||||
<property name="text">
|
|
||||||
<string>width</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="0" column="3">
|
|
||||||
<spacer name="horizontalSpacer_2">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Horizontal</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>40</width>
|
|
||||||
<height>20</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QWidget" name="tabCategories">
|
<widget class="QWidget" name="tabCategories">
|
||||||
|
@ -689,11 +738,14 @@
|
||||||
<tabstop>antiAliasingSamples</tabstop>
|
<tabstop>antiAliasingSamples</tabstop>
|
||||||
<tabstop>edgeLines</tabstop>
|
<tabstop>edgeLines</tabstop>
|
||||||
<tabstop>lineWidth</tabstop>
|
<tabstop>lineWidth</tabstop>
|
||||||
<tabstop>baseGrid</tabstop>
|
|
||||||
<tabstop>gridUnits</tabstop>
|
|
||||||
<tabstop>axisIcon</tabstop>
|
<tabstop>axisIcon</tabstop>
|
||||||
<tabstop>enableLighting</tabstop>
|
<tabstop>enableLighting</tabstop>
|
||||||
<tabstop>fastRendering</tabstop>
|
<tabstop>fastRendering</tabstop>
|
||||||
|
<tabstop>gridStuds</tabstop>
|
||||||
|
<tabstop>gridStudColor</tabstop>
|
||||||
|
<tabstop>gridLines</tabstop>
|
||||||
|
<tabstop>gridLineSpacing</tabstop>
|
||||||
|
<tabstop>gridLineColor</tabstop>
|
||||||
<tabstop>categoriesTree</tabstop>
|
<tabstop>categoriesTree</tabstop>
|
||||||
<tabstop>partsTree</tabstop>
|
<tabstop>partsTree</tabstop>
|
||||||
<tabstop>importCategories</tabstop>
|
<tabstop>importCategories</tabstop>
|
||||||
|
|
Loading…
Add table
Reference in a new issue