| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- #include "std.h"
- #include "gxmesh.h"
- #include "gxgraphics.h"
- #include "gxruntime.h"
- 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=d_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 );
- }
|