deargui-vpl/ref/virtools/Samples/Behaviors/Interface/Sources/CompiledData.cpp

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);
}