Files
BlitzNext/Runtime/gfx/gxmesh.cpp
T
Michael Fabian 'Xaymar' Dirks a16218e1d5 runtime: CMake-ify gx
2019-01-18 17:03:37 +01:00

114 lines
2.1 KiB
C++

#include "gxmesh.hpp"
#include "gxgraphics.hpp"
#include "std.hpp"
#include "gxruntime.hpp"
extern gxRuntime* gx_runtime;
gxMesh::gxMesh(gxGraphics* g, IDirect3DVertexBuffer7* vs, WORD* is, int max_vs, int max_ts)
: graphics(g), locked_verts(0), vertex_buff(vs), tri_indices(is), max_verts(max_vs), max_tris(max_ts),
mesh_dirty(false)
{}
gxMesh::~gxMesh()
{
unlock();
vertex_buff->Release();
delete[] tri_indices;
}
bool gxMesh::lock(bool all)
{
if (locked_verts)
return true;
//V1.104
//int flags=all ? DDLOCK_DISCARDCONTENTS : 0;
//V1.105
//int flags=all ? DDLOCK_DISCARDCONTENTS : DDLOCK_NOOVERWRITE;
//V1.104/1.105
//if( vertex_buff->Lock( DDLOCK_WRITEONLY|DDLOCK_WAIT|flags,(void**)&locked_verts,0 )>=0 ){
//V1.1.06...
int flags = DDLOCK_WAIT | DDLOCK_WRITEONLY;
//XP or less?
/*if( graphics->runtime->osinfo.dwMajorVersion<6 ){
flags|=(all ? DDLOCK_DISCARDCONTENTS : DDLOCK_NOOVERWRITE);
}*/
if (vertex_buff->Lock(flags, (void**)&locked_verts, 0) >= 0) {
mesh_dirty = false;
return true;
}
static dxVertex* err_verts = new dxVertex[32768];
locked_verts = err_verts;
return true;
}
void gxMesh::unlock()
{
if (locked_verts) {
vertex_buff->Unlock();
locked_verts = 0;
}
}
void gxMesh::backup()
{
unlock();
}
void gxMesh::restore()
{
mesh_dirty = true;
}
/*
void gxMesh::backup(){
unlock();
if( backup_verts ){
delete[] backup_verts;
backup_verts=0;
}
dxVertex *verts;
if( vertex_buff->Lock( DDLOCK_READONLY|DDLOCK_WAIT,(void**)&verts,0 )>=0 ){
backup_verts=new dxVertex[ max_verts ];
memcpy( backup_verts,verts,sizeof(dxVertex)*max_verts );
vertex_buff->Unlock();
}
}
void gxMesh::restore(){
if( !backup_verts ) return;
dxVertex *verts;
if( vertex_buff->Lock( DDLOCK_WRITEONLY|DDLOCK_WAIT,(void**)&verts,0 )>=0 ){
memcpy( verts,backup_verts,sizeof(dxVertex)*max_verts );
vertex_buff->Unlock();
}
delete[] backup_verts;
backup_verts=0;
}
*/
void gxMesh::render(int first_vert, int vert_cnt, int first_tri, int tri_cnt)
{
unlock();
graphics->dir3dDev->DrawIndexedPrimitiveVB(D3DPT_TRIANGLELIST, vertex_buff, first_vert, vert_cnt,
tri_indices + first_tri * 3, tri_cnt * 3, 0);
}