khanat-opennel-code/code/nel/src/3d/landscapevb_info.cpp
2010-05-06 02:08:41 +02:00

187 lines
5.7 KiB
C++

// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "std3d.h"
#include "nel/3d/landscapevb_info.h"
#include "nel/3d/vertex_buffer.h"
#include "nel/3d/landscapevb_allocator.h"
namespace NL3D
{
// ***************************************************************************
// ***************************************************************************
// VertexBufferInfo.
// ***************************************************************************
// ***************************************************************************
// ***************************************************************************
void CFarVertexBufferInfo::setupNullPointers()
{
Accessor.unlock();
VertexCoordPointer= NULL;
TexCoordPointer0= NULL;
TexCoordPointer1= NULL;
ColorPointer= NULL;
GeomInfoPointer= NULL;
DeltaPosPointer= NULL;
AlphaInfoPointer= NULL;
}
// ***************************************************************************
void CFarVertexBufferInfo::setupPointersForVertexProgram()
{
// see CLandscapeVBAllocator for program definition.
uint8 *vcoord= (uint8*)VertexCoordPointer;
TexCoordPointer0= vcoord + TexCoordOff0;
TexCoordPointer1= vcoord + TexCoordOff1;
GeomInfoPointer= vcoord + GeomInfoOff;
DeltaPosPointer= vcoord + DeltaPosOff;
AlphaInfoPointer= vcoord + AlphaInfoOff;
}
// ***************************************************************************
void CFarVertexBufferInfo::setupVertexBuffer(CVertexBuffer &vb, bool forVertexProgram)
{
VertexFormat= vb.getVertexFormat();
VertexSize= vb.getVertexSize();
NumVertices= vb.getNumVertices();
if(NumVertices==0)
{
setupNullPointers();
return;
}
vb.lock (Accessor);
VertexCoordPointer = Accessor.getVertexCoordPointer();
if(forVertexProgram)
{
// With VertexCoordPointer setuped, init for VP.
TexCoordOff0= vb.getValueOffEx(NL3D_LANDSCAPE_VPPOS_TEX0); // v[8]= Tex0.
TexCoordOff1= vb.getValueOffEx(NL3D_LANDSCAPE_VPPOS_TEX1); // v[9]= Tex1.
GeomInfoOff= vb.getValueOffEx(NL3D_LANDSCAPE_VPPOS_GEOMINFO); // v[10]= GeomInfos.
DeltaPosOff= vb.getValueOffEx(NL3D_LANDSCAPE_VPPOS_DELTAPOS); // v[11]= EndPos-StartPos
// Init Alpha Infos only if enabled (enabled if Value 5 are).
AlphaInfoOff= 0;
if( vb.getVertexFormat() & (1<<NL3D_LANDSCAPE_VPPOS_ALPHAINFO) )
AlphaInfoOff= vb.getValueOffEx(NL3D_LANDSCAPE_VPPOS_ALPHAINFO); // v[12]= AlphaInfos
// update Ptrs.
setupPointersForVertexProgram();
}
else
{
TexCoordOff0= vb.getTexCoordOff(0);
TexCoordOff1= vb.getTexCoordOff(1);
TexCoordPointer0= Accessor.getTexCoordPointer(0, 0);
TexCoordPointer1= Accessor.getTexCoordPointer(0, 1);
// In Far0, we don't have Color component.
if(VertexFormat & CVertexBuffer::PrimaryColorFlag)
{
ColorOff= vb.getColorOff();
// todo hulud d3d vertex color RGBA / BGRA
ColorPointer= Accessor.getColorPointer();
}
else
{
ColorOff= 0;
ColorPointer= NULL;
}
}
}
// ***************************************************************************
void CNearVertexBufferInfo::setupNullPointers()
{
Accessor.unlock();
VertexCoordPointer= NULL;
TexCoordPointer0= NULL;
TexCoordPointer1= NULL;
TexCoordPointer2= NULL;
GeomInfoPointer= NULL;
DeltaPosPointer= NULL;
}
// ***************************************************************************
void CNearVertexBufferInfo::setupPointersForVertexProgram()
{
// see CLandscapeVBAllocator for program definition.
uint8 *vcoord= (uint8*)VertexCoordPointer;
TexCoordPointer0= vcoord + TexCoordOff0;
TexCoordPointer1= vcoord + TexCoordOff1;
TexCoordPointer2= vcoord + TexCoordOff2;
GeomInfoPointer= vcoord + GeomInfoOff;
DeltaPosPointer= vcoord + DeltaPosOff;
}
// ***************************************************************************
void CNearVertexBufferInfo::setupVertexBuffer(CVertexBuffer &vb, bool forVertexProgram)
{
VertexFormat= vb.getVertexFormat();
VertexSize= vb.getVertexSize();
NumVertices= vb.getNumVertices();
if(NumVertices==0)
{
setupNullPointers();
return;
}
vb.lock (Accessor);
VertexCoordPointer= Accessor.getVertexCoordPointer();
if(forVertexProgram)
{
// With VertexCoordPointer setuped, init for VP.
TexCoordOff0= vb.getValueOffEx(NL3D_LANDSCAPE_VPPOS_TEX0); // v[8]= Tex0.
TexCoordOff1= vb.getValueOffEx(NL3D_LANDSCAPE_VPPOS_TEX1); // v[9]= Tex1.
TexCoordOff2= vb.getValueOffEx(NL3D_LANDSCAPE_VPPOS_TEX2); // v[13]= Tex1.
GeomInfoOff= vb.getValueOffEx(NL3D_LANDSCAPE_VPPOS_GEOMINFO); // v[10]= GeomInfos.
DeltaPosOff= vb.getValueOffEx(NL3D_LANDSCAPE_VPPOS_DELTAPOS); // v[11]= EndPos-StartPos
// update Ptrs.
setupPointersForVertexProgram();
}
else
{
TexCoordPointer0= Accessor.getTexCoordPointer(0, 0);
TexCoordPointer1= Accessor.getTexCoordPointer(0, 1);
TexCoordPointer2= Accessor.getTexCoordPointer(0, 2);
TexCoordOff0= vb.getTexCoordOff(0);
TexCoordOff1= vb.getTexCoordOff(1);
TexCoordOff2= vb.getTexCoordOff(2);
}
}
} // NL3D