146 lines
4.5 KiB
C++
146 lines
4.5 KiB
C++
|
|
#include "CKAll.h"
|
|
|
|
#include "CompiledData.h"
|
|
|
|
CompiledTextData::CompiledTextData()
|
|
{
|
|
PrepareStructure();
|
|
}
|
|
|
|
CompiledTextData::~CompiledTextData()
|
|
{
|
|
ClearStructure();
|
|
}
|
|
|
|
void CompiledTextData::PrepareStructure() {
|
|
memset(&m_DrawPrimData,0,sizeof(VxDrawPrimitiveData));
|
|
m_DrawPrimData.Positions.Stride =sizeof(VxVector4);
|
|
m_DrawPrimData.Normals.Stride =sizeof(VxVector);
|
|
m_DrawPrimData.SpecularColors.Stride =sizeof(CKDWORD);
|
|
m_DrawPrimData.Colors.Stride =sizeof(CKDWORD);
|
|
m_DrawPrimData.TexCoord.Stride =sizeof(VxUV);
|
|
#if (CKRST_MAX_STAGES>1)
|
|
for (int i=0;i<CKRST_MAX_STAGES-1;++i) {
|
|
m_DrawPrimData.TexCoords[i].Stride =sizeof(VxUV);
|
|
}
|
|
#endif
|
|
memcpy(&m_DrawPrimDataUser,&m_DrawPrimData,sizeof(VxDrawPrimitiveData));
|
|
}
|
|
|
|
// casts by nicolasp
|
|
|
|
void CompiledTextData::ClearStructure()
|
|
{
|
|
delete [] (VxVector4*)m_DrawPrimData.Positions.Ptr;
|
|
delete [] (VxVector*)m_DrawPrimData.Normals.Ptr;
|
|
delete [] (DWORD*)m_DrawPrimData.Colors.Ptr;
|
|
delete [] (DWORD*)m_DrawPrimData.SpecularColors.Ptr;
|
|
delete [] (VxUV*)m_DrawPrimData.TexCoord.Ptr;
|
|
#if (CKRST_MAX_STAGES>1)
|
|
for (int i=0;i<CKRST_MAX_STAGES-1;++i) {
|
|
delete [] (VxUV*)m_DrawPrimData.TexCoords[i].Ptr;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
|
|
void CompiledTextData::ExtendStructure(int nc)
|
|
{
|
|
void* temp;
|
|
|
|
temp = new BYTE[nc*sizeof(DWORD)];
|
|
memcpy(temp,m_DrawPrimData.Colors.Ptr,m_DrawPrimData.VertexCount*sizeof(DWORD));
|
|
delete [] (DWORD*)m_DrawPrimData.Colors.Ptr;
|
|
m_DrawPrimData.Colors.Ptr = temp;
|
|
|
|
temp = new BYTE[nc*sizeof(DWORD)];
|
|
memcpy(temp,m_DrawPrimData.SpecularColors.Ptr,m_DrawPrimData.VertexCount*sizeof(DWORD));
|
|
delete [] (DWORD*)m_DrawPrimData.SpecularColors.Ptr;
|
|
m_DrawPrimData.SpecularColors.Ptr = temp;
|
|
|
|
temp = new BYTE[nc*sizeof(VxVector)];
|
|
memcpy(temp,m_DrawPrimData.Normals.Ptr,m_DrawPrimData.VertexCount*sizeof(VxVector));
|
|
delete [] (VxVector*)m_DrawPrimData.Normals.Ptr;
|
|
m_DrawPrimData.Normals.Ptr = temp;
|
|
|
|
temp = new BYTE[nc*sizeof(VxVector4)];
|
|
memcpy(temp,m_DrawPrimData.Positions.Ptr,m_DrawPrimData.VertexCount*sizeof(VxVector4));
|
|
delete [] (VxVector4*)m_DrawPrimData.Positions.Ptr;
|
|
m_DrawPrimData.Positions.Ptr = temp;
|
|
|
|
temp = new BYTE[nc*sizeof(VxUV)];
|
|
memcpy(temp,m_DrawPrimData.TexCoord.Ptr,m_DrawPrimData.VertexCount*sizeof(VxUV));
|
|
delete [] (VxUV*)m_DrawPrimData.TexCoord.Ptr;
|
|
m_DrawPrimData.TexCoord.Ptr = temp;
|
|
|
|
#if (CKRST_MAX_STAGES>1)
|
|
for (int i=0;i<CKRST_MAX_STAGES-1;++i) {
|
|
temp = new BYTE[nc*sizeof(VxUV)];
|
|
memcpy(temp,m_DrawPrimData.TexCoords[i].Ptr,m_DrawPrimData.VertexCount*sizeof(VxUV));
|
|
delete [] (VxUV*)m_DrawPrimData.TexCoords[i].Ptr;
|
|
m_DrawPrimData.TexCoords[i].Ptr = temp;
|
|
}
|
|
#endif
|
|
|
|
m_DrawPrimData.VertexCount = nc;
|
|
}
|
|
|
|
VxDrawPrimitiveData*
|
|
CompiledTextData::GetStructure(CKRST_DPFLAGS Flags,int VertexCount)
|
|
{
|
|
int oldsize = m_DrawPrimData.VertexCount;
|
|
ExtendStructure(oldsize+VertexCount);
|
|
|
|
// vertices count
|
|
m_DrawPrimDataUser.VertexCount = VertexCount;
|
|
|
|
// Ptrs
|
|
m_DrawPrimDataUser.Colors.Ptr = (BYTE*)m_DrawPrimData.Colors.Ptr+oldsize*m_DrawPrimData.Colors.Stride;
|
|
m_DrawPrimDataUser.SpecularColors.Ptr = (BYTE*)m_DrawPrimData.SpecularColors.Ptr+oldsize*m_DrawPrimData.SpecularColors.Stride;
|
|
m_DrawPrimDataUser.Normals.Ptr = (BYTE*)m_DrawPrimData.Normals.Ptr+oldsize*m_DrawPrimData.Normals.Stride;
|
|
m_DrawPrimDataUser.Positions.Ptr = (BYTE*)m_DrawPrimData.Positions.Ptr+oldsize*m_DrawPrimData.Positions.Stride;
|
|
m_DrawPrimDataUser.TexCoord.Ptr = (BYTE*)m_DrawPrimData.TexCoord.Ptr+oldsize*m_DrawPrimData.TexCoord.Stride;
|
|
|
|
#if (CKRST_MAX_STAGES>1)
|
|
for (int i=0;i<CKRST_MAX_STAGES-1;++i) {
|
|
m_DrawPrimDataUser.TexCoords[i].Ptr = (BYTE*)m_DrawPrimData.TexCoords[i].Ptr+oldsize*m_DrawPrimData.TexCoords[i].Stride;
|
|
}
|
|
#endif
|
|
|
|
// Flags
|
|
// Warning : this means the render is done with options of the last call to get structure
|
|
m_DrawPrimData.Flags = Flags;
|
|
m_DrawPrimDataUser.Flags = Flags;
|
|
if (!(Flags & CKRST_DP_SPECULAR)) m_DrawPrimDataUser.SpecularColors.Ptr = NULL;
|
|
|
|
return &m_DrawPrimDataUser;
|
|
}
|
|
|
|
|
|
CKWORD*
|
|
CompiledTextData::GetIndices(int IndicesCount)
|
|
{
|
|
int oldsize = m_Indices.Size();
|
|
m_Indices.Resize(oldsize+IndicesCount);
|
|
return m_Indices.Begin()+oldsize;
|
|
}
|
|
|
|
void
|
|
CompiledTextData::PatchIndices(int initialsize,int newsize)
|
|
{
|
|
int vertoffset = m_DrawPrimData.VertexCount - m_DrawPrimDataUser.VertexCount;
|
|
int start = m_Indices.Size() - initialsize;
|
|
int offset = initialsize - newsize;
|
|
for (CKWORD* it = m_Indices.Begin()+start; it != m_Indices.End()-offset; ++it) {
|
|
*it = *it + vertoffset;
|
|
}
|
|
m_Indices.Resize(start+newsize);
|
|
}
|
|
|
|
void
|
|
CompiledTextData::Render(CKRenderContext* dev)
|
|
{
|
|
dev->DrawPrimitive(VX_TRIANGLELIST,m_Indices.Begin(),m_Indices.Size(),&m_DrawPrimData);
|
|
}
|