Fixed line endings.
This commit is contained in:
+22
-22
@@ -1,22 +1,22 @@
|
||||
*.suo
|
||||
*.sln
|
||||
*.vcxproj
|
||||
*.filters
|
||||
*.user
|
||||
*.pdb
|
||||
*.db
|
||||
*.psess
|
||||
*.opendb
|
||||
*.opensdf
|
||||
*.sdf
|
||||
*.suo
|
||||
*.vspx
|
||||
*.xcodeproj
|
||||
build
|
||||
debug
|
||||
release
|
||||
ipch
|
||||
Makefile
|
||||
library.bin
|
||||
leocad_plugin_import.cpp
|
||||
*.qm
|
||||
*.suo
|
||||
*.sln
|
||||
*.vcxproj
|
||||
*.filters
|
||||
*.user
|
||||
*.pdb
|
||||
*.db
|
||||
*.psess
|
||||
*.opendb
|
||||
*.opensdf
|
||||
*.sdf
|
||||
*.suo
|
||||
*.vspx
|
||||
*.xcodeproj
|
||||
build
|
||||
debug
|
||||
release
|
||||
ipch
|
||||
Makefile
|
||||
library.bin
|
||||
leocad_plugin_import.cpp
|
||||
*.qm
|
||||
|
||||
+251
-251
@@ -1,251 +1,251 @@
|
||||
#ifndef _LC_ARRAY_H_
|
||||
#define _LC_ARRAY_H_
|
||||
|
||||
template <class T>
|
||||
class lcArray
|
||||
{
|
||||
public:
|
||||
typedef int (*lcArrayCompareFunc)(const T& a, const T& b);
|
||||
|
||||
lcArray(int Size = 0, int Grow = 16)
|
||||
{
|
||||
mData = NULL;
|
||||
mLength = 0;
|
||||
mAlloc = 0;
|
||||
mGrow = Grow;
|
||||
|
||||
if (Size != 0)
|
||||
AllocGrow(Size);
|
||||
}
|
||||
|
||||
lcArray(const lcArray<T>& Array)
|
||||
{
|
||||
mData = NULL;
|
||||
*this = Array;
|
||||
}
|
||||
|
||||
~lcArray()
|
||||
{
|
||||
delete[] mData;
|
||||
}
|
||||
|
||||
lcArray<T>& operator=(const lcArray<T>& Array)
|
||||
{
|
||||
mLength = Array.mLength;
|
||||
mAlloc = Array.mAlloc;
|
||||
mGrow = Array.mGrow;
|
||||
|
||||
delete[] mData;
|
||||
mData = new T[mAlloc];
|
||||
|
||||
for (int i = 0; i < mLength; i++)
|
||||
mData[i] = Array.mData[i];
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
lcArray<T>& operator+=(const lcArray<T>& Array)
|
||||
{
|
||||
AllocGrow(Array.mLength);
|
||||
|
||||
for (int i = 0; i < Array.mLength; i++)
|
||||
mData[mLength + i] = Array.mData[i];
|
||||
|
||||
mLength += Array.mLength;
|
||||
return *this;
|
||||
}
|
||||
|
||||
const T& operator[](int Index) const
|
||||
{
|
||||
return mData[Index];
|
||||
}
|
||||
|
||||
T& operator[](int Index)
|
||||
{
|
||||
return mData[Index];
|
||||
}
|
||||
|
||||
bool operator==(const lcArray<T>& Array) const
|
||||
{
|
||||
if (mLength != Array.mLength)
|
||||
return false;
|
||||
|
||||
for (int i = 0; i < mLength; i++)
|
||||
if (mData[i] != Array.mData[i])
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool IsEmpty() const
|
||||
{
|
||||
return mLength == 0;
|
||||
}
|
||||
|
||||
int GetSize() const
|
||||
{
|
||||
return mLength;
|
||||
}
|
||||
|
||||
void SetSize(int NewSize)
|
||||
{
|
||||
if (NewSize > mAlloc)
|
||||
AllocGrow(NewSize - mLength);
|
||||
|
||||
mLength = NewSize;
|
||||
}
|
||||
|
||||
void SetGrow(int Grow)
|
||||
{
|
||||
if (Grow)
|
||||
mGrow = Grow;
|
||||
}
|
||||
|
||||
void AllocGrow(int Grow)
|
||||
{
|
||||
if ((mLength + Grow) > mAlloc)
|
||||
{
|
||||
int NewSize = ((mLength + Grow + mGrow - 1) / mGrow) * mGrow;
|
||||
T* NewData = new T[NewSize];
|
||||
|
||||
for (int i = 0; i < mLength; i++)
|
||||
NewData[i] = mData[i];
|
||||
|
||||
delete[] mData;
|
||||
mData = NewData;
|
||||
mAlloc = NewSize;
|
||||
}
|
||||
}
|
||||
|
||||
void Add(const T& NewItem)
|
||||
{
|
||||
AllocGrow(1);
|
||||
mData[mLength++] = NewItem;
|
||||
}
|
||||
|
||||
T& Add()
|
||||
{
|
||||
AllocGrow(1);
|
||||
return mData[mLength++];
|
||||
}
|
||||
|
||||
void AddSorted(const T& Obj, lcArrayCompareFunc CompareFunc)
|
||||
{
|
||||
for (int i = 0; i < mLength; i++)
|
||||
{
|
||||
if (CompareFunc(Obj, mData[i]) < 0)
|
||||
{
|
||||
InsertAt(i, Obj);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
Add(Obj);
|
||||
}
|
||||
|
||||
T& InsertAt(int Index)
|
||||
{
|
||||
if (Index >= mLength)
|
||||
AllocGrow(Index - mLength + 1);
|
||||
else
|
||||
AllocGrow(1);
|
||||
|
||||
mLength++;
|
||||
for (int i = mLength - 1; i > Index; i--)
|
||||
mData[i] = mData[i - 1];
|
||||
|
||||
return mData[Index];
|
||||
}
|
||||
|
||||
void InsertAt(int Index, const T& NewItem)
|
||||
{
|
||||
if (Index >= mLength)
|
||||
AllocGrow(Index - mLength + 1);
|
||||
else
|
||||
AllocGrow(1);
|
||||
|
||||
mLength++;
|
||||
for (int i = mLength - 1; i > Index; i--)
|
||||
mData[i] = mData[i - 1];
|
||||
|
||||
mData[Index] = NewItem;
|
||||
}
|
||||
|
||||
void RemoveIndex(int Index)
|
||||
{
|
||||
mLength--;
|
||||
|
||||
for (int i = Index; i < mLength; i++)
|
||||
mData[i] = mData[i + 1];
|
||||
}
|
||||
|
||||
void Remove(const T& Item)
|
||||
{
|
||||
for (int i = 0; i < mLength; i++)
|
||||
{
|
||||
if (mData[i] == Item)
|
||||
{
|
||||
RemoveIndex(i);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void RemoveAll()
|
||||
{
|
||||
mLength = 0;
|
||||
}
|
||||
|
||||
void DeleteAll()
|
||||
{
|
||||
for (int i = 0; i < mLength; i++)
|
||||
delete mData[i];
|
||||
|
||||
mLength = 0;
|
||||
}
|
||||
|
||||
int FindIndex(const T& Item) const
|
||||
{
|
||||
for (int i = 0; i < mLength; i++)
|
||||
if (mData[i] == Item)
|
||||
return i;
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
void Sort(lcArrayCompareFunc CompareFunc)
|
||||
{
|
||||
if (mLength <= 1)
|
||||
return;
|
||||
|
||||
int i = 1;
|
||||
bool Flipped;
|
||||
|
||||
do
|
||||
{
|
||||
Flipped = false;
|
||||
|
||||
for (int j = mLength - 1; j >= i; --j)
|
||||
{
|
||||
T& a = mData[j];
|
||||
T& b = mData[j - 1];
|
||||
|
||||
if (CompareFunc(b, a) > 0)
|
||||
{
|
||||
T Tmp = b;
|
||||
mData[j - 1] = a;
|
||||
mData[j] = Tmp;
|
||||
Flipped = true;
|
||||
}
|
||||
}
|
||||
} while ((++i < mLength) && Flipped);
|
||||
}
|
||||
|
||||
protected:
|
||||
T* mData;
|
||||
int mLength;
|
||||
int mAlloc;
|
||||
int mGrow;
|
||||
};
|
||||
|
||||
#endif // _LC_ARRAY_H_
|
||||
#ifndef _LC_ARRAY_H_
|
||||
#define _LC_ARRAY_H_
|
||||
|
||||
template <class T>
|
||||
class lcArray
|
||||
{
|
||||
public:
|
||||
typedef int (*lcArrayCompareFunc)(const T& a, const T& b);
|
||||
|
||||
lcArray(int Size = 0, int Grow = 16)
|
||||
{
|
||||
mData = NULL;
|
||||
mLength = 0;
|
||||
mAlloc = 0;
|
||||
mGrow = Grow;
|
||||
|
||||
if (Size != 0)
|
||||
AllocGrow(Size);
|
||||
}
|
||||
|
||||
lcArray(const lcArray<T>& Array)
|
||||
{
|
||||
mData = NULL;
|
||||
*this = Array;
|
||||
}
|
||||
|
||||
~lcArray()
|
||||
{
|
||||
delete[] mData;
|
||||
}
|
||||
|
||||
lcArray<T>& operator=(const lcArray<T>& Array)
|
||||
{
|
||||
mLength = Array.mLength;
|
||||
mAlloc = Array.mAlloc;
|
||||
mGrow = Array.mGrow;
|
||||
|
||||
delete[] mData;
|
||||
mData = new T[mAlloc];
|
||||
|
||||
for (int i = 0; i < mLength; i++)
|
||||
mData[i] = Array.mData[i];
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
lcArray<T>& operator+=(const lcArray<T>& Array)
|
||||
{
|
||||
AllocGrow(Array.mLength);
|
||||
|
||||
for (int i = 0; i < Array.mLength; i++)
|
||||
mData[mLength + i] = Array.mData[i];
|
||||
|
||||
mLength += Array.mLength;
|
||||
return *this;
|
||||
}
|
||||
|
||||
const T& operator[](int Index) const
|
||||
{
|
||||
return mData[Index];
|
||||
}
|
||||
|
||||
T& operator[](int Index)
|
||||
{
|
||||
return mData[Index];
|
||||
}
|
||||
|
||||
bool operator==(const lcArray<T>& Array) const
|
||||
{
|
||||
if (mLength != Array.mLength)
|
||||
return false;
|
||||
|
||||
for (int i = 0; i < mLength; i++)
|
||||
if (mData[i] != Array.mData[i])
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool IsEmpty() const
|
||||
{
|
||||
return mLength == 0;
|
||||
}
|
||||
|
||||
int GetSize() const
|
||||
{
|
||||
return mLength;
|
||||
}
|
||||
|
||||
void SetSize(int NewSize)
|
||||
{
|
||||
if (NewSize > mAlloc)
|
||||
AllocGrow(NewSize - mLength);
|
||||
|
||||
mLength = NewSize;
|
||||
}
|
||||
|
||||
void SetGrow(int Grow)
|
||||
{
|
||||
if (Grow)
|
||||
mGrow = Grow;
|
||||
}
|
||||
|
||||
void AllocGrow(int Grow)
|
||||
{
|
||||
if ((mLength + Grow) > mAlloc)
|
||||
{
|
||||
int NewSize = ((mLength + Grow + mGrow - 1) / mGrow) * mGrow;
|
||||
T* NewData = new T[NewSize];
|
||||
|
||||
for (int i = 0; i < mLength; i++)
|
||||
NewData[i] = mData[i];
|
||||
|
||||
delete[] mData;
|
||||
mData = NewData;
|
||||
mAlloc = NewSize;
|
||||
}
|
||||
}
|
||||
|
||||
void Add(const T& NewItem)
|
||||
{
|
||||
AllocGrow(1);
|
||||
mData[mLength++] = NewItem;
|
||||
}
|
||||
|
||||
T& Add()
|
||||
{
|
||||
AllocGrow(1);
|
||||
return mData[mLength++];
|
||||
}
|
||||
|
||||
void AddSorted(const T& Obj, lcArrayCompareFunc CompareFunc)
|
||||
{
|
||||
for (int i = 0; i < mLength; i++)
|
||||
{
|
||||
if (CompareFunc(Obj, mData[i]) < 0)
|
||||
{
|
||||
InsertAt(i, Obj);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
Add(Obj);
|
||||
}
|
||||
|
||||
T& InsertAt(int Index)
|
||||
{
|
||||
if (Index >= mLength)
|
||||
AllocGrow(Index - mLength + 1);
|
||||
else
|
||||
AllocGrow(1);
|
||||
|
||||
mLength++;
|
||||
for (int i = mLength - 1; i > Index; i--)
|
||||
mData[i] = mData[i - 1];
|
||||
|
||||
return mData[Index];
|
||||
}
|
||||
|
||||
void InsertAt(int Index, const T& NewItem)
|
||||
{
|
||||
if (Index >= mLength)
|
||||
AllocGrow(Index - mLength + 1);
|
||||
else
|
||||
AllocGrow(1);
|
||||
|
||||
mLength++;
|
||||
for (int i = mLength - 1; i > Index; i--)
|
||||
mData[i] = mData[i - 1];
|
||||
|
||||
mData[Index] = NewItem;
|
||||
}
|
||||
|
||||
void RemoveIndex(int Index)
|
||||
{
|
||||
mLength--;
|
||||
|
||||
for (int i = Index; i < mLength; i++)
|
||||
mData[i] = mData[i + 1];
|
||||
}
|
||||
|
||||
void Remove(const T& Item)
|
||||
{
|
||||
for (int i = 0; i < mLength; i++)
|
||||
{
|
||||
if (mData[i] == Item)
|
||||
{
|
||||
RemoveIndex(i);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void RemoveAll()
|
||||
{
|
||||
mLength = 0;
|
||||
}
|
||||
|
||||
void DeleteAll()
|
||||
{
|
||||
for (int i = 0; i < mLength; i++)
|
||||
delete mData[i];
|
||||
|
||||
mLength = 0;
|
||||
}
|
||||
|
||||
int FindIndex(const T& Item) const
|
||||
{
|
||||
for (int i = 0; i < mLength; i++)
|
||||
if (mData[i] == Item)
|
||||
return i;
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
void Sort(lcArrayCompareFunc CompareFunc)
|
||||
{
|
||||
if (mLength <= 1)
|
||||
return;
|
||||
|
||||
int i = 1;
|
||||
bool Flipped;
|
||||
|
||||
do
|
||||
{
|
||||
Flipped = false;
|
||||
|
||||
for (int j = mLength - 1; j >= i; --j)
|
||||
{
|
||||
T& a = mData[j];
|
||||
T& b = mData[j - 1];
|
||||
|
||||
if (CompareFunc(b, a) > 0)
|
||||
{
|
||||
T Tmp = b;
|
||||
mData[j - 1] = a;
|
||||
mData[j] = Tmp;
|
||||
Flipped = true;
|
||||
}
|
||||
}
|
||||
} while ((++i < mLength) && Flipped);
|
||||
}
|
||||
|
||||
protected:
|
||||
T* mData;
|
||||
int mLength;
|
||||
int mAlloc;
|
||||
int mGrow;
|
||||
};
|
||||
|
||||
#endif // _LC_ARRAY_H_
|
||||
|
||||
+1135
-1135
File diff suppressed because it is too large
Load Diff
+213
-213
@@ -1,213 +1,213 @@
|
||||
#ifndef _LC_CONTEXT_H_
|
||||
#define _LC_CONTEXT_H_
|
||||
|
||||
#include "lc_array.h"
|
||||
#include "lc_math.h"
|
||||
#include "lc_colors.h"
|
||||
#include "lc_mesh.h"
|
||||
|
||||
class lcScene
|
||||
{
|
||||
public:
|
||||
lcScene();
|
||||
|
||||
void Begin(const lcMatrix44& ViewMatrix);
|
||||
void End();
|
||||
|
||||
lcMatrix44 mViewMatrix;
|
||||
lcArray<lcRenderMesh> mOpaqueMeshes;
|
||||
lcArray<lcRenderMesh> mTranslucentMeshes;
|
||||
lcArray<const lcObject*> mInterfaceObjects;
|
||||
};
|
||||
|
||||
class lcVertexBuffer
|
||||
{
|
||||
public:
|
||||
lcVertexBuffer()
|
||||
: Pointer(NULL)
|
||||
{
|
||||
}
|
||||
|
||||
bool IsValid() const
|
||||
{
|
||||
return Pointer != NULL;
|
||||
}
|
||||
|
||||
union
|
||||
{
|
||||
GLuint Object;
|
||||
void* Pointer;
|
||||
};
|
||||
};
|
||||
|
||||
class lcIndexBuffer
|
||||
{
|
||||
public:
|
||||
lcIndexBuffer()
|
||||
: Pointer(NULL)
|
||||
{
|
||||
}
|
||||
|
||||
bool IsValid() const
|
||||
{
|
||||
return Pointer != NULL;
|
||||
}
|
||||
|
||||
union
|
||||
{
|
||||
GLuint Object;
|
||||
void* Pointer;
|
||||
};
|
||||
};
|
||||
|
||||
enum lcProgramType
|
||||
{
|
||||
LC_PROGRAM_SIMPLE,
|
||||
LC_PROGRAM_TEXTURE,
|
||||
LC_PROGRAM_VERTEX_COLOR,
|
||||
LC_NUM_PROGRAMS
|
||||
};
|
||||
|
||||
enum lcProgramAttrib
|
||||
{
|
||||
LC_ATTRIB_POSITION,
|
||||
LC_ATTRIB_TEXCOORD,
|
||||
LC_ATTRIB_COLOR
|
||||
};
|
||||
|
||||
struct lcProgram
|
||||
{
|
||||
GLuint Object;
|
||||
GLint MatrixLocation;
|
||||
GLint ColorLocation;
|
||||
};
|
||||
|
||||
class lcContext
|
||||
{
|
||||
public:
|
||||
lcContext();
|
||||
~lcContext();
|
||||
|
||||
int GetViewportWidth() const
|
||||
{
|
||||
return mViewportWidth;
|
||||
}
|
||||
|
||||
int GetViewportHeight() const
|
||||
{
|
||||
return mViewportHeight;
|
||||
}
|
||||
|
||||
static void CreateResources();
|
||||
static void DestroyResources();
|
||||
|
||||
void SetDefaultState();
|
||||
|
||||
void SetWorldMatrix(const lcMatrix44& WorldMatrix)
|
||||
{
|
||||
mWorldMatrix = WorldMatrix;
|
||||
mWorldMatrixDirty = true;
|
||||
}
|
||||
|
||||
void SetViewMatrix(const lcMatrix44& ViewMatrix)
|
||||
{
|
||||
mViewMatrix = ViewMatrix;
|
||||
mViewMatrixDirty = true;
|
||||
mViewProjectionMatrixDirty = true;
|
||||
}
|
||||
|
||||
void SetProjectionMatrix(const lcMatrix44& ProjectionMatrix)
|
||||
{
|
||||
mProjectionMatrix = ProjectionMatrix;
|
||||
mProjectionMatrixDirty = true;
|
||||
mViewProjectionMatrixDirty = true;
|
||||
}
|
||||
|
||||
void SetProgram(lcProgramType ProgramType);
|
||||
void SetViewport(int x, int y, int Width, int Height);
|
||||
void SetLineWidth(float LineWidth);
|
||||
|
||||
void SetColor(const lcVector4& Color)
|
||||
{
|
||||
mColor = Color;
|
||||
mColorDirty = true;
|
||||
}
|
||||
|
||||
void SetColor(float Red, float Green, float Blue, float Alpha);
|
||||
void SetColorIndex(int ColorIndex);
|
||||
void SetColorIndexTinted(int ColorIndex, lcInterfaceColor InterfaceColor);
|
||||
void SetEdgeColorIndex(int ColorIndex);
|
||||
void SetInterfaceColor(lcInterfaceColor InterfaceColor);
|
||||
|
||||
bool BeginRenderToTexture(int Width, int Height);
|
||||
void EndRenderToTexture();
|
||||
bool SaveRenderToTextureImage(const QString& FileName, int Width, int Height);
|
||||
|
||||
lcVertexBuffer CreateVertexBuffer(int Size, const void* Data);
|
||||
void DestroyVertexBuffer(lcVertexBuffer& VertexBuffer);
|
||||
lcIndexBuffer CreateIndexBuffer(int Size, const void* Data);
|
||||
void DestroyIndexBuffer(lcIndexBuffer& IndexBuffer);
|
||||
|
||||
void ClearVertexBuffer();
|
||||
void SetVertexBuffer(lcVertexBuffer VertexBuffer);
|
||||
void SetVertexBufferPointer(const void* VertexBuffer);
|
||||
|
||||
void ClearIndexBuffer();
|
||||
void SetIndexBuffer(lcIndexBuffer IndexBuffer);
|
||||
void SetIndexBufferPointer(const void* IndexBuffer);
|
||||
|
||||
void SetVertexFormat(int BufferOffset, int PositionSize, int TexCoordSize, int ColorSize);
|
||||
void DrawPrimitives(GLenum Mode, GLint First, GLsizei Count);
|
||||
void DrawIndexedPrimitives(GLenum Mode, GLsizei Count, GLenum Type, int Offset);
|
||||
|
||||
void UnbindMesh();
|
||||
void DrawMeshSection(lcMesh* Mesh, lcMeshSection* Section);
|
||||
void DrawOpaqueMeshes(const lcArray<lcRenderMesh>& OpaqueMeshes);
|
||||
void DrawTranslucentMeshes(const lcArray<lcRenderMesh>& TranslucentMeshes);
|
||||
void DrawInterfaceObjects(const lcArray<const lcObject*>& InterfaceObjects);
|
||||
|
||||
protected:
|
||||
static void CreateShaderPrograms();
|
||||
void BindMesh(lcMesh* Mesh);
|
||||
void FlushState();
|
||||
|
||||
GLuint mVertexBufferObject;
|
||||
GLuint mIndexBufferObject;
|
||||
char* mVertexBufferPointer;
|
||||
char* mIndexBufferPointer;
|
||||
char* mVertexBufferOffset;
|
||||
|
||||
lcProgramType mProgramType;
|
||||
bool mTexCoordEnabled;
|
||||
bool mColorEnabled;
|
||||
|
||||
lcTexture* mTexture;
|
||||
float mLineWidth;
|
||||
int mMatrixMode;
|
||||
|
||||
int mViewportX;
|
||||
int mViewportY;
|
||||
int mViewportWidth;
|
||||
int mViewportHeight;
|
||||
|
||||
lcVector4 mColor;
|
||||
lcMatrix44 mWorldMatrix;
|
||||
lcMatrix44 mViewMatrix;
|
||||
lcMatrix44 mProjectionMatrix;
|
||||
lcMatrix44 mViewProjectionMatrix;
|
||||
bool mColorDirty;
|
||||
bool mWorldMatrixDirty;
|
||||
bool mViewMatrixDirty;
|
||||
bool mProjectionMatrixDirty;
|
||||
bool mViewProjectionMatrixDirty;
|
||||
|
||||
GLuint mFramebufferObject;
|
||||
GLuint mFramebufferTexture;
|
||||
GLuint mDepthRenderbufferObject;
|
||||
|
||||
static lcProgram mPrograms[LC_NUM_PROGRAMS];
|
||||
|
||||
Q_DECLARE_TR_FUNCTIONS(lcContext);
|
||||
};
|
||||
|
||||
#endif // _LC_CONTEXT_H_
|
||||
#ifndef _LC_CONTEXT_H_
|
||||
#define _LC_CONTEXT_H_
|
||||
|
||||
#include "lc_array.h"
|
||||
#include "lc_math.h"
|
||||
#include "lc_colors.h"
|
||||
#include "lc_mesh.h"
|
||||
|
||||
class lcScene
|
||||
{
|
||||
public:
|
||||
lcScene();
|
||||
|
||||
void Begin(const lcMatrix44& ViewMatrix);
|
||||
void End();
|
||||
|
||||
lcMatrix44 mViewMatrix;
|
||||
lcArray<lcRenderMesh> mOpaqueMeshes;
|
||||
lcArray<lcRenderMesh> mTranslucentMeshes;
|
||||
lcArray<const lcObject*> mInterfaceObjects;
|
||||
};
|
||||
|
||||
class lcVertexBuffer
|
||||
{
|
||||
public:
|
||||
lcVertexBuffer()
|
||||
: Pointer(NULL)
|
||||
{
|
||||
}
|
||||
|
||||
bool IsValid() const
|
||||
{
|
||||
return Pointer != NULL;
|
||||
}
|
||||
|
||||
union
|
||||
{
|
||||
GLuint Object;
|
||||
void* Pointer;
|
||||
};
|
||||
};
|
||||
|
||||
class lcIndexBuffer
|
||||
{
|
||||
public:
|
||||
lcIndexBuffer()
|
||||
: Pointer(NULL)
|
||||
{
|
||||
}
|
||||
|
||||
bool IsValid() const
|
||||
{
|
||||
return Pointer != NULL;
|
||||
}
|
||||
|
||||
union
|
||||
{
|
||||
GLuint Object;
|
||||
void* Pointer;
|
||||
};
|
||||
};
|
||||
|
||||
enum lcProgramType
|
||||
{
|
||||
LC_PROGRAM_SIMPLE,
|
||||
LC_PROGRAM_TEXTURE,
|
||||
LC_PROGRAM_VERTEX_COLOR,
|
||||
LC_NUM_PROGRAMS
|
||||
};
|
||||
|
||||
enum lcProgramAttrib
|
||||
{
|
||||
LC_ATTRIB_POSITION,
|
||||
LC_ATTRIB_TEXCOORD,
|
||||
LC_ATTRIB_COLOR
|
||||
};
|
||||
|
||||
struct lcProgram
|
||||
{
|
||||
GLuint Object;
|
||||
GLint MatrixLocation;
|
||||
GLint ColorLocation;
|
||||
};
|
||||
|
||||
class lcContext
|
||||
{
|
||||
public:
|
||||
lcContext();
|
||||
~lcContext();
|
||||
|
||||
int GetViewportWidth() const
|
||||
{
|
||||
return mViewportWidth;
|
||||
}
|
||||
|
||||
int GetViewportHeight() const
|
||||
{
|
||||
return mViewportHeight;
|
||||
}
|
||||
|
||||
static void CreateResources();
|
||||
static void DestroyResources();
|
||||
|
||||
void SetDefaultState();
|
||||
|
||||
void SetWorldMatrix(const lcMatrix44& WorldMatrix)
|
||||
{
|
||||
mWorldMatrix = WorldMatrix;
|
||||
mWorldMatrixDirty = true;
|
||||
}
|
||||
|
||||
void SetViewMatrix(const lcMatrix44& ViewMatrix)
|
||||
{
|
||||
mViewMatrix = ViewMatrix;
|
||||
mViewMatrixDirty = true;
|
||||
mViewProjectionMatrixDirty = true;
|
||||
}
|
||||
|
||||
void SetProjectionMatrix(const lcMatrix44& ProjectionMatrix)
|
||||
{
|
||||
mProjectionMatrix = ProjectionMatrix;
|
||||
mProjectionMatrixDirty = true;
|
||||
mViewProjectionMatrixDirty = true;
|
||||
}
|
||||
|
||||
void SetProgram(lcProgramType ProgramType);
|
||||
void SetViewport(int x, int y, int Width, int Height);
|
||||
void SetLineWidth(float LineWidth);
|
||||
|
||||
void SetColor(const lcVector4& Color)
|
||||
{
|
||||
mColor = Color;
|
||||
mColorDirty = true;
|
||||
}
|
||||
|
||||
void SetColor(float Red, float Green, float Blue, float Alpha);
|
||||
void SetColorIndex(int ColorIndex);
|
||||
void SetColorIndexTinted(int ColorIndex, lcInterfaceColor InterfaceColor);
|
||||
void SetEdgeColorIndex(int ColorIndex);
|
||||
void SetInterfaceColor(lcInterfaceColor InterfaceColor);
|
||||
|
||||
bool BeginRenderToTexture(int Width, int Height);
|
||||
void EndRenderToTexture();
|
||||
bool SaveRenderToTextureImage(const QString& FileName, int Width, int Height);
|
||||
|
||||
lcVertexBuffer CreateVertexBuffer(int Size, const void* Data);
|
||||
void DestroyVertexBuffer(lcVertexBuffer& VertexBuffer);
|
||||
lcIndexBuffer CreateIndexBuffer(int Size, const void* Data);
|
||||
void DestroyIndexBuffer(lcIndexBuffer& IndexBuffer);
|
||||
|
||||
void ClearVertexBuffer();
|
||||
void SetVertexBuffer(lcVertexBuffer VertexBuffer);
|
||||
void SetVertexBufferPointer(const void* VertexBuffer);
|
||||
|
||||
void ClearIndexBuffer();
|
||||
void SetIndexBuffer(lcIndexBuffer IndexBuffer);
|
||||
void SetIndexBufferPointer(const void* IndexBuffer);
|
||||
|
||||
void SetVertexFormat(int BufferOffset, int PositionSize, int TexCoordSize, int ColorSize);
|
||||
void DrawPrimitives(GLenum Mode, GLint First, GLsizei Count);
|
||||
void DrawIndexedPrimitives(GLenum Mode, GLsizei Count, GLenum Type, int Offset);
|
||||
|
||||
void UnbindMesh();
|
||||
void DrawMeshSection(lcMesh* Mesh, lcMeshSection* Section);
|
||||
void DrawOpaqueMeshes(const lcArray<lcRenderMesh>& OpaqueMeshes);
|
||||
void DrawTranslucentMeshes(const lcArray<lcRenderMesh>& TranslucentMeshes);
|
||||
void DrawInterfaceObjects(const lcArray<const lcObject*>& InterfaceObjects);
|
||||
|
||||
protected:
|
||||
static void CreateShaderPrograms();
|
||||
void BindMesh(lcMesh* Mesh);
|
||||
void FlushState();
|
||||
|
||||
GLuint mVertexBufferObject;
|
||||
GLuint mIndexBufferObject;
|
||||
char* mVertexBufferPointer;
|
||||
char* mIndexBufferPointer;
|
||||
char* mVertexBufferOffset;
|
||||
|
||||
lcProgramType mProgramType;
|
||||
bool mTexCoordEnabled;
|
||||
bool mColorEnabled;
|
||||
|
||||
lcTexture* mTexture;
|
||||
float mLineWidth;
|
||||
int mMatrixMode;
|
||||
|
||||
int mViewportX;
|
||||
int mViewportY;
|
||||
int mViewportWidth;
|
||||
int mViewportHeight;
|
||||
|
||||
lcVector4 mColor;
|
||||
lcMatrix44 mWorldMatrix;
|
||||
lcMatrix44 mViewMatrix;
|
||||
lcMatrix44 mProjectionMatrix;
|
||||
lcMatrix44 mViewProjectionMatrix;
|
||||
bool mColorDirty;
|
||||
bool mWorldMatrixDirty;
|
||||
bool mViewMatrixDirty;
|
||||
bool mProjectionMatrixDirty;
|
||||
bool mViewProjectionMatrixDirty;
|
||||
|
||||
GLuint mFramebufferObject;
|
||||
GLuint mFramebufferTexture;
|
||||
GLuint mDepthRenderbufferObject;
|
||||
|
||||
static lcProgram mPrograms[LC_NUM_PROGRAMS];
|
||||
|
||||
Q_DECLARE_TR_FUNCTIONS(lcContext);
|
||||
};
|
||||
|
||||
#endif // _LC_CONTEXT_H_
|
||||
|
||||
+334
-334
@@ -1,334 +1,334 @@
|
||||
#include "lc_global.h"
|
||||
#include "lc_glextensions.h"
|
||||
|
||||
bool gSupportsShaderObjects;
|
||||
bool gSupportsVertexBufferObject;
|
||||
bool gSupportsFramebufferObjectARB;
|
||||
bool gSupportsFramebufferObjectEXT;
|
||||
bool gSupportsAnisotropic;
|
||||
GLfloat gMaxAnisotropy;
|
||||
|
||||
#ifdef LC_LOAD_GLEXTENSIONS
|
||||
|
||||
PFNGLBINDBUFFERARBPROC lcBindBufferARB;
|
||||
PFNGLDELETEBUFFERSARBPROC lcDeleteBuffersARB;
|
||||
PFNGLGENBUFFERSARBPROC lcGenBuffersARB;
|
||||
PFNGLISBUFFERARBPROC lcIsBufferARB;
|
||||
PFNGLBUFFERDATAARBPROC lcBufferDataARB;
|
||||
PFNGLBUFFERSUBDATAARBPROC lcBufferSubDataARB;
|
||||
PFNGLGETBUFFERSUBDATAARBPROC lcGetBufferSubDataARB;
|
||||
PFNGLMAPBUFFERARBPROC lcMapBufferARB;
|
||||
PFNGLUNMAPBUFFERARBPROC lcUnmapBufferARB;
|
||||
PFNGLGETBUFFERPARAMETERIVARBPROC lcGetBufferParameterivARB;
|
||||
PFNGLGETBUFFERPOINTERVARBPROC lcGetBufferPointervARB;
|
||||
|
||||
PFNGLISRENDERBUFFERPROC lcIsRenderbuffer;
|
||||
PFNGLBINDRENDERBUFFERPROC lcBindRenderbuffer;
|
||||
PFNGLDELETERENDERBUFFERSPROC lcDeleteRenderbuffers;
|
||||
PFNGLGENRENDERBUFFERSPROC lcGenRenderbuffers;
|
||||
PFNGLRENDERBUFFERSTORAGEPROC lcRenderbufferStorage;
|
||||
PFNGLGETRENDERBUFFERPARAMETERIVPROC lcGetRenderbufferParameteriv;
|
||||
PFNGLISFRAMEBUFFERPROC lcIsFramebuffer;
|
||||
PFNGLBINDFRAMEBUFFERPROC lcBindFramebuffer;
|
||||
PFNGLDELETEFRAMEBUFFERSPROC lcDeleteFramebuffers;
|
||||
PFNGLGENFRAMEBUFFERSPROC lcGenFramebuffers;
|
||||
PFNGLCHECKFRAMEBUFFERSTATUSPROC lcCheckFramebufferStatus;
|
||||
PFNGLFRAMEBUFFERTEXTURE1DPROC lcFramebufferTexture1D;
|
||||
PFNGLFRAMEBUFFERTEXTURE2DPROC lcFramebufferTexture2D;
|
||||
PFNGLFRAMEBUFFERTEXTURE3DPROC lcFramebufferTexture3D;
|
||||
PFNGLFRAMEBUFFERRENDERBUFFERPROC lcFramebufferRenderbuffer;
|
||||
PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC lcGetFramebufferAttachmentParameteriv;
|
||||
PFNGLGENERATEMIPMAPPROC lcGenerateMipmap;
|
||||
PFNGLBLITFRAMEBUFFERPROC lcBlitFramebuffer;
|
||||
PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC lcRenderbufferStorageMultisample;
|
||||
PFNGLFRAMEBUFFERTEXTURELAYERPROC lcFramebufferTextureLayer;
|
||||
|
||||
PFNGLISRENDERBUFFEREXTPROC lcIsRenderbufferEXT;
|
||||
PFNGLBINDRENDERBUFFEREXTPROC lcBindRenderbufferEXT;
|
||||
PFNGLDELETERENDERBUFFERSEXTPROC lcDeleteRenderbuffersEXT;
|
||||
PFNGLGENRENDERBUFFERSEXTPROC lcGenRenderbuffersEXT;
|
||||
PFNGLRENDERBUFFERSTORAGEEXTPROC lcRenderbufferStorageEXT;
|
||||
PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC lcGetRenderbufferParameterivEXT;
|
||||
PFNGLISFRAMEBUFFEREXTPROC lcIsFramebufferEXT;
|
||||
PFNGLBINDFRAMEBUFFEREXTPROC lcBindFramebufferEXT;
|
||||
PFNGLDELETEFRAMEBUFFERSEXTPROC lcDeleteFramebuffersEXT;
|
||||
PFNGLGENFRAMEBUFFERSEXTPROC lcGenFramebuffersEXT;
|
||||
PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC lcCheckFramebufferStatusEXT;
|
||||
PFNGLFRAMEBUFFERTEXTURE1DEXTPROC lcFramebufferTexture1DEXT;
|
||||
PFNGLFRAMEBUFFERTEXTURE2DEXTPROC lcFramebufferTexture2DEXT;
|
||||
PFNGLFRAMEBUFFERTEXTURE3DEXTPROC lcFramebufferTexture3DEXT;
|
||||
PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC lcFramebufferRenderbufferEXT;
|
||||
PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC lcGetFramebufferAttachmentParameterivEXT;
|
||||
PFNGLGENERATEMIPMAPEXTPROC lcGenerateMipmapEXT;
|
||||
|
||||
PFNGLATTACHSHADERPROC lcAttachShader;
|
||||
PFNGLBINDATTRIBLOCATIONPROC lcBindAttribLocation;
|
||||
PFNGLCOMPILESHADERPROC lcCompileShader;
|
||||
PFNGLCREATEPROGRAMPROC lcCreateProgram;
|
||||
PFNGLCREATESHADERPROC lcCreateShader;
|
||||
PFNGLDELETEPROGRAMPROC lcDeleteProgram;
|
||||
PFNGLDELETESHADERPROC lcDeleteShader;
|
||||
PFNGLDETACHSHADERPROC lcDetachShader;
|
||||
PFNGLDISABLEVERTEXATTRIBARRAYPROC lcDisableVertexAttribArray;
|
||||
PFNGLENABLEVERTEXATTRIBARRAYPROC lcEnableVertexAttribArray;
|
||||
PFNGLGETACTIVEATTRIBPROC lcGetActiveAttrib;
|
||||
PFNGLGETACTIVEUNIFORMPROC lcGetActiveUniform;
|
||||
PFNGLGETATTACHEDSHADERSPROC lcGetAttachedShaders;
|
||||
PFNGLGETATTRIBLOCATIONPROC lcGetAttribLocation;
|
||||
PFNGLGETPROGRAMIVPROC lcGetProgramiv;
|
||||
PFNGLGETPROGRAMINFOLOGPROC lcGetProgramInfoLog;
|
||||
PFNGLGETSHADERIVPROC lcGetShaderiv;
|
||||
PFNGLGETSHADERINFOLOGPROC lcGetShaderInfoLog;
|
||||
PFNGLGETSHADERSOURCEPROC lcGetShaderSource;
|
||||
PFNGLGETUNIFORMLOCATIONPROC lcGetUniformLocation;
|
||||
PFNGLGETUNIFORMFVPROC lcGetUniformfv;
|
||||
PFNGLGETUNIFORMIVPROC lcGetUniformiv;
|
||||
PFNGLGETVERTEXATTRIBDVPROC lcGetVertexAttribdv;
|
||||
PFNGLGETVERTEXATTRIBFVPROC lcGetVertexAttribfv;
|
||||
PFNGLGETVERTEXATTRIBIVPROC lcGetVertexAttribiv;
|
||||
PFNGLGETVERTEXATTRIBPOINTERVPROC lcGetVertexAttribPointerv;
|
||||
PFNGLISPROGRAMPROC lcIsProgram;
|
||||
PFNGLISSHADERPROC lcIsShader;
|
||||
PFNGLLINKPROGRAMPROC lcLinkProgram;
|
||||
PFNGLSHADERSOURCEPROC lcShaderSource;
|
||||
PFNGLUSEPROGRAMPROC lcUseProgram;
|
||||
PFNGLUNIFORM1FPROC lcUniform1f;
|
||||
PFNGLUNIFORM2FPROC lcUniform2f;
|
||||
PFNGLUNIFORM3FPROC lcUniform3f;
|
||||
PFNGLUNIFORM4FPROC lcUniform4f;
|
||||
PFNGLUNIFORM1IPROC lcUniform1i;
|
||||
PFNGLUNIFORM2IPROC lcUniform2i;
|
||||
PFNGLUNIFORM3IPROC lcUniform3i;
|
||||
PFNGLUNIFORM4IPROC lcUniform4i;
|
||||
PFNGLUNIFORM1FVPROC lcUniform1fv;
|
||||
PFNGLUNIFORM2FVPROC lcUniform2fv;
|
||||
PFNGLUNIFORM3FVPROC lcUniform3fv;
|
||||
PFNGLUNIFORM4FVPROC lcUniform4fv;
|
||||
PFNGLUNIFORM1IVPROC lcUniform1iv;
|
||||
PFNGLUNIFORM2IVPROC lcUniform2iv;
|
||||
PFNGLUNIFORM3IVPROC lcUniform3iv;
|
||||
PFNGLUNIFORM4IVPROC lcUniform4iv;
|
||||
PFNGLUNIFORMMATRIX2FVPROC lcUniformMatrix2fv;
|
||||
PFNGLUNIFORMMATRIX3FVPROC lcUniformMatrix3fv;
|
||||
PFNGLUNIFORMMATRIX4FVPROC lcUniformMatrix4fv;
|
||||
PFNGLVALIDATEPROGRAMPROC lcValidateProgram;
|
||||
PFNGLVERTEXATTRIBPOINTERPROC lcVertexAttribPointer;
|
||||
|
||||
#endif
|
||||
|
||||
static bool lcIsGLExtensionSupported(const GLubyte* Extensions, const char* Name)
|
||||
{
|
||||
const GLubyte* Start;
|
||||
GLubyte* Where;
|
||||
GLubyte* Terminator;
|
||||
|
||||
Where = (GLubyte*)strchr(Name, ' ');
|
||||
if (Where || *Name == '\0')
|
||||
return false;
|
||||
|
||||
if (!Extensions)
|
||||
return false;
|
||||
|
||||
for (Start = Extensions; ;)
|
||||
{
|
||||
Where = (GLubyte*)strstr((const char*)Start, Name);
|
||||
if (!Where)
|
||||
break;
|
||||
|
||||
Terminator = Where + strlen(Name);
|
||||
if (Where == Start || *(Where - 1) == ' ')
|
||||
if (*Terminator == ' ' || *Terminator == '\0')
|
||||
return true;
|
||||
|
||||
Start = Terminator;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
#if !defined(QT_NO_DEBUG) && defined(GL_ARB_debug_output)
|
||||
|
||||
static void APIENTRY lcGLDebugCallback(GLenum Source, GLenum Type, GLuint Id, GLenum Severity, GLsizei Length, const GLchar* Message, GLvoid* UserParam)
|
||||
{
|
||||
Q_UNUSED(Source);
|
||||
Q_UNUSED(Type);
|
||||
Q_UNUSED(Id);
|
||||
Q_UNUSED(Severity);
|
||||
Q_UNUSED(Length);
|
||||
Q_UNUSED(UserParam);
|
||||
|
||||
qDebug() << Message;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
void lcInitializeGLExtensions(const QGLContext* Context)
|
||||
{
|
||||
const GLubyte* Extensions = glGetString(GL_EXTENSIONS);
|
||||
const GLubyte* Version = glGetString(GL_VERSION);
|
||||
int VersionMajor = 0, VersionMinor = 0;
|
||||
|
||||
if (Version)
|
||||
sscanf((const char*)Version, "%d.%d", &VersionMajor, &VersionMinor);
|
||||
|
||||
#if !defined(QT_NO_DEBUG) && defined(GL_ARB_debug_output)
|
||||
if (lcIsGLExtensionSupported(Extensions, "GL_KHR_debug"))
|
||||
{
|
||||
PFNGLDEBUGMESSAGECALLBACKARBPROC DebugMessageCallback = (PFNGLDEBUGMESSAGECALLBACKARBPROC)Context->getProcAddress("glDebugMessageCallback");
|
||||
|
||||
#ifndef GL_DEBUG_OUTPUT
|
||||
#define GL_DEBUG_OUTPUT 0x92E0
|
||||
#endif
|
||||
|
||||
if (DebugMessageCallback)
|
||||
{
|
||||
DebugMessageCallback((GLDEBUGPROCARB)&lcGLDebugCallback, NULL);
|
||||
glEnable(GL_DEBUG_OUTPUT);
|
||||
glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
if (lcIsGLExtensionSupported(Extensions, "GL_EXT_texture_filter_anisotropic"))
|
||||
{
|
||||
glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &gMaxAnisotropy);
|
||||
|
||||
gSupportsAnisotropic = true;
|
||||
}
|
||||
|
||||
// todo: check gl version and use core functions instead
|
||||
if (lcIsGLExtensionSupported(Extensions, "GL_ARB_vertex_buffer_object"))
|
||||
{
|
||||
#ifdef LC_LOAD_GLEXTENSIONS
|
||||
lcBindBufferARB = (PFNGLBINDBUFFERARBPROC)Context->getProcAddress("glBindBufferARB");
|
||||
lcDeleteBuffersARB = (PFNGLDELETEBUFFERSARBPROC)Context->getProcAddress("glDeleteBuffersARB");
|
||||
lcGenBuffersARB = (PFNGLGENBUFFERSARBPROC)Context->getProcAddress("glGenBuffersARB");
|
||||
lcIsBufferARB = (PFNGLISBUFFERARBPROC)Context->getProcAddress("glIsBufferARB");
|
||||
lcBufferDataARB = (PFNGLBUFFERDATAARBPROC)Context->getProcAddress("glBufferDataARB");
|
||||
lcBufferSubDataARB = (PFNGLBUFFERSUBDATAARBPROC)Context->getProcAddress("glBufferSubDataARB");
|
||||
lcGetBufferSubDataARB = (PFNGLGETBUFFERSUBDATAARBPROC)Context->getProcAddress("glGetBufferSubDataARB");
|
||||
lcMapBufferARB = (PFNGLMAPBUFFERARBPROC)Context->getProcAddress("glMapBufferARB");
|
||||
lcUnmapBufferARB = (PFNGLUNMAPBUFFERARBPROC)Context->getProcAddress("glUnmapBufferARB");
|
||||
lcGetBufferParameterivARB = (PFNGLGETBUFFERPARAMETERIVARBPROC)Context->getProcAddress("glGetBufferParameterivARB");
|
||||
lcGetBufferPointervARB = (PFNGLGETBUFFERPOINTERVARBPROC)Context->getProcAddress("glGetBufferPointervARB");
|
||||
#endif
|
||||
gSupportsVertexBufferObject = true;
|
||||
}
|
||||
|
||||
// todo: check gl version
|
||||
if (lcIsGLExtensionSupported(Extensions, "GL_ARB_framebuffer_object"))
|
||||
{
|
||||
#ifdef LC_LOAD_GLEXTENSIONS
|
||||
lcIsRenderbuffer = (PFNGLISRENDERBUFFERPROC)Context->getProcAddress("glIsRenderbuffer");
|
||||
lcBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC)Context->getProcAddress("glBindRenderbuffer");
|
||||
lcDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC)Context->getProcAddress("glDeleteRenderbuffers");
|
||||
lcGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC)Context->getProcAddress("glGenRenderbuffers");
|
||||
lcRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC)Context->getProcAddress("glRenderbufferStorage");
|
||||
lcGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVPROC)Context->getProcAddress("glGetRenderbufferParameteriv");
|
||||
lcIsFramebuffer = (PFNGLISFRAMEBUFFERPROC)Context->getProcAddress("glIsFramebuffer");
|
||||
lcBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC)Context->getProcAddress("glBindFramebuffer");
|
||||
lcDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC)Context->getProcAddress("glDeleteFramebuffers");
|
||||
lcGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC)Context->getProcAddress("glGenFramebuffers");
|
||||
lcCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC)Context->getProcAddress("glCheckFramebufferStatus");
|
||||
lcFramebufferTexture1D = (PFNGLFRAMEBUFFERTEXTURE1DPROC)Context->getProcAddress("glFramebufferTexture1D");
|
||||
lcFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC)Context->getProcAddress("glFramebufferTexture2D");
|
||||
lcFramebufferTexture3D = (PFNGLFRAMEBUFFERTEXTURE3DPROC)Context->getProcAddress("glFramebufferTexture3D");
|
||||
lcFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC)Context->getProcAddress("glFramebufferRenderbuffer");
|
||||
lcGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC)Context->getProcAddress("glGetFramebufferAttachmentParameteriv");
|
||||
lcGenerateMipmap = (PFNGLGENERATEMIPMAPPROC)Context->getProcAddress("glGenerateMipmap");
|
||||
lcBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC)Context->getProcAddress("glBlitFramebuffer");
|
||||
lcRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC)Context->getProcAddress("glRenderbufferStorageMultisample");
|
||||
lcFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERARBPROC)Context->getProcAddress("glFramebufferTextureLayer");
|
||||
#endif
|
||||
gSupportsFramebufferObjectARB = true;
|
||||
}
|
||||
|
||||
if (lcIsGLExtensionSupported(Extensions, "GL_EXT_framebuffer_object"))
|
||||
{
|
||||
#ifdef LC_LOAD_GLEXTENSIONS
|
||||
lcIsRenderbufferEXT = (PFNGLISRENDERBUFFEREXTPROC)Context->getProcAddress("glIsRenderbufferEXT");
|
||||
lcBindRenderbufferEXT = (PFNGLBINDRENDERBUFFEREXTPROC)Context->getProcAddress("glBindRenderbufferEXT");
|
||||
lcDeleteRenderbuffersEXT = (PFNGLDELETERENDERBUFFERSEXTPROC)Context->getProcAddress("glDeleteRenderbuffersEXT");
|
||||
lcGenRenderbuffersEXT = (PFNGLGENRENDERBUFFERSEXTPROC)Context->getProcAddress("glGenRenderbuffersEXT");
|
||||
lcRenderbufferStorageEXT = (PFNGLRENDERBUFFERSTORAGEEXTPROC)Context->getProcAddress("glRenderbufferStorageEXT");
|
||||
lcGetRenderbufferParameterivEXT = (PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC)Context->getProcAddress("glGetRenderbufferParameterivEXT");
|
||||
lcIsFramebufferEXT = (PFNGLISFRAMEBUFFEREXTPROC)Context->getProcAddress("glIsFramebufferEXT");
|
||||
lcBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC)Context->getProcAddress("glBindFramebufferEXT");
|
||||
lcDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC)Context->getProcAddress("glDeleteFramebuffersEXT");
|
||||
lcGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC)Context->getProcAddress("glGenFramebuffersEXT");
|
||||
lcCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)Context->getProcAddress("glCheckFramebufferStatusEXT");
|
||||
lcFramebufferTexture1DEXT = (PFNGLFRAMEBUFFERTEXTURE1DEXTPROC)Context->getProcAddress("glFramebufferTexture1DEXT");
|
||||
lcFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC)Context->getProcAddress("glFramebufferTexture2DEXT");
|
||||
lcFramebufferTexture3DEXT = (PFNGLFRAMEBUFFERTEXTURE3DEXTPROC)Context->getProcAddress("glFramebufferTexture3DEXT");
|
||||
lcFramebufferRenderbufferEXT = (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC)Context->getProcAddress("glFramebufferRenderbufferEXT");
|
||||
lcGetFramebufferAttachmentParameterivEXT = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC)Context->getProcAddress("glGetFramebufferAttachmentParameterivEXT");
|
||||
lcGenerateMipmapEXT = (PFNGLGENERATEMIPMAPEXTPROC)Context->getProcAddress("glGenerateMipmapEXT");
|
||||
#endif
|
||||
gSupportsFramebufferObjectEXT = true;
|
||||
}
|
||||
|
||||
const GLubyte* GLSLVersion = glGetString(GL_SHADING_LANGUAGE_VERSION);
|
||||
int GLSLMajor = 0, GLSLMinor = 0;
|
||||
|
||||
if (GLSLVersion)
|
||||
sscanf((const char*)GLSLVersion, "%d.%d", &GLSLMajor, &GLSLMinor);
|
||||
|
||||
if (VersionMajor >= 2 && (GLSLMajor > 1 || (GLSLMajor == 1 && GLSLMinor >= 10)))
|
||||
{
|
||||
#ifdef LC_LOAD_GLEXTENSIONS
|
||||
lcAttachShader = (PFNGLATTACHSHADERPROC)Context->getProcAddress("glAttachShader");
|
||||
lcBindAttribLocation = (PFNGLBINDATTRIBLOCATIONPROC)Context->getProcAddress("glBindAttribLocation");
|
||||
lcCompileShader = (PFNGLCOMPILESHADERPROC)Context->getProcAddress("glCompileShader");
|
||||
lcCreateProgram = (PFNGLCREATEPROGRAMPROC)Context->getProcAddress("glCreateProgram");
|
||||
lcCreateShader = (PFNGLCREATESHADERPROC)Context->getProcAddress("glCreateShader");
|
||||
lcDeleteProgram = (PFNGLDELETEPROGRAMPROC)Context->getProcAddress("glDeleteProgram");
|
||||
lcDeleteShader = (PFNGLDELETESHADERPROC)Context->getProcAddress("glDeleteShader");
|
||||
lcDetachShader = (PFNGLDETACHSHADERPROC)Context->getProcAddress("glDetachShader");
|
||||
lcDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC)Context->getProcAddress("glDisableVertexAttribArray");
|
||||
lcEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC)Context->getProcAddress("glEnableVertexAttribArray");
|
||||
lcGetActiveAttrib = (PFNGLGETACTIVEATTRIBPROC)Context->getProcAddress("glGetActiveAttrib");
|
||||
lcGetActiveUniform = (PFNGLGETACTIVEUNIFORMPROC)Context->getProcAddress("glGetActiveUniform");
|
||||
lcGetAttachedShaders = (PFNGLGETATTACHEDSHADERSPROC)Context->getProcAddress("glGetAttachedShaders");
|
||||
lcGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC)Context->getProcAddress("glGetAttribLocation");
|
||||
lcGetProgramiv = (PFNGLGETPROGRAMIVPROC)Context->getProcAddress("glGetProgramiv");
|
||||
lcGetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC)Context->getProcAddress("glGetProgramInfoLog");
|
||||
lcGetShaderiv = (PFNGLGETSHADERIVPROC)Context->getProcAddress("glGetShaderiv");
|
||||
lcGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC)Context->getProcAddress("glGetShaderInfoLog");
|
||||
lcGetShaderSource = (PFNGLGETSHADERSOURCEPROC)Context->getProcAddress("glGetShaderSource");
|
||||
lcGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC)Context->getProcAddress("glGetUniformLocation");
|
||||
lcGetUniformfv = (PFNGLGETUNIFORMFVPROC)Context->getProcAddress("glGetUniformfv");
|
||||
lcGetUniformiv = (PFNGLGETUNIFORMIVPROC)Context->getProcAddress("glGetUniformiv");
|
||||
lcGetVertexAttribdv = (PFNGLGETVERTEXATTRIBDVPROC)Context->getProcAddress("glGetVertexAttribdv");
|
||||
lcGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC)Context->getProcAddress("glGetVertexAttribfv");
|
||||
lcGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC)Context->getProcAddress("glGetVertexAttribiv");
|
||||
lcGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC)Context->getProcAddress("glGetVertexAttribPointerv");
|
||||
lcIsProgram = (PFNGLISPROGRAMPROC)Context->getProcAddress("glIsProgram");
|
||||
lcIsShader = (PFNGLISSHADERPROC)Context->getProcAddress("glIsShader");
|
||||
lcLinkProgram = (PFNGLLINKPROGRAMPROC)Context->getProcAddress("glLinkProgram");
|
||||
lcShaderSource = (PFNGLSHADERSOURCEPROC)Context->getProcAddress("glShaderSource");
|
||||
lcUseProgram = (PFNGLUSEPROGRAMPROC)Context->getProcAddress("glUseProgram");
|
||||
lcUniform1f = (PFNGLUNIFORM1FPROC)Context->getProcAddress("glUniform1f");
|
||||
lcUniform2f = (PFNGLUNIFORM2FPROC)Context->getProcAddress("glUniform2f");
|
||||
lcUniform3f = (PFNGLUNIFORM3FPROC)Context->getProcAddress("glUniform3f");
|
||||
lcUniform4f = (PFNGLUNIFORM4FPROC)Context->getProcAddress("glUniform4f");
|
||||
lcUniform1i = (PFNGLUNIFORM1IPROC)Context->getProcAddress("glUniform1i");
|
||||
lcUniform2i = (PFNGLUNIFORM2IPROC)Context->getProcAddress("glUniform2i");
|
||||
lcUniform3i = (PFNGLUNIFORM3IPROC)Context->getProcAddress("glUniform3i");
|
||||
lcUniform4i = (PFNGLUNIFORM4IPROC)Context->getProcAddress("glUniform4i");
|
||||
lcUniform1fv = (PFNGLUNIFORM1FVPROC)Context->getProcAddress("glUniform1fv");
|
||||
lcUniform2fv = (PFNGLUNIFORM2FVPROC)Context->getProcAddress("glUniform2fv");
|
||||
lcUniform3fv = (PFNGLUNIFORM3FVPROC)Context->getProcAddress("glUniform3fv");
|
||||
lcUniform4fv = (PFNGLUNIFORM4FVPROC)Context->getProcAddress("glUniform4fv");
|
||||
lcUniform1iv = (PFNGLUNIFORM1IVPROC)Context->getProcAddress("glUniform1iv");
|
||||
lcUniform2iv = (PFNGLUNIFORM2IVPROC)Context->getProcAddress("glUniform2iv");
|
||||
lcUniform3iv = (PFNGLUNIFORM3IVPROC)Context->getProcAddress("glUniform3iv");
|
||||
lcUniform4iv = (PFNGLUNIFORM4IVPROC)Context->getProcAddress("glUniform4iv");
|
||||
lcUniformMatrix2fv = (PFNGLUNIFORMMATRIX2FVPROC)Context->getProcAddress("glUniformMatrix2fv");
|
||||
lcUniformMatrix3fv = (PFNGLUNIFORMMATRIX3FVPROC)Context->getProcAddress("glUniformMatrix3fv");
|
||||
lcUniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC)Context->getProcAddress("glUniformMatrix4fv");
|
||||
lcValidateProgram = (PFNGLVALIDATEPROGRAMPROC)Context->getProcAddress("glValidateProgram");
|
||||
lcVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC)Context->getProcAddress("glVertexAttribPointer");
|
||||
#endif
|
||||
gSupportsShaderObjects = true;
|
||||
}
|
||||
}
|
||||
#include "lc_global.h"
|
||||
#include "lc_glextensions.h"
|
||||
|
||||
bool gSupportsShaderObjects;
|
||||
bool gSupportsVertexBufferObject;
|
||||
bool gSupportsFramebufferObjectARB;
|
||||
bool gSupportsFramebufferObjectEXT;
|
||||
bool gSupportsAnisotropic;
|
||||
GLfloat gMaxAnisotropy;
|
||||
|
||||
#ifdef LC_LOAD_GLEXTENSIONS
|
||||
|
||||
PFNGLBINDBUFFERARBPROC lcBindBufferARB;
|
||||
PFNGLDELETEBUFFERSARBPROC lcDeleteBuffersARB;
|
||||
PFNGLGENBUFFERSARBPROC lcGenBuffersARB;
|
||||
PFNGLISBUFFERARBPROC lcIsBufferARB;
|
||||
PFNGLBUFFERDATAARBPROC lcBufferDataARB;
|
||||
PFNGLBUFFERSUBDATAARBPROC lcBufferSubDataARB;
|
||||
PFNGLGETBUFFERSUBDATAARBPROC lcGetBufferSubDataARB;
|
||||
PFNGLMAPBUFFERARBPROC lcMapBufferARB;
|
||||
PFNGLUNMAPBUFFERARBPROC lcUnmapBufferARB;
|
||||
PFNGLGETBUFFERPARAMETERIVARBPROC lcGetBufferParameterivARB;
|
||||
PFNGLGETBUFFERPOINTERVARBPROC lcGetBufferPointervARB;
|
||||
|
||||
PFNGLISRENDERBUFFERPROC lcIsRenderbuffer;
|
||||
PFNGLBINDRENDERBUFFERPROC lcBindRenderbuffer;
|
||||
PFNGLDELETERENDERBUFFERSPROC lcDeleteRenderbuffers;
|
||||
PFNGLGENRENDERBUFFERSPROC lcGenRenderbuffers;
|
||||
PFNGLRENDERBUFFERSTORAGEPROC lcRenderbufferStorage;
|
||||
PFNGLGETRENDERBUFFERPARAMETERIVPROC lcGetRenderbufferParameteriv;
|
||||
PFNGLISFRAMEBUFFERPROC lcIsFramebuffer;
|
||||
PFNGLBINDFRAMEBUFFERPROC lcBindFramebuffer;
|
||||
PFNGLDELETEFRAMEBUFFERSPROC lcDeleteFramebuffers;
|
||||
PFNGLGENFRAMEBUFFERSPROC lcGenFramebuffers;
|
||||
PFNGLCHECKFRAMEBUFFERSTATUSPROC lcCheckFramebufferStatus;
|
||||
PFNGLFRAMEBUFFERTEXTURE1DPROC lcFramebufferTexture1D;
|
||||
PFNGLFRAMEBUFFERTEXTURE2DPROC lcFramebufferTexture2D;
|
||||
PFNGLFRAMEBUFFERTEXTURE3DPROC lcFramebufferTexture3D;
|
||||
PFNGLFRAMEBUFFERRENDERBUFFERPROC lcFramebufferRenderbuffer;
|
||||
PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC lcGetFramebufferAttachmentParameteriv;
|
||||
PFNGLGENERATEMIPMAPPROC lcGenerateMipmap;
|
||||
PFNGLBLITFRAMEBUFFERPROC lcBlitFramebuffer;
|
||||
PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC lcRenderbufferStorageMultisample;
|
||||
PFNGLFRAMEBUFFERTEXTURELAYERPROC lcFramebufferTextureLayer;
|
||||
|
||||
PFNGLISRENDERBUFFEREXTPROC lcIsRenderbufferEXT;
|
||||
PFNGLBINDRENDERBUFFEREXTPROC lcBindRenderbufferEXT;
|
||||
PFNGLDELETERENDERBUFFERSEXTPROC lcDeleteRenderbuffersEXT;
|
||||
PFNGLGENRENDERBUFFERSEXTPROC lcGenRenderbuffersEXT;
|
||||
PFNGLRENDERBUFFERSTORAGEEXTPROC lcRenderbufferStorageEXT;
|
||||
PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC lcGetRenderbufferParameterivEXT;
|
||||
PFNGLISFRAMEBUFFEREXTPROC lcIsFramebufferEXT;
|
||||
PFNGLBINDFRAMEBUFFEREXTPROC lcBindFramebufferEXT;
|
||||
PFNGLDELETEFRAMEBUFFERSEXTPROC lcDeleteFramebuffersEXT;
|
||||
PFNGLGENFRAMEBUFFERSEXTPROC lcGenFramebuffersEXT;
|
||||
PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC lcCheckFramebufferStatusEXT;
|
||||
PFNGLFRAMEBUFFERTEXTURE1DEXTPROC lcFramebufferTexture1DEXT;
|
||||
PFNGLFRAMEBUFFERTEXTURE2DEXTPROC lcFramebufferTexture2DEXT;
|
||||
PFNGLFRAMEBUFFERTEXTURE3DEXTPROC lcFramebufferTexture3DEXT;
|
||||
PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC lcFramebufferRenderbufferEXT;
|
||||
PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC lcGetFramebufferAttachmentParameterivEXT;
|
||||
PFNGLGENERATEMIPMAPEXTPROC lcGenerateMipmapEXT;
|
||||
|
||||
PFNGLATTACHSHADERPROC lcAttachShader;
|
||||
PFNGLBINDATTRIBLOCATIONPROC lcBindAttribLocation;
|
||||
PFNGLCOMPILESHADERPROC lcCompileShader;
|
||||
PFNGLCREATEPROGRAMPROC lcCreateProgram;
|
||||
PFNGLCREATESHADERPROC lcCreateShader;
|
||||
PFNGLDELETEPROGRAMPROC lcDeleteProgram;
|
||||
PFNGLDELETESHADERPROC lcDeleteShader;
|
||||
PFNGLDETACHSHADERPROC lcDetachShader;
|
||||
PFNGLDISABLEVERTEXATTRIBARRAYPROC lcDisableVertexAttribArray;
|
||||
PFNGLENABLEVERTEXATTRIBARRAYPROC lcEnableVertexAttribArray;
|
||||
PFNGLGETACTIVEATTRIBPROC lcGetActiveAttrib;
|
||||
PFNGLGETACTIVEUNIFORMPROC lcGetActiveUniform;
|
||||
PFNGLGETATTACHEDSHADERSPROC lcGetAttachedShaders;
|
||||
PFNGLGETATTRIBLOCATIONPROC lcGetAttribLocation;
|
||||
PFNGLGETPROGRAMIVPROC lcGetProgramiv;
|
||||
PFNGLGETPROGRAMINFOLOGPROC lcGetProgramInfoLog;
|
||||
PFNGLGETSHADERIVPROC lcGetShaderiv;
|
||||
PFNGLGETSHADERINFOLOGPROC lcGetShaderInfoLog;
|
||||
PFNGLGETSHADERSOURCEPROC lcGetShaderSource;
|
||||
PFNGLGETUNIFORMLOCATIONPROC lcGetUniformLocation;
|
||||
PFNGLGETUNIFORMFVPROC lcGetUniformfv;
|
||||
PFNGLGETUNIFORMIVPROC lcGetUniformiv;
|
||||
PFNGLGETVERTEXATTRIBDVPROC lcGetVertexAttribdv;
|
||||
PFNGLGETVERTEXATTRIBFVPROC lcGetVertexAttribfv;
|
||||
PFNGLGETVERTEXATTRIBIVPROC lcGetVertexAttribiv;
|
||||
PFNGLGETVERTEXATTRIBPOINTERVPROC lcGetVertexAttribPointerv;
|
||||
PFNGLISPROGRAMPROC lcIsProgram;
|
||||
PFNGLISSHADERPROC lcIsShader;
|
||||
PFNGLLINKPROGRAMPROC lcLinkProgram;
|
||||
PFNGLSHADERSOURCEPROC lcShaderSource;
|
||||
PFNGLUSEPROGRAMPROC lcUseProgram;
|
||||
PFNGLUNIFORM1FPROC lcUniform1f;
|
||||
PFNGLUNIFORM2FPROC lcUniform2f;
|
||||
PFNGLUNIFORM3FPROC lcUniform3f;
|
||||
PFNGLUNIFORM4FPROC lcUniform4f;
|
||||
PFNGLUNIFORM1IPROC lcUniform1i;
|
||||
PFNGLUNIFORM2IPROC lcUniform2i;
|
||||
PFNGLUNIFORM3IPROC lcUniform3i;
|
||||
PFNGLUNIFORM4IPROC lcUniform4i;
|
||||
PFNGLUNIFORM1FVPROC lcUniform1fv;
|
||||
PFNGLUNIFORM2FVPROC lcUniform2fv;
|
||||
PFNGLUNIFORM3FVPROC lcUniform3fv;
|
||||
PFNGLUNIFORM4FVPROC lcUniform4fv;
|
||||
PFNGLUNIFORM1IVPROC lcUniform1iv;
|
||||
PFNGLUNIFORM2IVPROC lcUniform2iv;
|
||||
PFNGLUNIFORM3IVPROC lcUniform3iv;
|
||||
PFNGLUNIFORM4IVPROC lcUniform4iv;
|
||||
PFNGLUNIFORMMATRIX2FVPROC lcUniformMatrix2fv;
|
||||
PFNGLUNIFORMMATRIX3FVPROC lcUniformMatrix3fv;
|
||||
PFNGLUNIFORMMATRIX4FVPROC lcUniformMatrix4fv;
|
||||
PFNGLVALIDATEPROGRAMPROC lcValidateProgram;
|
||||
PFNGLVERTEXATTRIBPOINTERPROC lcVertexAttribPointer;
|
||||
|
||||
#endif
|
||||
|
||||
static bool lcIsGLExtensionSupported(const GLubyte* Extensions, const char* Name)
|
||||
{
|
||||
const GLubyte* Start;
|
||||
GLubyte* Where;
|
||||
GLubyte* Terminator;
|
||||
|
||||
Where = (GLubyte*)strchr(Name, ' ');
|
||||
if (Where || *Name == '\0')
|
||||
return false;
|
||||
|
||||
if (!Extensions)
|
||||
return false;
|
||||
|
||||
for (Start = Extensions; ;)
|
||||
{
|
||||
Where = (GLubyte*)strstr((const char*)Start, Name);
|
||||
if (!Where)
|
||||
break;
|
||||
|
||||
Terminator = Where + strlen(Name);
|
||||
if (Where == Start || *(Where - 1) == ' ')
|
||||
if (*Terminator == ' ' || *Terminator == '\0')
|
||||
return true;
|
||||
|
||||
Start = Terminator;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
#if !defined(QT_NO_DEBUG) && defined(GL_ARB_debug_output)
|
||||
|
||||
static void APIENTRY lcGLDebugCallback(GLenum Source, GLenum Type, GLuint Id, GLenum Severity, GLsizei Length, const GLchar* Message, GLvoid* UserParam)
|
||||
{
|
||||
Q_UNUSED(Source);
|
||||
Q_UNUSED(Type);
|
||||
Q_UNUSED(Id);
|
||||
Q_UNUSED(Severity);
|
||||
Q_UNUSED(Length);
|
||||
Q_UNUSED(UserParam);
|
||||
|
||||
qDebug() << Message;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
void lcInitializeGLExtensions(const QGLContext* Context)
|
||||
{
|
||||
const GLubyte* Extensions = glGetString(GL_EXTENSIONS);
|
||||
const GLubyte* Version = glGetString(GL_VERSION);
|
||||
int VersionMajor = 0, VersionMinor = 0;
|
||||
|
||||
if (Version)
|
||||
sscanf((const char*)Version, "%d.%d", &VersionMajor, &VersionMinor);
|
||||
|
||||
#if !defined(QT_NO_DEBUG) && defined(GL_ARB_debug_output)
|
||||
if (lcIsGLExtensionSupported(Extensions, "GL_KHR_debug"))
|
||||
{
|
||||
PFNGLDEBUGMESSAGECALLBACKARBPROC DebugMessageCallback = (PFNGLDEBUGMESSAGECALLBACKARBPROC)Context->getProcAddress("glDebugMessageCallback");
|
||||
|
||||
#ifndef GL_DEBUG_OUTPUT
|
||||
#define GL_DEBUG_OUTPUT 0x92E0
|
||||
#endif
|
||||
|
||||
if (DebugMessageCallback)
|
||||
{
|
||||
DebugMessageCallback((GLDEBUGPROCARB)&lcGLDebugCallback, NULL);
|
||||
glEnable(GL_DEBUG_OUTPUT);
|
||||
glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
if (lcIsGLExtensionSupported(Extensions, "GL_EXT_texture_filter_anisotropic"))
|
||||
{
|
||||
glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &gMaxAnisotropy);
|
||||
|
||||
gSupportsAnisotropic = true;
|
||||
}
|
||||
|
||||
// todo: check gl version and use core functions instead
|
||||
if (lcIsGLExtensionSupported(Extensions, "GL_ARB_vertex_buffer_object"))
|
||||
{
|
||||
#ifdef LC_LOAD_GLEXTENSIONS
|
||||
lcBindBufferARB = (PFNGLBINDBUFFERARBPROC)Context->getProcAddress("glBindBufferARB");
|
||||
lcDeleteBuffersARB = (PFNGLDELETEBUFFERSARBPROC)Context->getProcAddress("glDeleteBuffersARB");
|
||||
lcGenBuffersARB = (PFNGLGENBUFFERSARBPROC)Context->getProcAddress("glGenBuffersARB");
|
||||
lcIsBufferARB = (PFNGLISBUFFERARBPROC)Context->getProcAddress("glIsBufferARB");
|
||||
lcBufferDataARB = (PFNGLBUFFERDATAARBPROC)Context->getProcAddress("glBufferDataARB");
|
||||
lcBufferSubDataARB = (PFNGLBUFFERSUBDATAARBPROC)Context->getProcAddress("glBufferSubDataARB");
|
||||
lcGetBufferSubDataARB = (PFNGLGETBUFFERSUBDATAARBPROC)Context->getProcAddress("glGetBufferSubDataARB");
|
||||
lcMapBufferARB = (PFNGLMAPBUFFERARBPROC)Context->getProcAddress("glMapBufferARB");
|
||||
lcUnmapBufferARB = (PFNGLUNMAPBUFFERARBPROC)Context->getProcAddress("glUnmapBufferARB");
|
||||
lcGetBufferParameterivARB = (PFNGLGETBUFFERPARAMETERIVARBPROC)Context->getProcAddress("glGetBufferParameterivARB");
|
||||
lcGetBufferPointervARB = (PFNGLGETBUFFERPOINTERVARBPROC)Context->getProcAddress("glGetBufferPointervARB");
|
||||
#endif
|
||||
gSupportsVertexBufferObject = true;
|
||||
}
|
||||
|
||||
// todo: check gl version
|
||||
if (lcIsGLExtensionSupported(Extensions, "GL_ARB_framebuffer_object"))
|
||||
{
|
||||
#ifdef LC_LOAD_GLEXTENSIONS
|
||||
lcIsRenderbuffer = (PFNGLISRENDERBUFFERPROC)Context->getProcAddress("glIsRenderbuffer");
|
||||
lcBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC)Context->getProcAddress("glBindRenderbuffer");
|
||||
lcDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC)Context->getProcAddress("glDeleteRenderbuffers");
|
||||
lcGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC)Context->getProcAddress("glGenRenderbuffers");
|
||||
lcRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC)Context->getProcAddress("glRenderbufferStorage");
|
||||
lcGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVPROC)Context->getProcAddress("glGetRenderbufferParameteriv");
|
||||
lcIsFramebuffer = (PFNGLISFRAMEBUFFERPROC)Context->getProcAddress("glIsFramebuffer");
|
||||
lcBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC)Context->getProcAddress("glBindFramebuffer");
|
||||
lcDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC)Context->getProcAddress("glDeleteFramebuffers");
|
||||
lcGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC)Context->getProcAddress("glGenFramebuffers");
|
||||
lcCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC)Context->getProcAddress("glCheckFramebufferStatus");
|
||||
lcFramebufferTexture1D = (PFNGLFRAMEBUFFERTEXTURE1DPROC)Context->getProcAddress("glFramebufferTexture1D");
|
||||
lcFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC)Context->getProcAddress("glFramebufferTexture2D");
|
||||
lcFramebufferTexture3D = (PFNGLFRAMEBUFFERTEXTURE3DPROC)Context->getProcAddress("glFramebufferTexture3D");
|
||||
lcFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC)Context->getProcAddress("glFramebufferRenderbuffer");
|
||||
lcGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC)Context->getProcAddress("glGetFramebufferAttachmentParameteriv");
|
||||
lcGenerateMipmap = (PFNGLGENERATEMIPMAPPROC)Context->getProcAddress("glGenerateMipmap");
|
||||
lcBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC)Context->getProcAddress("glBlitFramebuffer");
|
||||
lcRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC)Context->getProcAddress("glRenderbufferStorageMultisample");
|
||||
lcFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERARBPROC)Context->getProcAddress("glFramebufferTextureLayer");
|
||||
#endif
|
||||
gSupportsFramebufferObjectARB = true;
|
||||
}
|
||||
|
||||
if (lcIsGLExtensionSupported(Extensions, "GL_EXT_framebuffer_object"))
|
||||
{
|
||||
#ifdef LC_LOAD_GLEXTENSIONS
|
||||
lcIsRenderbufferEXT = (PFNGLISRENDERBUFFEREXTPROC)Context->getProcAddress("glIsRenderbufferEXT");
|
||||
lcBindRenderbufferEXT = (PFNGLBINDRENDERBUFFEREXTPROC)Context->getProcAddress("glBindRenderbufferEXT");
|
||||
lcDeleteRenderbuffersEXT = (PFNGLDELETERENDERBUFFERSEXTPROC)Context->getProcAddress("glDeleteRenderbuffersEXT");
|
||||
lcGenRenderbuffersEXT = (PFNGLGENRENDERBUFFERSEXTPROC)Context->getProcAddress("glGenRenderbuffersEXT");
|
||||
lcRenderbufferStorageEXT = (PFNGLRENDERBUFFERSTORAGEEXTPROC)Context->getProcAddress("glRenderbufferStorageEXT");
|
||||
lcGetRenderbufferParameterivEXT = (PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC)Context->getProcAddress("glGetRenderbufferParameterivEXT");
|
||||
lcIsFramebufferEXT = (PFNGLISFRAMEBUFFEREXTPROC)Context->getProcAddress("glIsFramebufferEXT");
|
||||
lcBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC)Context->getProcAddress("glBindFramebufferEXT");
|
||||
lcDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC)Context->getProcAddress("glDeleteFramebuffersEXT");
|
||||
lcGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC)Context->getProcAddress("glGenFramebuffersEXT");
|
||||
lcCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)Context->getProcAddress("glCheckFramebufferStatusEXT");
|
||||
lcFramebufferTexture1DEXT = (PFNGLFRAMEBUFFERTEXTURE1DEXTPROC)Context->getProcAddress("glFramebufferTexture1DEXT");
|
||||
lcFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC)Context->getProcAddress("glFramebufferTexture2DEXT");
|
||||
lcFramebufferTexture3DEXT = (PFNGLFRAMEBUFFERTEXTURE3DEXTPROC)Context->getProcAddress("glFramebufferTexture3DEXT");
|
||||
lcFramebufferRenderbufferEXT = (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC)Context->getProcAddress("glFramebufferRenderbufferEXT");
|
||||
lcGetFramebufferAttachmentParameterivEXT = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC)Context->getProcAddress("glGetFramebufferAttachmentParameterivEXT");
|
||||
lcGenerateMipmapEXT = (PFNGLGENERATEMIPMAPEXTPROC)Context->getProcAddress("glGenerateMipmapEXT");
|
||||
#endif
|
||||
gSupportsFramebufferObjectEXT = true;
|
||||
}
|
||||
|
||||
const GLubyte* GLSLVersion = glGetString(GL_SHADING_LANGUAGE_VERSION);
|
||||
int GLSLMajor = 0, GLSLMinor = 0;
|
||||
|
||||
if (GLSLVersion)
|
||||
sscanf((const char*)GLSLVersion, "%d.%d", &GLSLMajor, &GLSLMinor);
|
||||
|
||||
if (VersionMajor >= 2 && (GLSLMajor > 1 || (GLSLMajor == 1 && GLSLMinor >= 10)))
|
||||
{
|
||||
#ifdef LC_LOAD_GLEXTENSIONS
|
||||
lcAttachShader = (PFNGLATTACHSHADERPROC)Context->getProcAddress("glAttachShader");
|
||||
lcBindAttribLocation = (PFNGLBINDATTRIBLOCATIONPROC)Context->getProcAddress("glBindAttribLocation");
|
||||
lcCompileShader = (PFNGLCOMPILESHADERPROC)Context->getProcAddress("glCompileShader");
|
||||
lcCreateProgram = (PFNGLCREATEPROGRAMPROC)Context->getProcAddress("glCreateProgram");
|
||||
lcCreateShader = (PFNGLCREATESHADERPROC)Context->getProcAddress("glCreateShader");
|
||||
lcDeleteProgram = (PFNGLDELETEPROGRAMPROC)Context->getProcAddress("glDeleteProgram");
|
||||
lcDeleteShader = (PFNGLDELETESHADERPROC)Context->getProcAddress("glDeleteShader");
|
||||
lcDetachShader = (PFNGLDETACHSHADERPROC)Context->getProcAddress("glDetachShader");
|
||||
lcDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC)Context->getProcAddress("glDisableVertexAttribArray");
|
||||
lcEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC)Context->getProcAddress("glEnableVertexAttribArray");
|
||||
lcGetActiveAttrib = (PFNGLGETACTIVEATTRIBPROC)Context->getProcAddress("glGetActiveAttrib");
|
||||
lcGetActiveUniform = (PFNGLGETACTIVEUNIFORMPROC)Context->getProcAddress("glGetActiveUniform");
|
||||
lcGetAttachedShaders = (PFNGLGETATTACHEDSHADERSPROC)Context->getProcAddress("glGetAttachedShaders");
|
||||
lcGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC)Context->getProcAddress("glGetAttribLocation");
|
||||
lcGetProgramiv = (PFNGLGETPROGRAMIVPROC)Context->getProcAddress("glGetProgramiv");
|
||||
lcGetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC)Context->getProcAddress("glGetProgramInfoLog");
|
||||
lcGetShaderiv = (PFNGLGETSHADERIVPROC)Context->getProcAddress("glGetShaderiv");
|
||||
lcGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC)Context->getProcAddress("glGetShaderInfoLog");
|
||||
lcGetShaderSource = (PFNGLGETSHADERSOURCEPROC)Context->getProcAddress("glGetShaderSource");
|
||||
lcGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC)Context->getProcAddress("glGetUniformLocation");
|
||||
lcGetUniformfv = (PFNGLGETUNIFORMFVPROC)Context->getProcAddress("glGetUniformfv");
|
||||
lcGetUniformiv = (PFNGLGETUNIFORMIVPROC)Context->getProcAddress("glGetUniformiv");
|
||||
lcGetVertexAttribdv = (PFNGLGETVERTEXATTRIBDVPROC)Context->getProcAddress("glGetVertexAttribdv");
|
||||
lcGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC)Context->getProcAddress("glGetVertexAttribfv");
|
||||
lcGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC)Context->getProcAddress("glGetVertexAttribiv");
|
||||
lcGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC)Context->getProcAddress("glGetVertexAttribPointerv");
|
||||
lcIsProgram = (PFNGLISPROGRAMPROC)Context->getProcAddress("glIsProgram");
|
||||
lcIsShader = (PFNGLISSHADERPROC)Context->getProcAddress("glIsShader");
|
||||
lcLinkProgram = (PFNGLLINKPROGRAMPROC)Context->getProcAddress("glLinkProgram");
|
||||
lcShaderSource = (PFNGLSHADERSOURCEPROC)Context->getProcAddress("glShaderSource");
|
||||
lcUseProgram = (PFNGLUSEPROGRAMPROC)Context->getProcAddress("glUseProgram");
|
||||
lcUniform1f = (PFNGLUNIFORM1FPROC)Context->getProcAddress("glUniform1f");
|
||||
lcUniform2f = (PFNGLUNIFORM2FPROC)Context->getProcAddress("glUniform2f");
|
||||
lcUniform3f = (PFNGLUNIFORM3FPROC)Context->getProcAddress("glUniform3f");
|
||||
lcUniform4f = (PFNGLUNIFORM4FPROC)Context->getProcAddress("glUniform4f");
|
||||
lcUniform1i = (PFNGLUNIFORM1IPROC)Context->getProcAddress("glUniform1i");
|
||||
lcUniform2i = (PFNGLUNIFORM2IPROC)Context->getProcAddress("glUniform2i");
|
||||
lcUniform3i = (PFNGLUNIFORM3IPROC)Context->getProcAddress("glUniform3i");
|
||||
lcUniform4i = (PFNGLUNIFORM4IPROC)Context->getProcAddress("glUniform4i");
|
||||
lcUniform1fv = (PFNGLUNIFORM1FVPROC)Context->getProcAddress("glUniform1fv");
|
||||
lcUniform2fv = (PFNGLUNIFORM2FVPROC)Context->getProcAddress("glUniform2fv");
|
||||
lcUniform3fv = (PFNGLUNIFORM3FVPROC)Context->getProcAddress("glUniform3fv");
|
||||
lcUniform4fv = (PFNGLUNIFORM4FVPROC)Context->getProcAddress("glUniform4fv");
|
||||
lcUniform1iv = (PFNGLUNIFORM1IVPROC)Context->getProcAddress("glUniform1iv");
|
||||
lcUniform2iv = (PFNGLUNIFORM2IVPROC)Context->getProcAddress("glUniform2iv");
|
||||
lcUniform3iv = (PFNGLUNIFORM3IVPROC)Context->getProcAddress("glUniform3iv");
|
||||
lcUniform4iv = (PFNGLUNIFORM4IVPROC)Context->getProcAddress("glUniform4iv");
|
||||
lcUniformMatrix2fv = (PFNGLUNIFORMMATRIX2FVPROC)Context->getProcAddress("glUniformMatrix2fv");
|
||||
lcUniformMatrix3fv = (PFNGLUNIFORMMATRIX3FVPROC)Context->getProcAddress("glUniformMatrix3fv");
|
||||
lcUniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC)Context->getProcAddress("glUniformMatrix4fv");
|
||||
lcValidateProgram = (PFNGLVALIDATEPROGRAMPROC)Context->getProcAddress("glValidateProgram");
|
||||
lcVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC)Context->getProcAddress("glVertexAttribPointer");
|
||||
#endif
|
||||
gSupportsShaderObjects = true;
|
||||
}
|
||||
}
|
||||
|
||||
+229
-229
@@ -1,229 +1,229 @@
|
||||
#ifndef _LC_GLEXTENSIONS_H_
|
||||
#define _LC_GLEXTENSIONS_H_
|
||||
|
||||
void lcInitializeGLExtensions(const QGLContext* Context);
|
||||
|
||||
extern bool gSupportsShaderObjects;
|
||||
extern bool gSupportsVertexBufferObject;
|
||||
extern bool gSupportsFramebufferObjectARB;
|
||||
extern bool gSupportsFramebufferObjectEXT;
|
||||
extern bool gSupportsAnisotropic;
|
||||
extern GLfloat gMaxAnisotropy;
|
||||
|
||||
#ifndef Q_OS_MAC
|
||||
#define LC_LOAD_GLEXTENSIONS
|
||||
#endif
|
||||
|
||||
#ifdef LC_LOAD_GLEXTENSIONS
|
||||
|
||||
extern PFNGLBINDBUFFERARBPROC lcBindBufferARB;
|
||||
extern PFNGLDELETEBUFFERSARBPROC lcDeleteBuffersARB;
|
||||
extern PFNGLGENBUFFERSARBPROC lcGenBuffersARB;
|
||||
extern PFNGLISBUFFERARBPROC lcIsBufferARB;
|
||||
extern PFNGLBUFFERDATAARBPROC lcBufferDataARB;
|
||||
extern PFNGLBUFFERSUBDATAARBPROC lcBufferSubDataARB;
|
||||
extern PFNGLGETBUFFERSUBDATAARBPROC lcGetBufferSubDataARB;
|
||||
extern PFNGLMAPBUFFERARBPROC lcMapBufferARB;
|
||||
extern PFNGLUNMAPBUFFERARBPROC lcUnmapBufferARB;
|
||||
extern PFNGLGETBUFFERPARAMETERIVARBPROC lcGetBufferParameterivARB;
|
||||
extern PFNGLGETBUFFERPOINTERVARBPROC lcGetBufferPointervARB;
|
||||
|
||||
extern PFNGLISRENDERBUFFERPROC lcIsRenderbuffer;
|
||||
extern PFNGLBINDRENDERBUFFERPROC lcBindRenderbuffer;
|
||||
extern PFNGLDELETERENDERBUFFERSPROC lcDeleteRenderbuffers;
|
||||
extern PFNGLGENRENDERBUFFERSPROC lcGenRenderbuffers;
|
||||
extern PFNGLRENDERBUFFERSTORAGEPROC lcRenderbufferStorage;
|
||||
extern PFNGLGETRENDERBUFFERPARAMETERIVPROC lcGetRenderbufferParameteriv;
|
||||
extern PFNGLISFRAMEBUFFERPROC lcIsFramebuffer;
|
||||
extern PFNGLBINDFRAMEBUFFERPROC lcBindFramebuffer;
|
||||
extern PFNGLDELETEFRAMEBUFFERSPROC lcDeleteFramebuffers;
|
||||
extern PFNGLGENFRAMEBUFFERSPROC lcGenFramebuffers;
|
||||
extern PFNGLCHECKFRAMEBUFFERSTATUSPROC lcCheckFramebufferStatus;
|
||||
extern PFNGLFRAMEBUFFERTEXTURE1DPROC lcFramebufferTexture1D;
|
||||
extern PFNGLFRAMEBUFFERTEXTURE2DPROC lcFramebufferTexture2D;
|
||||
extern PFNGLFRAMEBUFFERTEXTURE3DPROC lcFramebufferTexture3D;
|
||||
extern PFNGLFRAMEBUFFERRENDERBUFFERPROC lcFramebufferRenderbuffer;
|
||||
extern PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC lcGetFramebufferAttachmentParameteriv;
|
||||
extern PFNGLGENERATEMIPMAPPROC lcGenerateMipmap;
|
||||
extern PFNGLBLITFRAMEBUFFERPROC lcBlitFramebuffer;
|
||||
extern PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC lcRenderbufferStorageMultisample;
|
||||
extern PFNGLFRAMEBUFFERTEXTURELAYERPROC lcFramebufferTextureLayer;
|
||||
|
||||
extern PFNGLISRENDERBUFFEREXTPROC lcIsRenderbufferEXT;
|
||||
extern PFNGLBINDRENDERBUFFEREXTPROC lcBindRenderbufferEXT;
|
||||
extern PFNGLDELETERENDERBUFFERSEXTPROC lcDeleteRenderbuffersEXT;
|
||||
extern PFNGLGENRENDERBUFFERSEXTPROC lcGenRenderbuffersEXT;
|
||||
extern PFNGLRENDERBUFFERSTORAGEEXTPROC lcRenderbufferStorageEXT;
|
||||
extern PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC lcGetRenderbufferParameterivEXT;
|
||||
extern PFNGLISFRAMEBUFFEREXTPROC lcIsFramebufferEXT;
|
||||
extern PFNGLBINDFRAMEBUFFEREXTPROC lcBindFramebufferEXT;
|
||||
extern PFNGLDELETEFRAMEBUFFERSEXTPROC lcDeleteFramebuffersEXT;
|
||||
extern PFNGLGENFRAMEBUFFERSEXTPROC lcGenFramebuffersEXT;
|
||||
extern PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC lcCheckFramebufferStatusEXT;
|
||||
extern PFNGLFRAMEBUFFERTEXTURE1DEXTPROC lcFramebufferTexture1DEXT;
|
||||
extern PFNGLFRAMEBUFFERTEXTURE2DEXTPROC lcFramebufferTexture2DEXT;
|
||||
extern PFNGLFRAMEBUFFERTEXTURE3DEXTPROC lcFramebufferTexture3DEXT;
|
||||
extern PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC lcFramebufferRenderbufferEXT;
|
||||
extern PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC lcGetFramebufferAttachmentParameterivEXT;
|
||||
extern PFNGLGENERATEMIPMAPEXTPROC lcGenerateMipmapEXT;
|
||||
|
||||
extern PFNGLATTACHSHADERPROC lcAttachShader;
|
||||
extern PFNGLBINDATTRIBLOCATIONPROC lcBindAttribLocation;
|
||||
extern PFNGLCOMPILESHADERPROC lcCompileShader;
|
||||
extern PFNGLCREATEPROGRAMPROC lcCreateProgram;
|
||||
extern PFNGLCREATESHADERPROC lcCreateShader;
|
||||
extern PFNGLDELETEPROGRAMPROC lcDeleteProgram;
|
||||
extern PFNGLDELETESHADERPROC lcDeleteShader;
|
||||
extern PFNGLDETACHSHADERPROC lcDetachShader;
|
||||
extern PFNGLDISABLEVERTEXATTRIBARRAYPROC lcDisableVertexAttribArray;
|
||||
extern PFNGLENABLEVERTEXATTRIBARRAYPROC lcEnableVertexAttribArray;
|
||||
extern PFNGLGETACTIVEATTRIBPROC lcGetActiveAttrib;
|
||||
extern PFNGLGETACTIVEUNIFORMPROC lcGetActiveUniform;
|
||||
extern PFNGLGETATTACHEDSHADERSPROC lcGetAttachedShaders;
|
||||
extern PFNGLGETATTRIBLOCATIONPROC lcGetAttribLocation;
|
||||
extern PFNGLGETPROGRAMIVPROC lcGetProgramiv;
|
||||
extern PFNGLGETPROGRAMINFOLOGPROC lcGetProgramInfoLog;
|
||||
extern PFNGLGETSHADERIVPROC lcGetShaderiv;
|
||||
extern PFNGLGETSHADERINFOLOGPROC lcGetShaderInfoLog;
|
||||
extern PFNGLGETSHADERSOURCEPROC lcGetShaderSource;
|
||||
extern PFNGLGETUNIFORMLOCATIONPROC lcGetUniformLocation;
|
||||
extern PFNGLGETUNIFORMFVPROC lcGetUniformfv;
|
||||
extern PFNGLGETUNIFORMIVPROC lcGetUniformiv;
|
||||
extern PFNGLGETVERTEXATTRIBDVPROC lcGetVertexAttribdv;
|
||||
extern PFNGLGETVERTEXATTRIBFVPROC lcGetVertexAttribfv;
|
||||
extern PFNGLGETVERTEXATTRIBIVPROC lcGetVertexAttribiv;
|
||||
extern PFNGLGETVERTEXATTRIBPOINTERVPROC lcGetVertexAttribPointerv;
|
||||
extern PFNGLISPROGRAMPROC lcIsProgram;
|
||||
extern PFNGLISSHADERPROC lcIsShader;
|
||||
extern PFNGLLINKPROGRAMPROC lcLinkProgram;
|
||||
extern PFNGLSHADERSOURCEPROC lcShaderSource;
|
||||
extern PFNGLUSEPROGRAMPROC lcUseProgram;
|
||||
extern PFNGLUNIFORM1FPROC lcUniform1f;
|
||||
extern PFNGLUNIFORM2FPROC lcUniform2f;
|
||||
extern PFNGLUNIFORM3FPROC lcUniform3f;
|
||||
extern PFNGLUNIFORM4FPROC lcUniform4f;
|
||||
extern PFNGLUNIFORM1IPROC lcUniform1i;
|
||||
extern PFNGLUNIFORM2IPROC lcUniform2i;
|
||||
extern PFNGLUNIFORM3IPROC lcUniform3i;
|
||||
extern PFNGLUNIFORM4IPROC lcUniform4i;
|
||||
extern PFNGLUNIFORM1FVPROC lcUniform1fv;
|
||||
extern PFNGLUNIFORM2FVPROC lcUniform2fv;
|
||||
extern PFNGLUNIFORM3FVPROC lcUniform3fv;
|
||||
extern PFNGLUNIFORM4FVPROC lcUniform4fv;
|
||||
extern PFNGLUNIFORM1IVPROC lcUniform1iv;
|
||||
extern PFNGLUNIFORM2IVPROC lcUniform2iv;
|
||||
extern PFNGLUNIFORM3IVPROC lcUniform3iv;
|
||||
extern PFNGLUNIFORM4IVPROC lcUniform4iv;
|
||||
extern PFNGLUNIFORMMATRIX2FVPROC lcUniformMatrix2fv;
|
||||
extern PFNGLUNIFORMMATRIX3FVPROC lcUniformMatrix3fv;
|
||||
extern PFNGLUNIFORMMATRIX4FVPROC lcUniformMatrix4fv;
|
||||
extern PFNGLVALIDATEPROGRAMPROC lcValidateProgram;
|
||||
extern PFNGLVERTEXATTRIBPOINTERPROC lcVertexAttribPointer;
|
||||
|
||||
#define glBindBuffer lcBindBufferARB
|
||||
#define glDeleteBuffers lcDeleteBuffersARB
|
||||
#define glGenBuffers lcGenBuffersARB
|
||||
#define glIsBuffer lcIsBufferARB
|
||||
#define glBufferData lcBufferDataARB
|
||||
#define glBufferSubData lcBufferSubDataARB
|
||||
#define glGetBufferSubData lcGetBufferSubDataARB
|
||||
#define glMapBuffer lcMapBufferARB
|
||||
#define glUnmapBuffer lcUnmapBufferARB
|
||||
#define glGetBufferParameteriv lcGetBufferParameterivARB
|
||||
#define glGetBufferPointerv lcGetBufferPointervARB
|
||||
|
||||
#define glIsRenderbuffer lcIsRenderbuffer
|
||||
#define glBindRenderbuffer lcBindRenderbuffer
|
||||
#define glDeleteRenderbuffers lcDeleteRenderbuffers
|
||||
#define glGenRenderbuffers lcGenRenderbuffers
|
||||
#define glRenderbufferStorage lcRenderbufferStorage
|
||||
#define glGetRenderbufferParameteriv lcGetRenderbufferParameteriv
|
||||
#define glIsFramebuffer lcIsFramebuffer
|
||||
#define glBindFramebuffer lcBindFramebuffer
|
||||
#define glDeleteFramebuffers lcDeleteFramebuffers
|
||||
#define glGenFramebuffers lcGenFramebuffers
|
||||
#define glCheckFramebufferStatus lcCheckFramebufferStatus
|
||||
#define glFramebufferTexture1D lcFramebufferTexture1D
|
||||
#define glFramebufferTexture2D lcFramebufferTexture2D
|
||||
#define glFramebufferTexture3D lcFramebufferTexture3D
|
||||
#define glFramebufferRenderbuffer lcFramebufferRenderbuffer
|
||||
#define glGetFramebufferAttachmentParameteriv lcGetFramebufferAttachmentParameteriv
|
||||
#define glGenerateMipmap lcGenerateMipmap
|
||||
#define glBlitFramebuffer lcBlitFramebuffer
|
||||
#define glRenderbufferStorageMultisample lcRenderbufferStorageMultisample
|
||||
#define glFramebufferTextureLayer lcFramebufferTextureLayer
|
||||
|
||||
#define glIsRenderbufferEXT lcIsRenderbufferEXT
|
||||
#define glBindRenderbufferEXT lcBindRenderbufferEXT
|
||||
#define glDeleteRenderbuffersEXT lcDeleteRenderbuffersEXT
|
||||
#define glGenRenderbuffersEXT lcGenRenderbuffersEXT
|
||||
#define glRenderbufferStorageEXT lcRenderbufferStorageEXT
|
||||
#define glGetRenderbufferParameterivEXT lcGetRenderbufferParameterivEXT
|
||||
#define glIsFramebufferEXT lcIsFramebufferEXT
|
||||
#define glBindFramebufferEXT lcBindFramebufferEXT
|
||||
#define glDeleteFramebuffersEXT lcDeleteFramebuffersEXT
|
||||
#define glGenFramebuffersEXT lcGenFramebuffersEXT
|
||||
#define glCheckFramebufferStatusEXT lcCheckFramebufferStatusEXT
|
||||
#define glFramebufferTexture1DEXT lcFramebufferTexture1DEXT
|
||||
#define glFramebufferTexture2DEXT lcFramebufferTexture2DEXT
|
||||
#define glFramebufferTexture3DEXT lcFramebufferTexture3DEXT
|
||||
#define glFramebufferRenderbufferEXT lcFramebufferRenderbufferEXT
|
||||
#define glGetFramebufferAttachmentParameterivEXT lcGetFramebufferAttachmentParameterivEXT
|
||||
#define glGenerateMipmapEXT lcGenerateMipmapEXT
|
||||
|
||||
#define glAttachShader lcAttachShader
|
||||
#define glBindAttribLocation lcBindAttribLocation
|
||||
#define glCompileShader lcCompileShader
|
||||
#define glCreateProgram lcCreateProgram
|
||||
#define glCreateShader lcCreateShader
|
||||
#define glDeleteProgram lcDeleteProgram
|
||||
#define glDeleteShader lcDeleteShader
|
||||
#define glDetachShader lcDetachShader
|
||||
#define glDisableVertexAttribArray lcDisableVertexAttribArray
|
||||
#define glEnableVertexAttribArray lcEnableVertexAttribArray
|
||||
#define glGetActiveAttrib lcGetActiveAttrib
|
||||
#define glGetActiveUniform lcGetActiveUniform
|
||||
#define glGetAttachedShaders lcGetAttachedShaders
|
||||
#define glGetAttribLocation lcGetAttribLocation
|
||||
#define glGetProgramiv lcGetProgramiv
|
||||
#define glGetProgramInfoLog lcGetProgramInfoLog
|
||||
#define glGetShaderiv lcGetShaderiv
|
||||
#define glGetShaderInfoLog lcGetShaderInfoLog
|
||||
#define glGetShaderSource lcGetShaderSource
|
||||
#define glGetUniformLocation lcGetUniformLocation
|
||||
#define glGetUniformfv lcGetUniformfv
|
||||
#define glGetUniformiv lcGetUniformiv
|
||||
#define glGetVertexAttribdv lcGetVertexAttribdv
|
||||
#define glGetVertexAttribfv lcGetVertexAttribfv
|
||||
#define glGetVertexAttribiv lcGetVertexAttribiv
|
||||
#define glGetVertexAttribPointerv lcGetVertexAttribPointerv
|
||||
#define glIsProgram lcIsProgram
|
||||
#define glIsShader lcIsShader
|
||||
#define glLinkProgram lcLinkProgram
|
||||
#define glShaderSource lcShaderSource
|
||||
#define glUseProgram lcUseProgram
|
||||
#define glUniform1f lcUniform1f
|
||||
#define glUniform2f lcUniform2f
|
||||
#define glUniform3f lcUniform3f
|
||||
#define glUniform4f lcUniform4f
|
||||
#define glUniform1i lcUniform1i
|
||||
#define glUniform2i lcUniform2i
|
||||
#define glUniform3i lcUniform3i
|
||||
#define glUniform4i lcUniform4i
|
||||
#define glUniform1fv lcUniform1fv
|
||||
#define glUniform2fv lcUniform2fv
|
||||
#define glUniform3fv lcUniform3fv
|
||||
#define glUniform4fv lcUniform4fv
|
||||
#define glUniform1iv lcUniform1iv
|
||||
#define glUniform2iv lcUniform2iv
|
||||
#define glUniform3iv lcUniform3iv
|
||||
#define glUniform4iv lcUniform4iv
|
||||
#define glUniformMatrix2fv lcUniformMatrix2fv
|
||||
#define glUniformMatrix3fv lcUniformMatrix3fv
|
||||
#define glUniformMatrix4fv lcUniformMatrix4fv
|
||||
#define glValidateProgram lcValidateProgram
|
||||
#define glVertexAttribPointer lcVertexAttribPointer
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
#ifndef _LC_GLEXTENSIONS_H_
|
||||
#define _LC_GLEXTENSIONS_H_
|
||||
|
||||
void lcInitializeGLExtensions(const QGLContext* Context);
|
||||
|
||||
extern bool gSupportsShaderObjects;
|
||||
extern bool gSupportsVertexBufferObject;
|
||||
extern bool gSupportsFramebufferObjectARB;
|
||||
extern bool gSupportsFramebufferObjectEXT;
|
||||
extern bool gSupportsAnisotropic;
|
||||
extern GLfloat gMaxAnisotropy;
|
||||
|
||||
#ifndef Q_OS_MAC
|
||||
#define LC_LOAD_GLEXTENSIONS
|
||||
#endif
|
||||
|
||||
#ifdef LC_LOAD_GLEXTENSIONS
|
||||
|
||||
extern PFNGLBINDBUFFERARBPROC lcBindBufferARB;
|
||||
extern PFNGLDELETEBUFFERSARBPROC lcDeleteBuffersARB;
|
||||
extern PFNGLGENBUFFERSARBPROC lcGenBuffersARB;
|
||||
extern PFNGLISBUFFERARBPROC lcIsBufferARB;
|
||||
extern PFNGLBUFFERDATAARBPROC lcBufferDataARB;
|
||||
extern PFNGLBUFFERSUBDATAARBPROC lcBufferSubDataARB;
|
||||
extern PFNGLGETBUFFERSUBDATAARBPROC lcGetBufferSubDataARB;
|
||||
extern PFNGLMAPBUFFERARBPROC lcMapBufferARB;
|
||||
extern PFNGLUNMAPBUFFERARBPROC lcUnmapBufferARB;
|
||||
extern PFNGLGETBUFFERPARAMETERIVARBPROC lcGetBufferParameterivARB;
|
||||
extern PFNGLGETBUFFERPOINTERVARBPROC lcGetBufferPointervARB;
|
||||
|
||||
extern PFNGLISRENDERBUFFERPROC lcIsRenderbuffer;
|
||||
extern PFNGLBINDRENDERBUFFERPROC lcBindRenderbuffer;
|
||||
extern PFNGLDELETERENDERBUFFERSPROC lcDeleteRenderbuffers;
|
||||
extern PFNGLGENRENDERBUFFERSPROC lcGenRenderbuffers;
|
||||
extern PFNGLRENDERBUFFERSTORAGEPROC lcRenderbufferStorage;
|
||||
extern PFNGLGETRENDERBUFFERPARAMETERIVPROC lcGetRenderbufferParameteriv;
|
||||
extern PFNGLISFRAMEBUFFERPROC lcIsFramebuffer;
|
||||
extern PFNGLBINDFRAMEBUFFERPROC lcBindFramebuffer;
|
||||
extern PFNGLDELETEFRAMEBUFFERSPROC lcDeleteFramebuffers;
|
||||
extern PFNGLGENFRAMEBUFFERSPROC lcGenFramebuffers;
|
||||
extern PFNGLCHECKFRAMEBUFFERSTATUSPROC lcCheckFramebufferStatus;
|
||||
extern PFNGLFRAMEBUFFERTEXTURE1DPROC lcFramebufferTexture1D;
|
||||
extern PFNGLFRAMEBUFFERTEXTURE2DPROC lcFramebufferTexture2D;
|
||||
extern PFNGLFRAMEBUFFERTEXTURE3DPROC lcFramebufferTexture3D;
|
||||
extern PFNGLFRAMEBUFFERRENDERBUFFERPROC lcFramebufferRenderbuffer;
|
||||
extern PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC lcGetFramebufferAttachmentParameteriv;
|
||||
extern PFNGLGENERATEMIPMAPPROC lcGenerateMipmap;
|
||||
extern PFNGLBLITFRAMEBUFFERPROC lcBlitFramebuffer;
|
||||
extern PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC lcRenderbufferStorageMultisample;
|
||||
extern PFNGLFRAMEBUFFERTEXTURELAYERPROC lcFramebufferTextureLayer;
|
||||
|
||||
extern PFNGLISRENDERBUFFEREXTPROC lcIsRenderbufferEXT;
|
||||
extern PFNGLBINDRENDERBUFFEREXTPROC lcBindRenderbufferEXT;
|
||||
extern PFNGLDELETERENDERBUFFERSEXTPROC lcDeleteRenderbuffersEXT;
|
||||
extern PFNGLGENRENDERBUFFERSEXTPROC lcGenRenderbuffersEXT;
|
||||
extern PFNGLRENDERBUFFERSTORAGEEXTPROC lcRenderbufferStorageEXT;
|
||||
extern PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC lcGetRenderbufferParameterivEXT;
|
||||
extern PFNGLISFRAMEBUFFEREXTPROC lcIsFramebufferEXT;
|
||||
extern PFNGLBINDFRAMEBUFFEREXTPROC lcBindFramebufferEXT;
|
||||
extern PFNGLDELETEFRAMEBUFFERSEXTPROC lcDeleteFramebuffersEXT;
|
||||
extern PFNGLGENFRAMEBUFFERSEXTPROC lcGenFramebuffersEXT;
|
||||
extern PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC lcCheckFramebufferStatusEXT;
|
||||
extern PFNGLFRAMEBUFFERTEXTURE1DEXTPROC lcFramebufferTexture1DEXT;
|
||||
extern PFNGLFRAMEBUFFERTEXTURE2DEXTPROC lcFramebufferTexture2DEXT;
|
||||
extern PFNGLFRAMEBUFFERTEXTURE3DEXTPROC lcFramebufferTexture3DEXT;
|
||||
extern PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC lcFramebufferRenderbufferEXT;
|
||||
extern PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC lcGetFramebufferAttachmentParameterivEXT;
|
||||
extern PFNGLGENERATEMIPMAPEXTPROC lcGenerateMipmapEXT;
|
||||
|
||||
extern PFNGLATTACHSHADERPROC lcAttachShader;
|
||||
extern PFNGLBINDATTRIBLOCATIONPROC lcBindAttribLocation;
|
||||
extern PFNGLCOMPILESHADERPROC lcCompileShader;
|
||||
extern PFNGLCREATEPROGRAMPROC lcCreateProgram;
|
||||
extern PFNGLCREATESHADERPROC lcCreateShader;
|
||||
extern PFNGLDELETEPROGRAMPROC lcDeleteProgram;
|
||||
extern PFNGLDELETESHADERPROC lcDeleteShader;
|
||||
extern PFNGLDETACHSHADERPROC lcDetachShader;
|
||||
extern PFNGLDISABLEVERTEXATTRIBARRAYPROC lcDisableVertexAttribArray;
|
||||
extern PFNGLENABLEVERTEXATTRIBARRAYPROC lcEnableVertexAttribArray;
|
||||
extern PFNGLGETACTIVEATTRIBPROC lcGetActiveAttrib;
|
||||
extern PFNGLGETACTIVEUNIFORMPROC lcGetActiveUniform;
|
||||
extern PFNGLGETATTACHEDSHADERSPROC lcGetAttachedShaders;
|
||||
extern PFNGLGETATTRIBLOCATIONPROC lcGetAttribLocation;
|
||||
extern PFNGLGETPROGRAMIVPROC lcGetProgramiv;
|
||||
extern PFNGLGETPROGRAMINFOLOGPROC lcGetProgramInfoLog;
|
||||
extern PFNGLGETSHADERIVPROC lcGetShaderiv;
|
||||
extern PFNGLGETSHADERINFOLOGPROC lcGetShaderInfoLog;
|
||||
extern PFNGLGETSHADERSOURCEPROC lcGetShaderSource;
|
||||
extern PFNGLGETUNIFORMLOCATIONPROC lcGetUniformLocation;
|
||||
extern PFNGLGETUNIFORMFVPROC lcGetUniformfv;
|
||||
extern PFNGLGETUNIFORMIVPROC lcGetUniformiv;
|
||||
extern PFNGLGETVERTEXATTRIBDVPROC lcGetVertexAttribdv;
|
||||
extern PFNGLGETVERTEXATTRIBFVPROC lcGetVertexAttribfv;
|
||||
extern PFNGLGETVERTEXATTRIBIVPROC lcGetVertexAttribiv;
|
||||
extern PFNGLGETVERTEXATTRIBPOINTERVPROC lcGetVertexAttribPointerv;
|
||||
extern PFNGLISPROGRAMPROC lcIsProgram;
|
||||
extern PFNGLISSHADERPROC lcIsShader;
|
||||
extern PFNGLLINKPROGRAMPROC lcLinkProgram;
|
||||
extern PFNGLSHADERSOURCEPROC lcShaderSource;
|
||||
extern PFNGLUSEPROGRAMPROC lcUseProgram;
|
||||
extern PFNGLUNIFORM1FPROC lcUniform1f;
|
||||
extern PFNGLUNIFORM2FPROC lcUniform2f;
|
||||
extern PFNGLUNIFORM3FPROC lcUniform3f;
|
||||
extern PFNGLUNIFORM4FPROC lcUniform4f;
|
||||
extern PFNGLUNIFORM1IPROC lcUniform1i;
|
||||
extern PFNGLUNIFORM2IPROC lcUniform2i;
|
||||
extern PFNGLUNIFORM3IPROC lcUniform3i;
|
||||
extern PFNGLUNIFORM4IPROC lcUniform4i;
|
||||
extern PFNGLUNIFORM1FVPROC lcUniform1fv;
|
||||
extern PFNGLUNIFORM2FVPROC lcUniform2fv;
|
||||
extern PFNGLUNIFORM3FVPROC lcUniform3fv;
|
||||
extern PFNGLUNIFORM4FVPROC lcUniform4fv;
|
||||
extern PFNGLUNIFORM1IVPROC lcUniform1iv;
|
||||
extern PFNGLUNIFORM2IVPROC lcUniform2iv;
|
||||
extern PFNGLUNIFORM3IVPROC lcUniform3iv;
|
||||
extern PFNGLUNIFORM4IVPROC lcUniform4iv;
|
||||
extern PFNGLUNIFORMMATRIX2FVPROC lcUniformMatrix2fv;
|
||||
extern PFNGLUNIFORMMATRIX3FVPROC lcUniformMatrix3fv;
|
||||
extern PFNGLUNIFORMMATRIX4FVPROC lcUniformMatrix4fv;
|
||||
extern PFNGLVALIDATEPROGRAMPROC lcValidateProgram;
|
||||
extern PFNGLVERTEXATTRIBPOINTERPROC lcVertexAttribPointer;
|
||||
|
||||
#define glBindBuffer lcBindBufferARB
|
||||
#define glDeleteBuffers lcDeleteBuffersARB
|
||||
#define glGenBuffers lcGenBuffersARB
|
||||
#define glIsBuffer lcIsBufferARB
|
||||
#define glBufferData lcBufferDataARB
|
||||
#define glBufferSubData lcBufferSubDataARB
|
||||
#define glGetBufferSubData lcGetBufferSubDataARB
|
||||
#define glMapBuffer lcMapBufferARB
|
||||
#define glUnmapBuffer lcUnmapBufferARB
|
||||
#define glGetBufferParameteriv lcGetBufferParameterivARB
|
||||
#define glGetBufferPointerv lcGetBufferPointervARB
|
||||
|
||||
#define glIsRenderbuffer lcIsRenderbuffer
|
||||
#define glBindRenderbuffer lcBindRenderbuffer
|
||||
#define glDeleteRenderbuffers lcDeleteRenderbuffers
|
||||
#define glGenRenderbuffers lcGenRenderbuffers
|
||||
#define glRenderbufferStorage lcRenderbufferStorage
|
||||
#define glGetRenderbufferParameteriv lcGetRenderbufferParameteriv
|
||||
#define glIsFramebuffer lcIsFramebuffer
|
||||
#define glBindFramebuffer lcBindFramebuffer
|
||||
#define glDeleteFramebuffers lcDeleteFramebuffers
|
||||
#define glGenFramebuffers lcGenFramebuffers
|
||||
#define glCheckFramebufferStatus lcCheckFramebufferStatus
|
||||
#define glFramebufferTexture1D lcFramebufferTexture1D
|
||||
#define glFramebufferTexture2D lcFramebufferTexture2D
|
||||
#define glFramebufferTexture3D lcFramebufferTexture3D
|
||||
#define glFramebufferRenderbuffer lcFramebufferRenderbuffer
|
||||
#define glGetFramebufferAttachmentParameteriv lcGetFramebufferAttachmentParameteriv
|
||||
#define glGenerateMipmap lcGenerateMipmap
|
||||
#define glBlitFramebuffer lcBlitFramebuffer
|
||||
#define glRenderbufferStorageMultisample lcRenderbufferStorageMultisample
|
||||
#define glFramebufferTextureLayer lcFramebufferTextureLayer
|
||||
|
||||
#define glIsRenderbufferEXT lcIsRenderbufferEXT
|
||||
#define glBindRenderbufferEXT lcBindRenderbufferEXT
|
||||
#define glDeleteRenderbuffersEXT lcDeleteRenderbuffersEXT
|
||||
#define glGenRenderbuffersEXT lcGenRenderbuffersEXT
|
||||
#define glRenderbufferStorageEXT lcRenderbufferStorageEXT
|
||||
#define glGetRenderbufferParameterivEXT lcGetRenderbufferParameterivEXT
|
||||
#define glIsFramebufferEXT lcIsFramebufferEXT
|
||||
#define glBindFramebufferEXT lcBindFramebufferEXT
|
||||
#define glDeleteFramebuffersEXT lcDeleteFramebuffersEXT
|
||||
#define glGenFramebuffersEXT lcGenFramebuffersEXT
|
||||
#define glCheckFramebufferStatusEXT lcCheckFramebufferStatusEXT
|
||||
#define glFramebufferTexture1DEXT lcFramebufferTexture1DEXT
|
||||
#define glFramebufferTexture2DEXT lcFramebufferTexture2DEXT
|
||||
#define glFramebufferTexture3DEXT lcFramebufferTexture3DEXT
|
||||
#define glFramebufferRenderbufferEXT lcFramebufferRenderbufferEXT
|
||||
#define glGetFramebufferAttachmentParameterivEXT lcGetFramebufferAttachmentParameterivEXT
|
||||
#define glGenerateMipmapEXT lcGenerateMipmapEXT
|
||||
|
||||
#define glAttachShader lcAttachShader
|
||||
#define glBindAttribLocation lcBindAttribLocation
|
||||
#define glCompileShader lcCompileShader
|
||||
#define glCreateProgram lcCreateProgram
|
||||
#define glCreateShader lcCreateShader
|
||||
#define glDeleteProgram lcDeleteProgram
|
||||
#define glDeleteShader lcDeleteShader
|
||||
#define glDetachShader lcDetachShader
|
||||
#define glDisableVertexAttribArray lcDisableVertexAttribArray
|
||||
#define glEnableVertexAttribArray lcEnableVertexAttribArray
|
||||
#define glGetActiveAttrib lcGetActiveAttrib
|
||||
#define glGetActiveUniform lcGetActiveUniform
|
||||
#define glGetAttachedShaders lcGetAttachedShaders
|
||||
#define glGetAttribLocation lcGetAttribLocation
|
||||
#define glGetProgramiv lcGetProgramiv
|
||||
#define glGetProgramInfoLog lcGetProgramInfoLog
|
||||
#define glGetShaderiv lcGetShaderiv
|
||||
#define glGetShaderInfoLog lcGetShaderInfoLog
|
||||
#define glGetShaderSource lcGetShaderSource
|
||||
#define glGetUniformLocation lcGetUniformLocation
|
||||
#define glGetUniformfv lcGetUniformfv
|
||||
#define glGetUniformiv lcGetUniformiv
|
||||
#define glGetVertexAttribdv lcGetVertexAttribdv
|
||||
#define glGetVertexAttribfv lcGetVertexAttribfv
|
||||
#define glGetVertexAttribiv lcGetVertexAttribiv
|
||||
#define glGetVertexAttribPointerv lcGetVertexAttribPointerv
|
||||
#define glIsProgram lcIsProgram
|
||||
#define glIsShader lcIsShader
|
||||
#define glLinkProgram lcLinkProgram
|
||||
#define glShaderSource lcShaderSource
|
||||
#define glUseProgram lcUseProgram
|
||||
#define glUniform1f lcUniform1f
|
||||
#define glUniform2f lcUniform2f
|
||||
#define glUniform3f lcUniform3f
|
||||
#define glUniform4f lcUniform4f
|
||||
#define glUniform1i lcUniform1i
|
||||
#define glUniform2i lcUniform2i
|
||||
#define glUniform3i lcUniform3i
|
||||
#define glUniform4i lcUniform4i
|
||||
#define glUniform1fv lcUniform1fv
|
||||
#define glUniform2fv lcUniform2fv
|
||||
#define glUniform3fv lcUniform3fv
|
||||
#define glUniform4fv lcUniform4fv
|
||||
#define glUniform1iv lcUniform1iv
|
||||
#define glUniform2iv lcUniform2iv
|
||||
#define glUniform3iv lcUniform3iv
|
||||
#define glUniform4iv lcUniform4iv
|
||||
#define glUniformMatrix2fv lcUniformMatrix2fv
|
||||
#define glUniformMatrix3fv lcUniformMatrix3fv
|
||||
#define glUniformMatrix4fv lcUniformMatrix4fv
|
||||
#define glValidateProgram lcValidateProgram
|
||||
#define glVertexAttribPointer lcVertexAttribPointer
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1425,9 +1425,9 @@ bool lcPiecesLibrary::LoadAndInlineFile(const char* FileName, lcMemFile& File)
|
||||
TempProject.Save(Stream);
|
||||
Stream.flush();
|
||||
|
||||
File.Seek(0, SEEK_SET);
|
||||
File.WriteBuffer(Data.constData(), Data.size());
|
||||
File.Seek(0, SEEK_SET);
|
||||
File.Seek(0, SEEK_SET);
|
||||
File.WriteBuffer(Data.constData(), Data.size());
|
||||
File.Seek(0, SEEK_SET);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
+3982
-3982
File diff suppressed because it is too large
Load Diff
+361
-361
@@ -1,361 +1,361 @@
|
||||
#ifndef _LC_MODEL_H_
|
||||
#define _LC_MODEL_H_
|
||||
|
||||
#include "lc_math.h"
|
||||
#include "object.h"
|
||||
#include "lc_commands.h"
|
||||
|
||||
#define LC_SEL_NO_PIECES 0x0001 // No pieces in model
|
||||
#define LC_SEL_PIECE 0x0002 // At last 1 piece selected
|
||||
#define LC_SEL_SELECTED 0x0004 // At last 1 object selected
|
||||
#define LC_SEL_UNSELECTED 0x0008 // At least 1 piece unselected
|
||||
#define LC_SEL_HIDDEN 0x0010 // At least one piece hidden
|
||||
#define LC_SEL_HIDDEN_SELECTED 0x0020 // At least one piece selected is hidden
|
||||
#define LC_SEL_VISIBLE_SELECTED 0x0040 // At least one piece selected is not hidden
|
||||
#define LC_SEL_GROUPED 0x0080 // At least one piece selected is grouped
|
||||
#define LC_SEL_FOCUS_GROUPED 0x0100 // Focused piece is grouped
|
||||
#define LC_SEL_CAN_GROUP 0x0200 // Can make a new group
|
||||
#define LC_SEL_MODEL_SELECTED 0x0400 // At least one model reference is selected
|
||||
#define LC_SEL_CAN_ADD_CONTROL_POINT 0x0800 // Can add control points to focused piece
|
||||
#define LC_SEL_CAN_REMOVE_CONTROL_POINT 0x1000 // Can remove control points from focused piece
|
||||
|
||||
enum lcTransformType
|
||||
{
|
||||
LC_TRANSFORM_ABSOLUTE_TRANSLATION,
|
||||
LC_TRANSFORM_RELATIVE_TRANSLATION,
|
||||
LC_TRANSFORM_ABSOLUTE_ROTATION,
|
||||
LC_TRANSFORM_RELATIVE_ROTATION
|
||||
};
|
||||
|
||||
enum lcBackgroundType
|
||||
{
|
||||
LC_BACKGROUND_SOLID,
|
||||
LC_BACKGROUND_GRADIENT,
|
||||
LC_BACKGROUND_IMAGE
|
||||
};
|
||||
|
||||
class lcModelProperties
|
||||
{
|
||||
public:
|
||||
void LoadDefaults();
|
||||
void SaveDefaults();
|
||||
|
||||
bool operator==(const lcModelProperties& Properties)
|
||||
{
|
||||
if (mName != Properties.mName || mAuthor != Properties.mAuthor ||
|
||||
mDescription != Properties.mDescription || mComments != Properties.mComments)
|
||||
return false;
|
||||
|
||||
if (mBackgroundType != Properties.mBackgroundType || mBackgroundSolidColor != Properties.mBackgroundSolidColor ||
|
||||
mBackgroundGradientColor1 != Properties.mBackgroundGradientColor1 || mBackgroundGradientColor2 != Properties.mBackgroundGradientColor2 ||
|
||||
mBackgroundImage != Properties.mBackgroundImage || mBackgroundImageTile != Properties.mBackgroundImageTile)
|
||||
return false;
|
||||
|
||||
if (mFogEnabled != Properties.mFogEnabled || mFogDensity != Properties.mFogDensity ||
|
||||
mFogColor != Properties.mFogColor || mAmbientColor != Properties.mAmbientColor)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void SaveLDraw(QTextStream& Stream) const;
|
||||
void ParseLDrawLine(QTextStream& Stream);
|
||||
|
||||
QString mName;
|
||||
QString mAuthor;
|
||||
QString mDescription;
|
||||
QString mComments;
|
||||
|
||||
lcBackgroundType mBackgroundType;
|
||||
lcVector3 mBackgroundSolidColor;
|
||||
lcVector3 mBackgroundGradientColor1;
|
||||
lcVector3 mBackgroundGradientColor2;
|
||||
QString mBackgroundImage;
|
||||
bool mBackgroundImageTile;
|
||||
|
||||
bool mFogEnabled;
|
||||
float mFogDensity;
|
||||
lcVector3 mFogColor;
|
||||
lcVector3 mAmbientColor;
|
||||
};
|
||||
|
||||
struct lcModelHistoryEntry
|
||||
{
|
||||
QByteArray File;
|
||||
QString Description;
|
||||
};
|
||||
|
||||
struct lcPartsListEntry
|
||||
{
|
||||
PieceInfo* Info;
|
||||
int ColorIndex;
|
||||
int Count;
|
||||
};
|
||||
|
||||
struct lcModelPartsEntry
|
||||
{
|
||||
lcMatrix44 WorldMatrix;
|
||||
PieceInfo* Info;
|
||||
int ColorIndex;
|
||||
};
|
||||
|
||||
class lcModel
|
||||
{
|
||||
public:
|
||||
lcModel(const QString& Name);
|
||||
~lcModel();
|
||||
|
||||
bool IsModified() const
|
||||
{
|
||||
return mSavedHistory != mUndoHistory[0];
|
||||
}
|
||||
|
||||
bool IncludesModel(const lcModel* Model) const;
|
||||
void CreatePieceInfo(Project* Project);
|
||||
void UpdatePieceInfo(lcArray<lcModel*>& UpdatedModels);
|
||||
|
||||
PieceInfo* GetPieceInfo() const
|
||||
{
|
||||
return mPieceInfo;
|
||||
}
|
||||
|
||||
const lcArray<lcPiece*>& GetPieces() const
|
||||
{
|
||||
return mPieces;
|
||||
}
|
||||
|
||||
const lcArray<lcCamera*>& GetCameras() const
|
||||
{
|
||||
return mCameras;
|
||||
}
|
||||
|
||||
const lcArray<lcLight*>& GetLights() const
|
||||
{
|
||||
return mLights;
|
||||
}
|
||||
|
||||
const lcArray<lcGroup*>& GetGroups() const
|
||||
{
|
||||
return mGroups;
|
||||
}
|
||||
|
||||
const lcModelProperties& GetProperties() const
|
||||
{
|
||||
return mProperties;
|
||||
}
|
||||
|
||||
void SetName(const QString& Name)
|
||||
{
|
||||
mProperties.mName = Name;
|
||||
}
|
||||
|
||||
const QStringList& GetFileLines() const
|
||||
{
|
||||
return mFileLines;
|
||||
}
|
||||
|
||||
lcStep GetLastStep() const;
|
||||
|
||||
lcStep GetCurrentStep() const
|
||||
{
|
||||
return mCurrentStep;
|
||||
}
|
||||
|
||||
void SetActive(bool Active);
|
||||
void CalculateStep(lcStep Step);
|
||||
void SetCurrentStep(lcStep Step);
|
||||
void SetTemporaryStep(lcStep Step)
|
||||
{
|
||||
mCurrentStep = Step;
|
||||
CalculateStep(Step);
|
||||
}
|
||||
|
||||
void ShowFirstStep();
|
||||
void ShowLastStep();
|
||||
void ShowPreviousStep();
|
||||
void ShowNextStep();
|
||||
void InsertStep(lcStep Step);
|
||||
void RemoveStep(lcStep Step);
|
||||
|
||||
void AddPiece();
|
||||
void DeleteAllCameras();
|
||||
void DeleteSelectedObjects();
|
||||
void ResetSelectedPiecesPivotPoint();
|
||||
void InsertControlPoint();
|
||||
void RemoveFocusedControlPoint();
|
||||
void ShowSelectedPiecesEarlier();
|
||||
void ShowSelectedPiecesLater();
|
||||
void SetPieceSteps(const QList<QPair<lcPiece*, lcStep>>& PieceSteps);
|
||||
|
||||
void MoveSelectionToModel(lcModel* Model);
|
||||
void InlineAllModels();
|
||||
void InlineSelectedModels();
|
||||
|
||||
lcGroup* AddGroup(const QString& Prefix, lcGroup* Parent);
|
||||
lcGroup* GetGroup(const QString& Name, bool CreateIfMissing);
|
||||
void RemoveGroup(lcGroup* Group);
|
||||
void GroupSelection();
|
||||
void UngroupSelection();
|
||||
void AddSelectedPiecesToGroup();
|
||||
void RemoveFocusPieceFromGroup();
|
||||
void ShowEditGroupsDialog();
|
||||
|
||||
void SaveLDraw(QTextStream& Stream, bool SelectedOnly) const;
|
||||
void LoadLDraw(QIODevice& Device, Project* Project);
|
||||
bool LoadBinary(lcFile* File);
|
||||
void Merge(lcModel* Other);
|
||||
|
||||
void SetSaved()
|
||||
{
|
||||
if (mUndoHistory.IsEmpty())
|
||||
SaveCheckpoint(QString());
|
||||
|
||||
mSavedHistory = mUndoHistory[0];
|
||||
}
|
||||
|
||||
void Cut();
|
||||
void Copy();
|
||||
void Paste();
|
||||
|
||||
void GetScene(lcScene& Scene, lcCamera* ViewCamera, bool DrawInterface) const;
|
||||
void SubModelAddRenderMeshes(lcScene& Scene, const lcMatrix44& WorldMatrix, int DefaultColorIndex, bool Focused, bool Selected) const;
|
||||
void DrawBackground(lcContext* Context);
|
||||
void SaveStepImages(const QString& BaseName, int Width, int Height, lcStep Start, lcStep End);
|
||||
|
||||
void RayTest(lcObjectRayTest& ObjectRayTest) const;
|
||||
void BoxTest(lcObjectBoxTest& ObjectBoxTest) const;
|
||||
bool SubModelMinIntersectDist(const lcVector3& WorldStart, const lcVector3& WorldEnd, float& MinDistance) const;
|
||||
bool SubModelBoxTest(const lcVector4 Planes[6]) const;
|
||||
|
||||
bool AnyPiecesSelected() const;
|
||||
bool AnyObjectsSelected() const;
|
||||
lcModel* GetFirstSelectedSubmodel() const;
|
||||
void GetSubModels(lcArray<lcModel*> SubModels) const;
|
||||
bool GetMoveRotateTransform(lcVector3& Center, lcMatrix33& RelativeRotation) const;
|
||||
bool GetPieceFocusOrSelectionCenter(lcVector3& Center) const;
|
||||
lcVector3 GetSelectionOrModelCenter() const;
|
||||
bool GetFocusPosition(lcVector3& Position) const;
|
||||
lcObject* GetFocusObject() const;
|
||||
bool GetSelectionCenter(lcVector3& Center) const;
|
||||
bool GetPiecesBoundingBox(lcVector3& Min, lcVector3& Max) const;
|
||||
void GetPartsList(int DefaultColorIndex, lcArray<lcPartsListEntry>& PartsList) const;
|
||||
void GetPartsListForStep(lcStep Step, int DefaultColorIndex, lcArray<lcPartsListEntry>& PartsList) const;
|
||||
void GetModelParts(const lcMatrix44& WorldMatrix, int DefaultColorIndex, lcArray<lcModelPartsEntry>& ModelParts) const;
|
||||
void GetSelectionInformation(int* Flags, lcArray<lcObject*>& Selection, lcObject** Focus) const;
|
||||
|
||||
void FocusOrDeselectObject(const lcObjectSection& ObjectSection);
|
||||
void ClearSelection(bool UpdateInterface);
|
||||
void ClearSelectionAndSetFocus(lcObject* Object, lcuint32 Section);
|
||||
void ClearSelectionAndSetFocus(const lcObjectSection& ObjectSection);
|
||||
void SetSelectionAndFocus(const lcArray<lcObject*>& Selection, lcObject* Focus, lcuint32 Section);
|
||||
void AddToSelection(const lcArray<lcObject*>& Objects);
|
||||
void SelectAllPieces();
|
||||
void InvertSelection();
|
||||
|
||||
void HideSelectedPieces();
|
||||
void HideUnselectedPieces();
|
||||
void UnhideSelectedPieces();
|
||||
void UnhideAllPieces();
|
||||
|
||||
void FindPiece(bool FindFirst, bool SearchForward);
|
||||
|
||||
void UndoAction();
|
||||
void RedoAction();
|
||||
|
||||
lcVector3 LockVector(const lcVector3& Vector) const;
|
||||
lcVector3 SnapPosition(const lcVector3& Delta) const;
|
||||
lcVector3 SnapRotation(const lcVector3& Delta) const;
|
||||
lcMatrix33 GetRelativeRotation() const;
|
||||
|
||||
const lcVector3& GetMouseToolDistance() const
|
||||
{
|
||||
return mMouseToolDistance;
|
||||
}
|
||||
|
||||
void BeginMouseTool();
|
||||
void EndMouseTool(lcTool Tool, bool Accept);
|
||||
void InsertPieceToolClicked(const lcMatrix44& WorldMatrix);
|
||||
void PointLightToolClicked(const lcVector3& Position);
|
||||
void BeginSpotLightTool(const lcVector3& Position, const lcVector3& Target);
|
||||
void UpdateSpotLightTool(const lcVector3& Position);
|
||||
void BeginCameraTool(const lcVector3& Position, const lcVector3& Target);
|
||||
void UpdateCameraTool(const lcVector3& Position);
|
||||
void UpdateMoveTool(const lcVector3& Distance, bool AlternateButtonDrag);
|
||||
void UpdateRotateTool(const lcVector3& Angles, bool AlternateButtonDrag);
|
||||
void UpdateScaleTool(const float Scale);
|
||||
void EraserToolClicked(lcObject* Object);
|
||||
void PaintToolClicked(lcObject* Object);
|
||||
void UpdateZoomTool(lcCamera* Camera, float Mouse);
|
||||
void UpdatePanTool(lcCamera* Camera, const lcVector3& Distance);
|
||||
void UpdateOrbitTool(lcCamera* Camera, float MouseX, float MouseY);
|
||||
void UpdateRollTool(lcCamera* Camera, float Mouse);
|
||||
void ZoomRegionToolClicked(lcCamera* Camera, float AspectRatio, const lcVector3& Position, const lcVector3& TargetPosition, const lcVector3* Corners);
|
||||
void LookAt(lcCamera* Camera);
|
||||
void ZoomExtents(lcCamera* Camera, float Aspect);
|
||||
void Zoom(lcCamera* Camera, float Amount);
|
||||
|
||||
void MoveSelectedObjects(const lcVector3& Distance, bool Relative, bool AlternateButtonDrag, bool Update, bool Checkpoint)
|
||||
{
|
||||
MoveSelectedObjects(Distance, Distance, Relative, AlternateButtonDrag, Update, Checkpoint);
|
||||
}
|
||||
|
||||
void MoveSelectedObjects(const lcVector3& PieceDistance, const lcVector3& ObjectDistance, bool Relative, bool AlternateButtonDrag, bool Update, bool Checkpoint);
|
||||
void RotateSelectedPieces(const lcVector3& Angles, bool Relative, bool AlternateButtonDrag, bool Update, bool Checkpoint);
|
||||
void ScaleSelectedPieces(const float Scale, bool Update, bool Checkpoint);
|
||||
void TransformSelectedObjects(lcTransformType TransformType, const lcVector3& Transform);
|
||||
void SetSelectedPiecesColorIndex(int ColorIndex);
|
||||
void SetSelectedPiecesPieceInfo(PieceInfo* Info);
|
||||
void SetSelectedPiecesStepShow(lcStep Step);
|
||||
void SetSelectedPiecesStepHide(lcStep Step);
|
||||
|
||||
void SetCameraOrthographic(lcCamera* Camera, bool Ortho);
|
||||
void SetCameraFOV(lcCamera* Camera, float FOV);
|
||||
void SetCameraZNear(lcCamera* Camera, float ZNear);
|
||||
void SetCameraZFar(lcCamera* Camera, float ZFar);
|
||||
void SetCameraName(lcCamera* Camera, const char* Name);
|
||||
|
||||
void ShowPropertiesDialog();
|
||||
void ShowSelectByNameDialog();
|
||||
void ShowArrayDialog();
|
||||
void ShowMinifigDialog();
|
||||
void UpdateInterface();
|
||||
|
||||
protected:
|
||||
void DeleteModel();
|
||||
void DeleteHistory();
|
||||
void SaveCheckpoint(const QString& Description);
|
||||
void LoadCheckPoint(lcModelHistoryEntry* CheckPoint);
|
||||
|
||||
QString GetGroupName(const QString& Prefix);
|
||||
void RemoveEmptyGroups();
|
||||
bool RemoveSelectedObjects();
|
||||
|
||||
void UpdateBackgroundTexture();
|
||||
|
||||
void SelectGroup(lcGroup* TopGroup, bool Select);
|
||||
|
||||
void AddPiece(lcPiece* Piece);
|
||||
void InsertPiece(lcPiece* Piece, int Index);
|
||||
|
||||
lcModelProperties mProperties;
|
||||
PieceInfo* mPieceInfo;
|
||||
|
||||
bool mActive;
|
||||
lcStep mCurrentStep;
|
||||
lcVector3 mMouseToolDistance;
|
||||
lcTexture* mBackgroundTexture;
|
||||
|
||||
lcArray<lcPiece*> mPieces;
|
||||
lcArray<lcCamera*> mCameras;
|
||||
lcArray<lcLight*> mLights;
|
||||
lcArray<lcGroup*> mGroups;
|
||||
QStringList mFileLines;
|
||||
|
||||
lcModelHistoryEntry* mSavedHistory;
|
||||
lcArray<lcModelHistoryEntry*> mUndoHistory;
|
||||
lcArray<lcModelHistoryEntry*> mRedoHistory;
|
||||
|
||||
Q_DECLARE_TR_FUNCTIONS(lcModel);
|
||||
};
|
||||
|
||||
#endif // _LC_MODEL_H_
|
||||
#ifndef _LC_MODEL_H_
|
||||
#define _LC_MODEL_H_
|
||||
|
||||
#include "lc_math.h"
|
||||
#include "object.h"
|
||||
#include "lc_commands.h"
|
||||
|
||||
#define LC_SEL_NO_PIECES 0x0001 // No pieces in model
|
||||
#define LC_SEL_PIECE 0x0002 // At last 1 piece selected
|
||||
#define LC_SEL_SELECTED 0x0004 // At last 1 object selected
|
||||
#define LC_SEL_UNSELECTED 0x0008 // At least 1 piece unselected
|
||||
#define LC_SEL_HIDDEN 0x0010 // At least one piece hidden
|
||||
#define LC_SEL_HIDDEN_SELECTED 0x0020 // At least one piece selected is hidden
|
||||
#define LC_SEL_VISIBLE_SELECTED 0x0040 // At least one piece selected is not hidden
|
||||
#define LC_SEL_GROUPED 0x0080 // At least one piece selected is grouped
|
||||
#define LC_SEL_FOCUS_GROUPED 0x0100 // Focused piece is grouped
|
||||
#define LC_SEL_CAN_GROUP 0x0200 // Can make a new group
|
||||
#define LC_SEL_MODEL_SELECTED 0x0400 // At least one model reference is selected
|
||||
#define LC_SEL_CAN_ADD_CONTROL_POINT 0x0800 // Can add control points to focused piece
|
||||
#define LC_SEL_CAN_REMOVE_CONTROL_POINT 0x1000 // Can remove control points from focused piece
|
||||
|
||||
enum lcTransformType
|
||||
{
|
||||
LC_TRANSFORM_ABSOLUTE_TRANSLATION,
|
||||
LC_TRANSFORM_RELATIVE_TRANSLATION,
|
||||
LC_TRANSFORM_ABSOLUTE_ROTATION,
|
||||
LC_TRANSFORM_RELATIVE_ROTATION
|
||||
};
|
||||
|
||||
enum lcBackgroundType
|
||||
{
|
||||
LC_BACKGROUND_SOLID,
|
||||
LC_BACKGROUND_GRADIENT,
|
||||
LC_BACKGROUND_IMAGE
|
||||
};
|
||||
|
||||
class lcModelProperties
|
||||
{
|
||||
public:
|
||||
void LoadDefaults();
|
||||
void SaveDefaults();
|
||||
|
||||
bool operator==(const lcModelProperties& Properties)
|
||||
{
|
||||
if (mName != Properties.mName || mAuthor != Properties.mAuthor ||
|
||||
mDescription != Properties.mDescription || mComments != Properties.mComments)
|
||||
return false;
|
||||
|
||||
if (mBackgroundType != Properties.mBackgroundType || mBackgroundSolidColor != Properties.mBackgroundSolidColor ||
|
||||
mBackgroundGradientColor1 != Properties.mBackgroundGradientColor1 || mBackgroundGradientColor2 != Properties.mBackgroundGradientColor2 ||
|
||||
mBackgroundImage != Properties.mBackgroundImage || mBackgroundImageTile != Properties.mBackgroundImageTile)
|
||||
return false;
|
||||
|
||||
if (mFogEnabled != Properties.mFogEnabled || mFogDensity != Properties.mFogDensity ||
|
||||
mFogColor != Properties.mFogColor || mAmbientColor != Properties.mAmbientColor)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void SaveLDraw(QTextStream& Stream) const;
|
||||
void ParseLDrawLine(QTextStream& Stream);
|
||||
|
||||
QString mName;
|
||||
QString mAuthor;
|
||||
QString mDescription;
|
||||
QString mComments;
|
||||
|
||||
lcBackgroundType mBackgroundType;
|
||||
lcVector3 mBackgroundSolidColor;
|
||||
lcVector3 mBackgroundGradientColor1;
|
||||
lcVector3 mBackgroundGradientColor2;
|
||||
QString mBackgroundImage;
|
||||
bool mBackgroundImageTile;
|
||||
|
||||
bool mFogEnabled;
|
||||
float mFogDensity;
|
||||
lcVector3 mFogColor;
|
||||
lcVector3 mAmbientColor;
|
||||
};
|
||||
|
||||
struct lcModelHistoryEntry
|
||||
{
|
||||
QByteArray File;
|
||||
QString Description;
|
||||
};
|
||||
|
||||
struct lcPartsListEntry
|
||||
{
|
||||
PieceInfo* Info;
|
||||
int ColorIndex;
|
||||
int Count;
|
||||
};
|
||||
|
||||
struct lcModelPartsEntry
|
||||
{
|
||||
lcMatrix44 WorldMatrix;
|
||||
PieceInfo* Info;
|
||||
int ColorIndex;
|
||||
};
|
||||
|
||||
class lcModel
|
||||
{
|
||||
public:
|
||||
lcModel(const QString& Name);
|
||||
~lcModel();
|
||||
|
||||
bool IsModified() const
|
||||
{
|
||||
return mSavedHistory != mUndoHistory[0];
|
||||
}
|
||||
|
||||
bool IncludesModel(const lcModel* Model) const;
|
||||
void CreatePieceInfo(Project* Project);
|
||||
void UpdatePieceInfo(lcArray<lcModel*>& UpdatedModels);
|
||||
|
||||
PieceInfo* GetPieceInfo() const
|
||||
{
|
||||
return mPieceInfo;
|
||||
}
|
||||
|
||||
const lcArray<lcPiece*>& GetPieces() const
|
||||
{
|
||||
return mPieces;
|
||||
}
|
||||
|
||||
const lcArray<lcCamera*>& GetCameras() const
|
||||
{
|
||||
return mCameras;
|
||||
}
|
||||
|
||||
const lcArray<lcLight*>& GetLights() const
|
||||
{
|
||||
return mLights;
|
||||
}
|
||||
|
||||
const lcArray<lcGroup*>& GetGroups() const
|
||||
{
|
||||
return mGroups;
|
||||
}
|
||||
|
||||
const lcModelProperties& GetProperties() const
|
||||
{
|
||||
return mProperties;
|
||||
}
|
||||
|
||||
void SetName(const QString& Name)
|
||||
{
|
||||
mProperties.mName = Name;
|
||||
}
|
||||
|
||||
const QStringList& GetFileLines() const
|
||||
{
|
||||
return mFileLines;
|
||||
}
|
||||
|
||||
lcStep GetLastStep() const;
|
||||
|
||||
lcStep GetCurrentStep() const
|
||||
{
|
||||
return mCurrentStep;
|
||||
}
|
||||
|
||||
void SetActive(bool Active);
|
||||
void CalculateStep(lcStep Step);
|
||||
void SetCurrentStep(lcStep Step);
|
||||
void SetTemporaryStep(lcStep Step)
|
||||
{
|
||||
mCurrentStep = Step;
|
||||
CalculateStep(Step);
|
||||
}
|
||||
|
||||
void ShowFirstStep();
|
||||
void ShowLastStep();
|
||||
void ShowPreviousStep();
|
||||
void ShowNextStep();
|
||||
void InsertStep(lcStep Step);
|
||||
void RemoveStep(lcStep Step);
|
||||
|
||||
void AddPiece();
|
||||
void DeleteAllCameras();
|
||||
void DeleteSelectedObjects();
|
||||
void ResetSelectedPiecesPivotPoint();
|
||||
void InsertControlPoint();
|
||||
void RemoveFocusedControlPoint();
|
||||
void ShowSelectedPiecesEarlier();
|
||||
void ShowSelectedPiecesLater();
|
||||
void SetPieceSteps(const QList<QPair<lcPiece*, lcStep>>& PieceSteps);
|
||||
|
||||
void MoveSelectionToModel(lcModel* Model);
|
||||
void InlineAllModels();
|
||||
void InlineSelectedModels();
|
||||
|
||||
lcGroup* AddGroup(const QString& Prefix, lcGroup* Parent);
|
||||
lcGroup* GetGroup(const QString& Name, bool CreateIfMissing);
|
||||
void RemoveGroup(lcGroup* Group);
|
||||
void GroupSelection();
|
||||
void UngroupSelection();
|
||||
void AddSelectedPiecesToGroup();
|
||||
void RemoveFocusPieceFromGroup();
|
||||
void ShowEditGroupsDialog();
|
||||
|
||||
void SaveLDraw(QTextStream& Stream, bool SelectedOnly) const;
|
||||
void LoadLDraw(QIODevice& Device, Project* Project);
|
||||
bool LoadBinary(lcFile* File);
|
||||
void Merge(lcModel* Other);
|
||||
|
||||
void SetSaved()
|
||||
{
|
||||
if (mUndoHistory.IsEmpty())
|
||||
SaveCheckpoint(QString());
|
||||
|
||||
mSavedHistory = mUndoHistory[0];
|
||||
}
|
||||
|
||||
void Cut();
|
||||
void Copy();
|
||||
void Paste();
|
||||
|
||||
void GetScene(lcScene& Scene, lcCamera* ViewCamera, bool DrawInterface) const;
|
||||
void SubModelAddRenderMeshes(lcScene& Scene, const lcMatrix44& WorldMatrix, int DefaultColorIndex, bool Focused, bool Selected) const;
|
||||
void DrawBackground(lcContext* Context);
|
||||
void SaveStepImages(const QString& BaseName, int Width, int Height, lcStep Start, lcStep End);
|
||||
|
||||
void RayTest(lcObjectRayTest& ObjectRayTest) const;
|
||||
void BoxTest(lcObjectBoxTest& ObjectBoxTest) const;
|
||||
bool SubModelMinIntersectDist(const lcVector3& WorldStart, const lcVector3& WorldEnd, float& MinDistance) const;
|
||||
bool SubModelBoxTest(const lcVector4 Planes[6]) const;
|
||||
|
||||
bool AnyPiecesSelected() const;
|
||||
bool AnyObjectsSelected() const;
|
||||
lcModel* GetFirstSelectedSubmodel() const;
|
||||
void GetSubModels(lcArray<lcModel*> SubModels) const;
|
||||
bool GetMoveRotateTransform(lcVector3& Center, lcMatrix33& RelativeRotation) const;
|
||||
bool GetPieceFocusOrSelectionCenter(lcVector3& Center) const;
|
||||
lcVector3 GetSelectionOrModelCenter() const;
|
||||
bool GetFocusPosition(lcVector3& Position) const;
|
||||
lcObject* GetFocusObject() const;
|
||||
bool GetSelectionCenter(lcVector3& Center) const;
|
||||
bool GetPiecesBoundingBox(lcVector3& Min, lcVector3& Max) const;
|
||||
void GetPartsList(int DefaultColorIndex, lcArray<lcPartsListEntry>& PartsList) const;
|
||||
void GetPartsListForStep(lcStep Step, int DefaultColorIndex, lcArray<lcPartsListEntry>& PartsList) const;
|
||||
void GetModelParts(const lcMatrix44& WorldMatrix, int DefaultColorIndex, lcArray<lcModelPartsEntry>& ModelParts) const;
|
||||
void GetSelectionInformation(int* Flags, lcArray<lcObject*>& Selection, lcObject** Focus) const;
|
||||
|
||||
void FocusOrDeselectObject(const lcObjectSection& ObjectSection);
|
||||
void ClearSelection(bool UpdateInterface);
|
||||
void ClearSelectionAndSetFocus(lcObject* Object, lcuint32 Section);
|
||||
void ClearSelectionAndSetFocus(const lcObjectSection& ObjectSection);
|
||||
void SetSelectionAndFocus(const lcArray<lcObject*>& Selection, lcObject* Focus, lcuint32 Section);
|
||||
void AddToSelection(const lcArray<lcObject*>& Objects);
|
||||
void SelectAllPieces();
|
||||
void InvertSelection();
|
||||
|
||||
void HideSelectedPieces();
|
||||
void HideUnselectedPieces();
|
||||
void UnhideSelectedPieces();
|
||||
void UnhideAllPieces();
|
||||
|
||||
void FindPiece(bool FindFirst, bool SearchForward);
|
||||
|
||||
void UndoAction();
|
||||
void RedoAction();
|
||||
|
||||
lcVector3 LockVector(const lcVector3& Vector) const;
|
||||
lcVector3 SnapPosition(const lcVector3& Delta) const;
|
||||
lcVector3 SnapRotation(const lcVector3& Delta) const;
|
||||
lcMatrix33 GetRelativeRotation() const;
|
||||
|
||||
const lcVector3& GetMouseToolDistance() const
|
||||
{
|
||||
return mMouseToolDistance;
|
||||
}
|
||||
|
||||
void BeginMouseTool();
|
||||
void EndMouseTool(lcTool Tool, bool Accept);
|
||||
void InsertPieceToolClicked(const lcMatrix44& WorldMatrix);
|
||||
void PointLightToolClicked(const lcVector3& Position);
|
||||
void BeginSpotLightTool(const lcVector3& Position, const lcVector3& Target);
|
||||
void UpdateSpotLightTool(const lcVector3& Position);
|
||||
void BeginCameraTool(const lcVector3& Position, const lcVector3& Target);
|
||||
void UpdateCameraTool(const lcVector3& Position);
|
||||
void UpdateMoveTool(const lcVector3& Distance, bool AlternateButtonDrag);
|
||||
void UpdateRotateTool(const lcVector3& Angles, bool AlternateButtonDrag);
|
||||
void UpdateScaleTool(const float Scale);
|
||||
void EraserToolClicked(lcObject* Object);
|
||||
void PaintToolClicked(lcObject* Object);
|
||||
void UpdateZoomTool(lcCamera* Camera, float Mouse);
|
||||
void UpdatePanTool(lcCamera* Camera, const lcVector3& Distance);
|
||||
void UpdateOrbitTool(lcCamera* Camera, float MouseX, float MouseY);
|
||||
void UpdateRollTool(lcCamera* Camera, float Mouse);
|
||||
void ZoomRegionToolClicked(lcCamera* Camera, float AspectRatio, const lcVector3& Position, const lcVector3& TargetPosition, const lcVector3* Corners);
|
||||
void LookAt(lcCamera* Camera);
|
||||
void ZoomExtents(lcCamera* Camera, float Aspect);
|
||||
void Zoom(lcCamera* Camera, float Amount);
|
||||
|
||||
void MoveSelectedObjects(const lcVector3& Distance, bool Relative, bool AlternateButtonDrag, bool Update, bool Checkpoint)
|
||||
{
|
||||
MoveSelectedObjects(Distance, Distance, Relative, AlternateButtonDrag, Update, Checkpoint);
|
||||
}
|
||||
|
||||
void MoveSelectedObjects(const lcVector3& PieceDistance, const lcVector3& ObjectDistance, bool Relative, bool AlternateButtonDrag, bool Update, bool Checkpoint);
|
||||
void RotateSelectedPieces(const lcVector3& Angles, bool Relative, bool AlternateButtonDrag, bool Update, bool Checkpoint);
|
||||
void ScaleSelectedPieces(const float Scale, bool Update, bool Checkpoint);
|
||||
void TransformSelectedObjects(lcTransformType TransformType, const lcVector3& Transform);
|
||||
void SetSelectedPiecesColorIndex(int ColorIndex);
|
||||
void SetSelectedPiecesPieceInfo(PieceInfo* Info);
|
||||
void SetSelectedPiecesStepShow(lcStep Step);
|
||||
void SetSelectedPiecesStepHide(lcStep Step);
|
||||
|
||||
void SetCameraOrthographic(lcCamera* Camera, bool Ortho);
|
||||
void SetCameraFOV(lcCamera* Camera, float FOV);
|
||||
void SetCameraZNear(lcCamera* Camera, float ZNear);
|
||||
void SetCameraZFar(lcCamera* Camera, float ZFar);
|
||||
void SetCameraName(lcCamera* Camera, const char* Name);
|
||||
|
||||
void ShowPropertiesDialog();
|
||||
void ShowSelectByNameDialog();
|
||||
void ShowArrayDialog();
|
||||
void ShowMinifigDialog();
|
||||
void UpdateInterface();
|
||||
|
||||
protected:
|
||||
void DeleteModel();
|
||||
void DeleteHistory();
|
||||
void SaveCheckpoint(const QString& Description);
|
||||
void LoadCheckPoint(lcModelHistoryEntry* CheckPoint);
|
||||
|
||||
QString GetGroupName(const QString& Prefix);
|
||||
void RemoveEmptyGroups();
|
||||
bool RemoveSelectedObjects();
|
||||
|
||||
void UpdateBackgroundTexture();
|
||||
|
||||
void SelectGroup(lcGroup* TopGroup, bool Select);
|
||||
|
||||
void AddPiece(lcPiece* Piece);
|
||||
void InsertPiece(lcPiece* Piece, int Index);
|
||||
|
||||
lcModelProperties mProperties;
|
||||
PieceInfo* mPieceInfo;
|
||||
|
||||
bool mActive;
|
||||
lcStep mCurrentStep;
|
||||
lcVector3 mMouseToolDistance;
|
||||
lcTexture* mBackgroundTexture;
|
||||
|
||||
lcArray<lcPiece*> mPieces;
|
||||
lcArray<lcCamera*> mCameras;
|
||||
lcArray<lcLight*> mLights;
|
||||
lcArray<lcGroup*> mGroups;
|
||||
QStringList mFileLines;
|
||||
|
||||
lcModelHistoryEntry* mSavedHistory;
|
||||
lcArray<lcModelHistoryEntry*> mUndoHistory;
|
||||
lcArray<lcModelHistoryEntry*> mRedoHistory;
|
||||
|
||||
Q_DECLARE_TR_FUNCTIONS(lcModel);
|
||||
};
|
||||
|
||||
#endif // _LC_MODEL_H_
|
||||
|
||||
+725
-725
File diff suppressed because it is too large
Load Diff
+64
-64
@@ -1,64 +1,64 @@
|
||||
#ifndef _LC_SYNTH_H_
|
||||
#define _LC_SYNTH_H_
|
||||
|
||||
#include "lc_math.h"
|
||||
#include "piece.h"
|
||||
|
||||
enum lcSynthType
|
||||
{
|
||||
LC_SYNTH_PIECE_RIBBED_HOSE,
|
||||
LC_SYNTH_PIECE_FLEXIBLE_AXLE,
|
||||
LC_SYNTH_PIECE_STRING_BRAIDED,
|
||||
LC_SYNTH_PIECE_SHOCK_ABSORBER
|
||||
};
|
||||
|
||||
struct lcSynthComponent
|
||||
{
|
||||
lcMatrix44 Transform;
|
||||
float Length;
|
||||
};
|
||||
|
||||
class lcLibraryMeshData;
|
||||
|
||||
class lcSynthInfo
|
||||
{
|
||||
public:
|
||||
lcSynthInfo(lcSynthType Type, float Length, int NumSections, PieceInfo* Info);
|
||||
|
||||
bool CanAddControlPoints() const
|
||||
{
|
||||
return mCurve;
|
||||
}
|
||||
|
||||
bool IsCurve() const
|
||||
{
|
||||
return mCurve;
|
||||
}
|
||||
|
||||
void GetDefaultControlPoints(lcArray<lcPieceControlPoint>& ControlPoints) const;
|
||||
int InsertControlPoint(lcArray<lcPieceControlPoint>& ControlPoints, const lcVector3& Start, const lcVector3& End) const;
|
||||
lcMesh* CreateMesh(const lcArray<lcPieceControlPoint>& ControlPoints) const;
|
||||
|
||||
protected:
|
||||
float GetSectionTwist(const lcMatrix44& StartTransform, const lcMatrix44& EndTransform) const;
|
||||
void CalculateCurveSections(const lcArray<lcPieceControlPoint>& ControlPoints, lcArray<lcMatrix44>& Sections, void(*SectionCallback)(const lcVector3& CurvePoint, int SegmentIndex, float t, void* Param), void* CallbackParam) const;
|
||||
void CalculateLineSections(const lcArray<lcPieceControlPoint>& ControlPoints, lcArray<lcMatrix44>& Sections, void(*SectionCallback)(const lcVector3& CurvePoint, int SegmentIndex, float t, void* Param), void* CallbackParam) const;
|
||||
void AddRibbedHoseParts(lcMemFile& File, const lcArray<lcMatrix44>& Sections) const;
|
||||
void AddFlexibleAxleParts(lcMemFile& File, lcLibraryMeshData& MeshData, const lcArray<lcMatrix44>& Sections) const;
|
||||
void AddStringBraidedParts(lcMemFile& File, lcLibraryMeshData& MeshData, lcArray<lcMatrix44>& Sections) const;
|
||||
void AddShockAbsorberParts(lcMemFile& File, lcArray<lcMatrix44>& Sections) const;
|
||||
|
||||
PieceInfo* mPieceInfo;
|
||||
lcSynthType mType;
|
||||
lcSynthComponent mStart;
|
||||
lcSynthComponent mMiddle;
|
||||
lcSynthComponent mEnd;
|
||||
bool mCurve;
|
||||
float mLength;
|
||||
int mNumSections;
|
||||
bool mRigidEdges;
|
||||
};
|
||||
|
||||
void lcSynthInit();
|
||||
|
||||
#endif // _LC_SYNTH_H_
|
||||
#ifndef _LC_SYNTH_H_
|
||||
#define _LC_SYNTH_H_
|
||||
|
||||
#include "lc_math.h"
|
||||
#include "piece.h"
|
||||
|
||||
enum lcSynthType
|
||||
{
|
||||
LC_SYNTH_PIECE_RIBBED_HOSE,
|
||||
LC_SYNTH_PIECE_FLEXIBLE_AXLE,
|
||||
LC_SYNTH_PIECE_STRING_BRAIDED,
|
||||
LC_SYNTH_PIECE_SHOCK_ABSORBER
|
||||
};
|
||||
|
||||
struct lcSynthComponent
|
||||
{
|
||||
lcMatrix44 Transform;
|
||||
float Length;
|
||||
};
|
||||
|
||||
class lcLibraryMeshData;
|
||||
|
||||
class lcSynthInfo
|
||||
{
|
||||
public:
|
||||
lcSynthInfo(lcSynthType Type, float Length, int NumSections, PieceInfo* Info);
|
||||
|
||||
bool CanAddControlPoints() const
|
||||
{
|
||||
return mCurve;
|
||||
}
|
||||
|
||||
bool IsCurve() const
|
||||
{
|
||||
return mCurve;
|
||||
}
|
||||
|
||||
void GetDefaultControlPoints(lcArray<lcPieceControlPoint>& ControlPoints) const;
|
||||
int InsertControlPoint(lcArray<lcPieceControlPoint>& ControlPoints, const lcVector3& Start, const lcVector3& End) const;
|
||||
lcMesh* CreateMesh(const lcArray<lcPieceControlPoint>& ControlPoints) const;
|
||||
|
||||
protected:
|
||||
float GetSectionTwist(const lcMatrix44& StartTransform, const lcMatrix44& EndTransform) const;
|
||||
void CalculateCurveSections(const lcArray<lcPieceControlPoint>& ControlPoints, lcArray<lcMatrix44>& Sections, void(*SectionCallback)(const lcVector3& CurvePoint, int SegmentIndex, float t, void* Param), void* CallbackParam) const;
|
||||
void CalculateLineSections(const lcArray<lcPieceControlPoint>& ControlPoints, lcArray<lcMatrix44>& Sections, void(*SectionCallback)(const lcVector3& CurvePoint, int SegmentIndex, float t, void* Param), void* CallbackParam) const;
|
||||
void AddRibbedHoseParts(lcMemFile& File, const lcArray<lcMatrix44>& Sections) const;
|
||||
void AddFlexibleAxleParts(lcMemFile& File, lcLibraryMeshData& MeshData, const lcArray<lcMatrix44>& Sections) const;
|
||||
void AddStringBraidedParts(lcMemFile& File, lcLibraryMeshData& MeshData, lcArray<lcMatrix44>& Sections) const;
|
||||
void AddShockAbsorberParts(lcMemFile& File, lcArray<lcMatrix44>& Sections) const;
|
||||
|
||||
PieceInfo* mPieceInfo;
|
||||
lcSynthType mType;
|
||||
lcSynthComponent mStart;
|
||||
lcSynthComponent mMiddle;
|
||||
lcSynthComponent mEnd;
|
||||
bool mCurve;
|
||||
float mLength;
|
||||
int mNumSections;
|
||||
bool mRigidEdges;
|
||||
};
|
||||
|
||||
void lcSynthInit();
|
||||
|
||||
#endif // _LC_SYNTH_H_
|
||||
|
||||
+344
-344
@@ -1,344 +1,344 @@
|
||||
#include "lc_global.h"
|
||||
#include "lc_timelinewidget.h"
|
||||
#include "lc_model.h"
|
||||
#include "project.h"
|
||||
#include "piece.h"
|
||||
#include "pieceinf.h"
|
||||
#include "lc_mainwindow.h"
|
||||
|
||||
lcTimelineWidget::lcTimelineWidget(QWidget* Parent)
|
||||
: QTreeWidget(Parent)
|
||||
{
|
||||
mIgnoreUpdates = false;
|
||||
|
||||
setSelectionMode(QAbstractItemView::ExtendedSelection);
|
||||
setDragEnabled(true);
|
||||
setDragDropMode(QAbstractItemView::InternalMove);
|
||||
setUniformRowHeights(true);
|
||||
setHeaderHidden(true);
|
||||
setContextMenuPolicy(Qt::CustomContextMenu);
|
||||
|
||||
invisibleRootItem()->setFlags(invisibleRootItem()->flags() & ~Qt::ItemIsDropEnabled);
|
||||
|
||||
connect(this, SIGNAL(itemSelectionChanged()), SLOT(ItemSelectionChanged()));
|
||||
connect(this, SIGNAL(customContextMenuRequested(QPoint)), SLOT(CustomMenuRequested(QPoint)));
|
||||
}
|
||||
|
||||
lcTimelineWidget::~lcTimelineWidget()
|
||||
{
|
||||
}
|
||||
|
||||
void lcTimelineWidget::CustomMenuRequested(QPoint Pos)
|
||||
{
|
||||
QMenu* Menu = new QMenu(this);
|
||||
|
||||
lcObject* FocusObject = lcGetActiveModel()->GetFocusObject();
|
||||
|
||||
if (FocusObject && FocusObject->IsPiece())
|
||||
{
|
||||
lcPiece* Piece = (lcPiece*)FocusObject;
|
||||
|
||||
if (Piece->mPieceInfo->IsModel())
|
||||
{
|
||||
Menu->addAction(gMainWindow->mActions[LC_MODEL_EDIT_FOCUS]);
|
||||
Menu->addSeparator();
|
||||
}
|
||||
}
|
||||
|
||||
QAction* InsertStepAction = Menu->addAction(gMainWindow->mActions[LC_VIEW_TIME_INSERT]->text(), this, SLOT(InsertStep()));
|
||||
InsertStepAction->setStatusTip(gMainWindow->mActions[LC_VIEW_TIME_INSERT]->statusTip());
|
||||
QAction* RemoveStepAction = Menu->addAction(gMainWindow->mActions[LC_VIEW_TIME_DELETE]->text(), this, SLOT(RemoveStep()));
|
||||
RemoveStepAction->setStatusTip(gMainWindow->mActions[LC_VIEW_TIME_DELETE]->statusTip());
|
||||
Menu->addSeparator();
|
||||
|
||||
Menu->addAction(gMainWindow->mActions[LC_PIECE_HIDE_SELECTED]);
|
||||
Menu->addAction(gMainWindow->mActions[LC_PIECE_HIDE_UNSELECTED]);
|
||||
Menu->addAction(gMainWindow->mActions[LC_PIECE_UNHIDE_SELECTED]);
|
||||
Menu->addAction(gMainWindow->mActions[LC_PIECE_UNHIDE_ALL]);
|
||||
|
||||
Menu->popup(viewport()->mapToGlobal(Pos));
|
||||
}
|
||||
|
||||
void lcTimelineWidget::Update(bool Clear, bool UpdateItems)
|
||||
{
|
||||
if (mIgnoreUpdates)
|
||||
return;
|
||||
|
||||
lcModel* Model = lcGetActiveModel();
|
||||
|
||||
if (!Model)
|
||||
{
|
||||
mItems.clear();
|
||||
clear();
|
||||
return;
|
||||
}
|
||||
|
||||
bool Blocked = blockSignals(true);
|
||||
|
||||
if (Clear)
|
||||
{
|
||||
mItems.clear();
|
||||
clear();
|
||||
}
|
||||
|
||||
lcStep LastStep = lcMax(Model->GetLastStep(), Model->GetCurrentStep());
|
||||
|
||||
for (int TopLevelItemIdx = LastStep; TopLevelItemIdx < topLevelItemCount(); )
|
||||
{
|
||||
QTreeWidgetItem* StepItem = topLevelItem(TopLevelItemIdx);
|
||||
|
||||
while (StepItem->childCount())
|
||||
{
|
||||
QTreeWidgetItem* PieceItem = StepItem->child(0);
|
||||
lcPiece* Piece = (lcPiece*)PieceItem->data(0, Qt::UserRole).value<uintptr_t>();
|
||||
mItems.remove(Piece);
|
||||
delete PieceItem;
|
||||
}
|
||||
|
||||
delete StepItem;
|
||||
}
|
||||
|
||||
for (unsigned int TopLevelItemIdx = topLevelItemCount(); TopLevelItemIdx < LastStep; TopLevelItemIdx++)
|
||||
{
|
||||
QTreeWidgetItem* StepItem = new QTreeWidgetItem(this, QStringList(tr("Step %1").arg(TopLevelItemIdx + 1)));
|
||||
StepItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsDropEnabled);
|
||||
addTopLevelItem(StepItem);
|
||||
StepItem->setExpanded(true);
|
||||
}
|
||||
|
||||
const lcArray<lcPiece*>& Pieces = Model->GetPieces();
|
||||
QTreeWidgetItem* StepItem = NULL;
|
||||
int PieceItemIndex = 0;
|
||||
lcStep Step = 0;
|
||||
|
||||
for (int PieceIdx = 0; PieceIdx != Pieces.GetSize(); PieceIdx++)
|
||||
{
|
||||
lcPiece* Piece = Pieces[PieceIdx];
|
||||
|
||||
while (Step != Piece->GetStepShow())
|
||||
{
|
||||
if (StepItem)
|
||||
{
|
||||
while (PieceItemIndex < StepItem->childCount())
|
||||
{
|
||||
QTreeWidgetItem* PieceItem = StepItem->child(PieceItemIndex);
|
||||
lcPiece* RemovePiece = (lcPiece*)PieceItem->data(0, Qt::UserRole).value<uintptr_t>();
|
||||
|
||||
if (Pieces.FindIndex(RemovePiece) == -1)
|
||||
{
|
||||
mItems.remove(RemovePiece);
|
||||
delete PieceItem;
|
||||
}
|
||||
else
|
||||
{
|
||||
PieceItem->parent()->removeChild(PieceItem);
|
||||
topLevelItem(RemovePiece->GetStepShow() - 1)->addChild(PieceItem);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Step++;
|
||||
StepItem = topLevelItem(Step - 1);
|
||||
PieceItemIndex = 0;
|
||||
}
|
||||
|
||||
QTreeWidgetItem* PieceItem = mItems.value(Piece);
|
||||
bool UpdateItem = UpdateItems;
|
||||
|
||||
if (!PieceItem)
|
||||
{
|
||||
PieceItem = new QTreeWidgetItem();
|
||||
PieceItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsDragEnabled);
|
||||
PieceItem->setData(0, Qt::UserRole, qVariantFromValue<uintptr_t>((uintptr_t)Piece));
|
||||
StepItem->insertChild(PieceItemIndex, PieceItem);
|
||||
mItems[Piece] = PieceItem;
|
||||
|
||||
UpdateItem = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (PieceItemIndex >= StepItem->childCount() || PieceItem != StepItem->child(PieceItemIndex))
|
||||
{
|
||||
QTreeWidgetItem* PieceParent = PieceItem->parent();
|
||||
|
||||
if (PieceParent)
|
||||
PieceParent->removeChild(PieceItem);
|
||||
|
||||
StepItem->insertChild(PieceItemIndex, PieceItem);
|
||||
}
|
||||
}
|
||||
|
||||
if (UpdateItem)
|
||||
{
|
||||
PieceItem->setText(0, Piece->mPieceInfo->m_strDescription);
|
||||
|
||||
int ColorIndex = Piece->mColorIndex;
|
||||
if (!mIcons.contains(ColorIndex))
|
||||
{
|
||||
int Size = rowHeight(indexFromItem(PieceItem));
|
||||
|
||||
QImage Image(Size, Size, QImage::Format_ARGB32);
|
||||
Image.fill(0);
|
||||
float* Color = gColorList[ColorIndex].Value;
|
||||
QPainter Painter(&Image);
|
||||
Painter.setPen(Qt::NoPen);
|
||||
Painter.setBrush(QColor::fromRgbF(Color[0], Color[1], Color[2]));
|
||||
Painter.drawEllipse(QPoint(Size / 2, Size / 2), Size / 2, Size / 2);
|
||||
|
||||
mIcons[ColorIndex] = QIcon(QPixmap::fromImage(Image));
|
||||
}
|
||||
|
||||
PieceItem->setIcon(0, mIcons[ColorIndex]);
|
||||
|
||||
QColor Color = palette().text().color();
|
||||
if (Piece->IsHidden())
|
||||
Color.setAlpha(128);
|
||||
PieceItem->setTextColor(0, Color);
|
||||
}
|
||||
|
||||
PieceItem->setSelected(Piece->IsSelected());
|
||||
PieceItemIndex++;
|
||||
}
|
||||
|
||||
if (Step == 0)
|
||||
{
|
||||
Step = 1;
|
||||
StepItem = topLevelItem(0);
|
||||
}
|
||||
|
||||
while (Step <= LastStep)
|
||||
{
|
||||
while (PieceItemIndex < StepItem->childCount())
|
||||
{
|
||||
QTreeWidgetItem* PieceItem = StepItem->child(PieceItemIndex);
|
||||
lcPiece* RemovePiece = (lcPiece*)PieceItem->data(0, Qt::UserRole).value<uintptr_t>();
|
||||
|
||||
mItems.remove(RemovePiece);
|
||||
delete PieceItem;
|
||||
}
|
||||
|
||||
Step++;
|
||||
StepItem = topLevelItem(Step - 1);
|
||||
PieceItemIndex = 0;
|
||||
}
|
||||
|
||||
blockSignals(Blocked);
|
||||
}
|
||||
|
||||
void lcTimelineWidget::UpdateSelection()
|
||||
{
|
||||
if (mIgnoreUpdates)
|
||||
return;
|
||||
|
||||
QItemSelection ItemSelection;
|
||||
|
||||
for (int TopLevelItemIdx = 0; TopLevelItemIdx < topLevelItemCount(); TopLevelItemIdx++)
|
||||
{
|
||||
QTreeWidgetItem* StepItem = topLevelItem(TopLevelItemIdx);
|
||||
|
||||
for (int PieceItemIdx = 0; PieceItemIdx < StepItem->childCount(); PieceItemIdx++)
|
||||
{
|
||||
QTreeWidgetItem* PieceItem = StepItem->child(PieceItemIdx);
|
||||
lcPiece* Piece = (lcPiece*)PieceItem->data(0, Qt::UserRole).value<uintptr_t>();
|
||||
|
||||
if (Piece->IsSelected())
|
||||
{
|
||||
QModelIndex Index = indexFromItem(PieceItem);
|
||||
ItemSelection.select(Index, Index);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool Blocked = blockSignals(true);
|
||||
|
||||
selectionModel()->select(ItemSelection, QItemSelectionModel::ClearAndSelect);
|
||||
|
||||
blockSignals(Blocked);
|
||||
}
|
||||
|
||||
void lcTimelineWidget::InsertStep()
|
||||
{
|
||||
QTreeWidgetItem* CurrentItem = currentItem();
|
||||
|
||||
if (!CurrentItem)
|
||||
return;
|
||||
|
||||
if (CurrentItem->parent())
|
||||
CurrentItem = CurrentItem->parent();
|
||||
|
||||
int Step = indexOfTopLevelItem(CurrentItem);
|
||||
|
||||
if (Step == -1)
|
||||
return;
|
||||
|
||||
lcGetActiveModel()->InsertStep(Step + 1);
|
||||
}
|
||||
|
||||
void lcTimelineWidget::RemoveStep()
|
||||
{
|
||||
QTreeWidgetItem* CurrentItem = currentItem();
|
||||
|
||||
if (!CurrentItem)
|
||||
return;
|
||||
|
||||
if (CurrentItem->parent())
|
||||
CurrentItem = CurrentItem->parent();
|
||||
|
||||
int Step = indexOfTopLevelItem(CurrentItem);
|
||||
|
||||
if (Step == -1)
|
||||
return;
|
||||
|
||||
lcGetActiveModel()->RemoveStep(Step + 1);
|
||||
}
|
||||
|
||||
void lcTimelineWidget::ItemSelectionChanged()
|
||||
{
|
||||
lcArray<lcObject*> Selection;
|
||||
lcStep LastStep = 1;
|
||||
|
||||
foreach (QTreeWidgetItem* PieceItem, selectedItems())
|
||||
{
|
||||
lcPiece* Piece = (lcPiece*)PieceItem->data(0, Qt::UserRole).value<uintptr_t>();
|
||||
LastStep = lcMax(LastStep, Piece->GetStepShow());
|
||||
Selection.Add(Piece);
|
||||
}
|
||||
|
||||
lcPiece* CurrentPiece = NULL;
|
||||
QTreeWidgetItem* CurrentItem = currentItem();
|
||||
if (CurrentItem && CurrentItem->isSelected())
|
||||
CurrentPiece = (lcPiece*)CurrentItem->data(0, Qt::UserRole).value<uintptr_t>();
|
||||
|
||||
bool Blocked = blockSignals(true);
|
||||
mIgnoreUpdates = true;
|
||||
lcModel* Model = lcGetActiveModel();
|
||||
if (LastStep > Model->GetCurrentStep())
|
||||
Model->SetCurrentStep(LastStep);
|
||||
Model->SetSelectionAndFocus(Selection, CurrentPiece, LC_PIECE_SECTION_POSITION);
|
||||
mIgnoreUpdates = false;
|
||||
blockSignals(Blocked);
|
||||
}
|
||||
|
||||
void lcTimelineWidget::dropEvent(QDropEvent* Event)
|
||||
{
|
||||
QTreeWidget::dropEvent(Event);
|
||||
|
||||
QList<QPair<lcPiece*, lcStep>> PieceSteps;
|
||||
|
||||
for (int TopLevelItemIdx = 0; TopLevelItemIdx < topLevelItemCount(); TopLevelItemIdx++)
|
||||
{
|
||||
QTreeWidgetItem* StepItem = topLevelItem(TopLevelItemIdx);
|
||||
|
||||
for (int PieceItemIdx = 0; PieceItemIdx < StepItem->childCount(); PieceItemIdx++)
|
||||
{
|
||||
QTreeWidgetItem* PieceItem = StepItem->child(PieceItemIdx);
|
||||
lcPiece* Piece = (lcPiece*)PieceItem->data(0, Qt::UserRole).value<uintptr_t>();
|
||||
|
||||
PieceSteps.append(QPair<lcPiece*, lcStep>(Piece, TopLevelItemIdx + 1));
|
||||
}
|
||||
}
|
||||
|
||||
mIgnoreUpdates = true;
|
||||
lcGetActiveModel()->SetPieceSteps(PieceSteps);
|
||||
mIgnoreUpdates = false;
|
||||
}
|
||||
#include "lc_global.h"
|
||||
#include "lc_timelinewidget.h"
|
||||
#include "lc_model.h"
|
||||
#include "project.h"
|
||||
#include "piece.h"
|
||||
#include "pieceinf.h"
|
||||
#include "lc_mainwindow.h"
|
||||
|
||||
lcTimelineWidget::lcTimelineWidget(QWidget* Parent)
|
||||
: QTreeWidget(Parent)
|
||||
{
|
||||
mIgnoreUpdates = false;
|
||||
|
||||
setSelectionMode(QAbstractItemView::ExtendedSelection);
|
||||
setDragEnabled(true);
|
||||
setDragDropMode(QAbstractItemView::InternalMove);
|
||||
setUniformRowHeights(true);
|
||||
setHeaderHidden(true);
|
||||
setContextMenuPolicy(Qt::CustomContextMenu);
|
||||
|
||||
invisibleRootItem()->setFlags(invisibleRootItem()->flags() & ~Qt::ItemIsDropEnabled);
|
||||
|
||||
connect(this, SIGNAL(itemSelectionChanged()), SLOT(ItemSelectionChanged()));
|
||||
connect(this, SIGNAL(customContextMenuRequested(QPoint)), SLOT(CustomMenuRequested(QPoint)));
|
||||
}
|
||||
|
||||
lcTimelineWidget::~lcTimelineWidget()
|
||||
{
|
||||
}
|
||||
|
||||
void lcTimelineWidget::CustomMenuRequested(QPoint Pos)
|
||||
{
|
||||
QMenu* Menu = new QMenu(this);
|
||||
|
||||
lcObject* FocusObject = lcGetActiveModel()->GetFocusObject();
|
||||
|
||||
if (FocusObject && FocusObject->IsPiece())
|
||||
{
|
||||
lcPiece* Piece = (lcPiece*)FocusObject;
|
||||
|
||||
if (Piece->mPieceInfo->IsModel())
|
||||
{
|
||||
Menu->addAction(gMainWindow->mActions[LC_MODEL_EDIT_FOCUS]);
|
||||
Menu->addSeparator();
|
||||
}
|
||||
}
|
||||
|
||||
QAction* InsertStepAction = Menu->addAction(gMainWindow->mActions[LC_VIEW_TIME_INSERT]->text(), this, SLOT(InsertStep()));
|
||||
InsertStepAction->setStatusTip(gMainWindow->mActions[LC_VIEW_TIME_INSERT]->statusTip());
|
||||
QAction* RemoveStepAction = Menu->addAction(gMainWindow->mActions[LC_VIEW_TIME_DELETE]->text(), this, SLOT(RemoveStep()));
|
||||
RemoveStepAction->setStatusTip(gMainWindow->mActions[LC_VIEW_TIME_DELETE]->statusTip());
|
||||
Menu->addSeparator();
|
||||
|
||||
Menu->addAction(gMainWindow->mActions[LC_PIECE_HIDE_SELECTED]);
|
||||
Menu->addAction(gMainWindow->mActions[LC_PIECE_HIDE_UNSELECTED]);
|
||||
Menu->addAction(gMainWindow->mActions[LC_PIECE_UNHIDE_SELECTED]);
|
||||
Menu->addAction(gMainWindow->mActions[LC_PIECE_UNHIDE_ALL]);
|
||||
|
||||
Menu->popup(viewport()->mapToGlobal(Pos));
|
||||
}
|
||||
|
||||
void lcTimelineWidget::Update(bool Clear, bool UpdateItems)
|
||||
{
|
||||
if (mIgnoreUpdates)
|
||||
return;
|
||||
|
||||
lcModel* Model = lcGetActiveModel();
|
||||
|
||||
if (!Model)
|
||||
{
|
||||
mItems.clear();
|
||||
clear();
|
||||
return;
|
||||
}
|
||||
|
||||
bool Blocked = blockSignals(true);
|
||||
|
||||
if (Clear)
|
||||
{
|
||||
mItems.clear();
|
||||
clear();
|
||||
}
|
||||
|
||||
lcStep LastStep = lcMax(Model->GetLastStep(), Model->GetCurrentStep());
|
||||
|
||||
for (int TopLevelItemIdx = LastStep; TopLevelItemIdx < topLevelItemCount(); )
|
||||
{
|
||||
QTreeWidgetItem* StepItem = topLevelItem(TopLevelItemIdx);
|
||||
|
||||
while (StepItem->childCount())
|
||||
{
|
||||
QTreeWidgetItem* PieceItem = StepItem->child(0);
|
||||
lcPiece* Piece = (lcPiece*)PieceItem->data(0, Qt::UserRole).value<uintptr_t>();
|
||||
mItems.remove(Piece);
|
||||
delete PieceItem;
|
||||
}
|
||||
|
||||
delete StepItem;
|
||||
}
|
||||
|
||||
for (unsigned int TopLevelItemIdx = topLevelItemCount(); TopLevelItemIdx < LastStep; TopLevelItemIdx++)
|
||||
{
|
||||
QTreeWidgetItem* StepItem = new QTreeWidgetItem(this, QStringList(tr("Step %1").arg(TopLevelItemIdx + 1)));
|
||||
StepItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsDropEnabled);
|
||||
addTopLevelItem(StepItem);
|
||||
StepItem->setExpanded(true);
|
||||
}
|
||||
|
||||
const lcArray<lcPiece*>& Pieces = Model->GetPieces();
|
||||
QTreeWidgetItem* StepItem = NULL;
|
||||
int PieceItemIndex = 0;
|
||||
lcStep Step = 0;
|
||||
|
||||
for (int PieceIdx = 0; PieceIdx != Pieces.GetSize(); PieceIdx++)
|
||||
{
|
||||
lcPiece* Piece = Pieces[PieceIdx];
|
||||
|
||||
while (Step != Piece->GetStepShow())
|
||||
{
|
||||
if (StepItem)
|
||||
{
|
||||
while (PieceItemIndex < StepItem->childCount())
|
||||
{
|
||||
QTreeWidgetItem* PieceItem = StepItem->child(PieceItemIndex);
|
||||
lcPiece* RemovePiece = (lcPiece*)PieceItem->data(0, Qt::UserRole).value<uintptr_t>();
|
||||
|
||||
if (Pieces.FindIndex(RemovePiece) == -1)
|
||||
{
|
||||
mItems.remove(RemovePiece);
|
||||
delete PieceItem;
|
||||
}
|
||||
else
|
||||
{
|
||||
PieceItem->parent()->removeChild(PieceItem);
|
||||
topLevelItem(RemovePiece->GetStepShow() - 1)->addChild(PieceItem);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Step++;
|
||||
StepItem = topLevelItem(Step - 1);
|
||||
PieceItemIndex = 0;
|
||||
}
|
||||
|
||||
QTreeWidgetItem* PieceItem = mItems.value(Piece);
|
||||
bool UpdateItem = UpdateItems;
|
||||
|
||||
if (!PieceItem)
|
||||
{
|
||||
PieceItem = new QTreeWidgetItem();
|
||||
PieceItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsDragEnabled);
|
||||
PieceItem->setData(0, Qt::UserRole, qVariantFromValue<uintptr_t>((uintptr_t)Piece));
|
||||
StepItem->insertChild(PieceItemIndex, PieceItem);
|
||||
mItems[Piece] = PieceItem;
|
||||
|
||||
UpdateItem = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (PieceItemIndex >= StepItem->childCount() || PieceItem != StepItem->child(PieceItemIndex))
|
||||
{
|
||||
QTreeWidgetItem* PieceParent = PieceItem->parent();
|
||||
|
||||
if (PieceParent)
|
||||
PieceParent->removeChild(PieceItem);
|
||||
|
||||
StepItem->insertChild(PieceItemIndex, PieceItem);
|
||||
}
|
||||
}
|
||||
|
||||
if (UpdateItem)
|
||||
{
|
||||
PieceItem->setText(0, Piece->mPieceInfo->m_strDescription);
|
||||
|
||||
int ColorIndex = Piece->mColorIndex;
|
||||
if (!mIcons.contains(ColorIndex))
|
||||
{
|
||||
int Size = rowHeight(indexFromItem(PieceItem));
|
||||
|
||||
QImage Image(Size, Size, QImage::Format_ARGB32);
|
||||
Image.fill(0);
|
||||
float* Color = gColorList[ColorIndex].Value;
|
||||
QPainter Painter(&Image);
|
||||
Painter.setPen(Qt::NoPen);
|
||||
Painter.setBrush(QColor::fromRgbF(Color[0], Color[1], Color[2]));
|
||||
Painter.drawEllipse(QPoint(Size / 2, Size / 2), Size / 2, Size / 2);
|
||||
|
||||
mIcons[ColorIndex] = QIcon(QPixmap::fromImage(Image));
|
||||
}
|
||||
|
||||
PieceItem->setIcon(0, mIcons[ColorIndex]);
|
||||
|
||||
QColor Color = palette().text().color();
|
||||
if (Piece->IsHidden())
|
||||
Color.setAlpha(128);
|
||||
PieceItem->setTextColor(0, Color);
|
||||
}
|
||||
|
||||
PieceItem->setSelected(Piece->IsSelected());
|
||||
PieceItemIndex++;
|
||||
}
|
||||
|
||||
if (Step == 0)
|
||||
{
|
||||
Step = 1;
|
||||
StepItem = topLevelItem(0);
|
||||
}
|
||||
|
||||
while (Step <= LastStep)
|
||||
{
|
||||
while (PieceItemIndex < StepItem->childCount())
|
||||
{
|
||||
QTreeWidgetItem* PieceItem = StepItem->child(PieceItemIndex);
|
||||
lcPiece* RemovePiece = (lcPiece*)PieceItem->data(0, Qt::UserRole).value<uintptr_t>();
|
||||
|
||||
mItems.remove(RemovePiece);
|
||||
delete PieceItem;
|
||||
}
|
||||
|
||||
Step++;
|
||||
StepItem = topLevelItem(Step - 1);
|
||||
PieceItemIndex = 0;
|
||||
}
|
||||
|
||||
blockSignals(Blocked);
|
||||
}
|
||||
|
||||
void lcTimelineWidget::UpdateSelection()
|
||||
{
|
||||
if (mIgnoreUpdates)
|
||||
return;
|
||||
|
||||
QItemSelection ItemSelection;
|
||||
|
||||
for (int TopLevelItemIdx = 0; TopLevelItemIdx < topLevelItemCount(); TopLevelItemIdx++)
|
||||
{
|
||||
QTreeWidgetItem* StepItem = topLevelItem(TopLevelItemIdx);
|
||||
|
||||
for (int PieceItemIdx = 0; PieceItemIdx < StepItem->childCount(); PieceItemIdx++)
|
||||
{
|
||||
QTreeWidgetItem* PieceItem = StepItem->child(PieceItemIdx);
|
||||
lcPiece* Piece = (lcPiece*)PieceItem->data(0, Qt::UserRole).value<uintptr_t>();
|
||||
|
||||
if (Piece->IsSelected())
|
||||
{
|
||||
QModelIndex Index = indexFromItem(PieceItem);
|
||||
ItemSelection.select(Index, Index);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool Blocked = blockSignals(true);
|
||||
|
||||
selectionModel()->select(ItemSelection, QItemSelectionModel::ClearAndSelect);
|
||||
|
||||
blockSignals(Blocked);
|
||||
}
|
||||
|
||||
void lcTimelineWidget::InsertStep()
|
||||
{
|
||||
QTreeWidgetItem* CurrentItem = currentItem();
|
||||
|
||||
if (!CurrentItem)
|
||||
return;
|
||||
|
||||
if (CurrentItem->parent())
|
||||
CurrentItem = CurrentItem->parent();
|
||||
|
||||
int Step = indexOfTopLevelItem(CurrentItem);
|
||||
|
||||
if (Step == -1)
|
||||
return;
|
||||
|
||||
lcGetActiveModel()->InsertStep(Step + 1);
|
||||
}
|
||||
|
||||
void lcTimelineWidget::RemoveStep()
|
||||
{
|
||||
QTreeWidgetItem* CurrentItem = currentItem();
|
||||
|
||||
if (!CurrentItem)
|
||||
return;
|
||||
|
||||
if (CurrentItem->parent())
|
||||
CurrentItem = CurrentItem->parent();
|
||||
|
||||
int Step = indexOfTopLevelItem(CurrentItem);
|
||||
|
||||
if (Step == -1)
|
||||
return;
|
||||
|
||||
lcGetActiveModel()->RemoveStep(Step + 1);
|
||||
}
|
||||
|
||||
void lcTimelineWidget::ItemSelectionChanged()
|
||||
{
|
||||
lcArray<lcObject*> Selection;
|
||||
lcStep LastStep = 1;
|
||||
|
||||
foreach (QTreeWidgetItem* PieceItem, selectedItems())
|
||||
{
|
||||
lcPiece* Piece = (lcPiece*)PieceItem->data(0, Qt::UserRole).value<uintptr_t>();
|
||||
LastStep = lcMax(LastStep, Piece->GetStepShow());
|
||||
Selection.Add(Piece);
|
||||
}
|
||||
|
||||
lcPiece* CurrentPiece = NULL;
|
||||
QTreeWidgetItem* CurrentItem = currentItem();
|
||||
if (CurrentItem && CurrentItem->isSelected())
|
||||
CurrentPiece = (lcPiece*)CurrentItem->data(0, Qt::UserRole).value<uintptr_t>();
|
||||
|
||||
bool Blocked = blockSignals(true);
|
||||
mIgnoreUpdates = true;
|
||||
lcModel* Model = lcGetActiveModel();
|
||||
if (LastStep > Model->GetCurrentStep())
|
||||
Model->SetCurrentStep(LastStep);
|
||||
Model->SetSelectionAndFocus(Selection, CurrentPiece, LC_PIECE_SECTION_POSITION);
|
||||
mIgnoreUpdates = false;
|
||||
blockSignals(Blocked);
|
||||
}
|
||||
|
||||
void lcTimelineWidget::dropEvent(QDropEvent* Event)
|
||||
{
|
||||
QTreeWidget::dropEvent(Event);
|
||||
|
||||
QList<QPair<lcPiece*, lcStep>> PieceSteps;
|
||||
|
||||
for (int TopLevelItemIdx = 0; TopLevelItemIdx < topLevelItemCount(); TopLevelItemIdx++)
|
||||
{
|
||||
QTreeWidgetItem* StepItem = topLevelItem(TopLevelItemIdx);
|
||||
|
||||
for (int PieceItemIdx = 0; PieceItemIdx < StepItem->childCount(); PieceItemIdx++)
|
||||
{
|
||||
QTreeWidgetItem* PieceItem = StepItem->child(PieceItemIdx);
|
||||
lcPiece* Piece = (lcPiece*)PieceItem->data(0, Qt::UserRole).value<uintptr_t>();
|
||||
|
||||
PieceSteps.append(QPair<lcPiece*, lcStep>(Piece, TopLevelItemIdx + 1));
|
||||
}
|
||||
}
|
||||
|
||||
mIgnoreUpdates = true;
|
||||
lcGetActiveModel()->SetPieceSteps(PieceSteps);
|
||||
mIgnoreUpdates = false;
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
|
Before Width: | Height: | Size: 59 KiB After Width: | Height: | Size: 58 KiB |
+782
-782
File diff suppressed because it is too large
Load Diff
|
Before Width: | Height: | Size: 59 KiB After Width: | Height: | Size: 58 KiB |
+1809
-1809
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user