Files
BlitzNext/gxruntime/gxmesh.cpp
T
Michael Fabian 'Xaymar' Dirks 24788185aa runtime: CMake-ify
2019-01-18 15:55:06 +01:00

108 lines
2.1 KiB
C++

#include "std.hpp"
#include "gxmesh.hpp"
#include "gxgraphics.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 );
}