mirror of
https://github.com/copyrighttxt/watrbx-game-engine.git
synced 2026-09-06 21:57:47 +00:00
GEEKING
This commit is contained in:
@@ -0,0 +1,496 @@
|
||||
#include "CORE//sg.h"
|
||||
|
||||
bool sgFileManager::Save(const sgCScene*, const char* file_name,
|
||||
const void* userData, unsigned long userDataSize)
|
||||
{
|
||||
return RealSaveModel(const_cast<char*>(file_name), FALSE,userData, userDataSize);
|
||||
}
|
||||
|
||||
bool sgFileManager::ExportDXF(const sgCScene*, const char* file_name)
|
||||
{
|
||||
return export_3d_to_dxf(const_cast<char*>(file_name));
|
||||
}
|
||||
|
||||
bool sgFileManager::ExportSTL(const sgCScene*, const char* file_name)
|
||||
{
|
||||
return export_3d_to_stl(const_cast<char*>(file_name));
|
||||
}
|
||||
|
||||
bool sgFileManager::GetFileHeader(const char* file_name, sgFileManager::SG_FILE_HEADER& file_header)
|
||||
{
|
||||
FILE* fl = NULL;
|
||||
|
||||
try
|
||||
{
|
||||
fl = fopen(file_name,"r");
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!fl)
|
||||
return false;
|
||||
|
||||
sgFileManager::SG_FILE_HEADER tmpFH;
|
||||
|
||||
try
|
||||
{
|
||||
if (!fread(&tmpFH,sizeof(sgFileManager::SG_FILE_HEADER),1,fl))
|
||||
{
|
||||
fclose(fl);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
fclose(fl);
|
||||
return false;
|
||||
}
|
||||
|
||||
fclose(fl);
|
||||
|
||||
if (!strcmp(tmpFH.signature,SG_FILE_SIGNATURE))
|
||||
{
|
||||
file_header = tmpFH;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool sgFileManager::GetUserData(const char* file_name, void* usetData)
|
||||
{
|
||||
if (file_name==NULL || usetData==NULL || usetData==NULL)
|
||||
return false;
|
||||
|
||||
FILE* fl = NULL;
|
||||
|
||||
try
|
||||
{
|
||||
fl = fopen(file_name,"r");
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!fl)
|
||||
return false;
|
||||
|
||||
sgFileManager::SG_FILE_HEADER tmpFH;
|
||||
|
||||
try
|
||||
{
|
||||
if (!fread(&tmpFH,sizeof(sgFileManager::SG_FILE_HEADER),1,fl))
|
||||
{
|
||||
fclose(fl);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
fclose(fl);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!strcmp(tmpFH.signature,SG_FILE_SIGNATURE))
|
||||
{
|
||||
if (tmpFH.userBlockSize==0)
|
||||
{
|
||||
fclose(fl);
|
||||
return false;
|
||||
}
|
||||
if (!fread(usetData,tmpFH.userBlockSize,1,fl))
|
||||
{
|
||||
fclose(fl);
|
||||
return false;
|
||||
}
|
||||
fclose(fl);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool sgFileManager::Open(const sgCScene*, const char* file_name)
|
||||
{
|
||||
if (application_interface && application_interface->GetProgresser())
|
||||
application_interface->GetProgresser()->InitProgresser(2);
|
||||
if (append_from_file(const_cast<char*>(file_name), TRUE, NULL, TRUE)!=G_OK)
|
||||
{
|
||||
if (application_interface && application_interface->GetProgresser())
|
||||
application_interface->GetProgresser()->StopProgresser();
|
||||
return false;
|
||||
}
|
||||
|
||||
{
|
||||
hOBJ htail, hobj;
|
||||
|
||||
htail = objects.hhead;
|
||||
hobj = htail;
|
||||
|
||||
int scSz = objects.num;
|
||||
int curCnt=0;
|
||||
if (application_interface && application_interface->GetProgresser())
|
||||
application_interface->GetProgresser()->Progress(0);
|
||||
while (hobj)
|
||||
{
|
||||
sgCObject* ooo = ObjectFromHandle(hobj);
|
||||
/* if (ooo->GetAttribute(SG_OA_LAYER)>=scene_layers.size())
|
||||
{
|
||||
scene_layers.clear();
|
||||
for (unsigned char i=0;i<=ooo->GetAttribute(SG_OA_LAYER);i++)
|
||||
scene_layers.push_back(1);
|
||||
}*/
|
||||
if (application_interface && application_interface->GetProgresser())
|
||||
application_interface->GetProgresser()->Progress(100*curCnt/scSz);
|
||||
curCnt++;
|
||||
get_next_item(hobj, &hobj);
|
||||
}
|
||||
if (application_interface && application_interface->GetProgresser())
|
||||
application_interface->GetProgresser()->Progress(100);
|
||||
}
|
||||
|
||||
if (application_interface && application_interface->GetProgresser())
|
||||
application_interface->GetProgresser()->StopProgresser();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool sgFileManager::ImportDXF(const sgCScene*, const char* file_name)
|
||||
{
|
||||
MATR mtr;
|
||||
hOBJ htail, hobj;
|
||||
htail = NULL;
|
||||
if (objects.num>0)
|
||||
htail = objects.htail;
|
||||
if (application_interface && application_interface->GetProgresser())
|
||||
application_interface->GetProgresser()->InitProgresser(2);
|
||||
if (import(DEV_DXF, const_cast<char*>(file_name), &objects, FALSE, mtr,false)<=0)
|
||||
{
|
||||
if (application_interface && application_interface->GetProgresser())
|
||||
application_interface->GetProgresser()->StopProgresser();
|
||||
return false;
|
||||
}
|
||||
{
|
||||
if (htail)
|
||||
get_next_item(htail, &htail);
|
||||
else
|
||||
htail = objects.hhead;
|
||||
hobj = htail;
|
||||
|
||||
int scSz = objects.num;
|
||||
int curCnt=0;
|
||||
if (application_interface && application_interface->GetProgresser())
|
||||
application_interface->GetProgresser()->Progress(0);
|
||||
while (hobj)
|
||||
{
|
||||
sgCObject* ooo = ObjectFromHandle(hobj);
|
||||
/* if (ooo->GetAttribute(SG_OA_LAYER)>=scene_layers.size())
|
||||
{
|
||||
scene_layers.clear();
|
||||
for (unsigned char i=0;i<=ooo->GetAttribute(SG_OA_LAYER);i++)
|
||||
scene_layers.push_back(1);
|
||||
}*/
|
||||
if (application_interface && application_interface->GetProgresser())
|
||||
application_interface->GetProgresser()->Progress(100*curCnt/scSz);
|
||||
curCnt++;
|
||||
get_next_item(hobj, &hobj);
|
||||
}
|
||||
if (application_interface && application_interface->GetProgresser())
|
||||
application_interface->GetProgresser()->Progress(100);
|
||||
}
|
||||
if (application_interface && application_interface->GetProgresser())
|
||||
application_interface->GetProgresser()->StopProgresser();
|
||||
get_scene_limits();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool sgFileManager::ImportSTL(const sgCScene*, const char* file_name,bool solids_checking)
|
||||
{
|
||||
MATR mtr;
|
||||
o_hcunit(mtr);
|
||||
hOBJ htail, hobj;
|
||||
htail = NULL;
|
||||
if (objects.num>0)
|
||||
htail = objects.htail;
|
||||
if (application_interface && application_interface->GetProgresser())
|
||||
application_interface->GetProgresser()->InitProgresser(2);
|
||||
if (import(DEV_STL, const_cast<char*>(file_name), &objects, FALSE, mtr, solids_checking)<=0)
|
||||
{
|
||||
if (application_interface && application_interface->GetProgresser())
|
||||
application_interface->GetProgresser()->StopProgresser();
|
||||
return false;
|
||||
}
|
||||
{
|
||||
if (htail)
|
||||
get_next_item(htail, &htail);
|
||||
else
|
||||
htail = objects.hhead;
|
||||
hobj = htail;
|
||||
|
||||
int scSz = objects.num;
|
||||
int curCnt=0;
|
||||
if (application_interface && application_interface->GetProgresser())
|
||||
application_interface->GetProgresser()->Progress(0);
|
||||
while (hobj)
|
||||
{
|
||||
sgCObject* ooo = ObjectFromHandle(hobj);
|
||||
/* if (ooo->GetAttribute(SG_OA_LAYER)>=scene_layers.size())
|
||||
{
|
||||
scene_layers.clear();
|
||||
for (unsigned char i=0;i<=ooo->GetAttribute(SG_OA_LAYER);i++)
|
||||
scene_layers.push_back(1);
|
||||
}*/
|
||||
if (application_interface && application_interface->GetProgresser())
|
||||
application_interface->GetProgresser()->Progress(100*curCnt/scSz);
|
||||
curCnt++;
|
||||
get_next_item(hobj, &hobj);
|
||||
}
|
||||
if (application_interface && application_interface->GetProgresser())
|
||||
application_interface->GetProgresser()->Progress(100);
|
||||
}
|
||||
if (application_interface && application_interface->GetProgresser())
|
||||
application_interface->GetProgresser()->StopProgresser();
|
||||
get_scene_limits();
|
||||
return true;
|
||||
}
|
||||
|
||||
const void* sgFileManager::ObjectToBitArray(const sgCObject* obj, unsigned long& arrSize)
|
||||
{
|
||||
if (!obj)
|
||||
return NULL;
|
||||
|
||||
char nametmp[144];
|
||||
BOOL cod = FALSE;
|
||||
BUFFER_DAT bd;
|
||||
|
||||
{
|
||||
/*char Buffer[MAX_PATH]; // address of buffer for temp. path
|
||||
GetTempPath(MAX_PATH, Buffer );
|
||||
GetTempFileName(Buffer, "pge", 0, nametmp);*/
|
||||
strcpy(nametmp, tempnam("/usr/temp","pge"));
|
||||
}
|
||||
|
||||
appl_init();
|
||||
if (!init_buf(&bd,nametmp,BUF_NEWINMEM)) {
|
||||
return NULL;
|
||||
}
|
||||
bool was_sel = false;
|
||||
if (obj->IsSelect())
|
||||
{
|
||||
was_sel = true;
|
||||
sgCObject* ooo = const_cast<sgCObject*>(obj);
|
||||
ooo->Select(false);
|
||||
}
|
||||
LISTH oLis;
|
||||
init_listh(&oLis);
|
||||
attach_item_tail_z(SEL_LIST,&oLis,GetObjectHandle(obj));
|
||||
int cnt = 1;
|
||||
if ( !o_save_list(&bd,&oLis,SEL_LIST,&cnt,NULL,NULL) )
|
||||
{
|
||||
close_buf(&bd);
|
||||
nb_unlink(nametmp);
|
||||
return NULL;
|
||||
}
|
||||
detach_item_z(SEL_LIST,&oLis,GetObjectHandle(obj));
|
||||
init_listh(&oLis);
|
||||
if (was_sel)
|
||||
{
|
||||
sgCObject* ooo = const_cast<sgCObject*>(obj);
|
||||
ooo->Select(true);
|
||||
}
|
||||
|
||||
int sz = get_buf_offset(&bd);
|
||||
if (sz<1)
|
||||
{
|
||||
close_buf(&bd);
|
||||
nb_unlink(nametmp);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
lpOBJ lpO = (lpOBJ)GetObjectHandle(obj);
|
||||
|
||||
if (lpO->bit_buffer)
|
||||
{
|
||||
SGFree(lpO->bit_buffer);
|
||||
}
|
||||
|
||||
lpO->bit_buffer = NULL;
|
||||
lpO->bit_buffer_size = 0;
|
||||
|
||||
lpO->bit_buffer_size = sz;
|
||||
lpO->bit_buffer = SGMalloc(lpO->bit_buffer_size);
|
||||
|
||||
if ( !seek_buf(&bd,0) )
|
||||
{
|
||||
close_buf(&bd);
|
||||
nb_unlink(nametmp);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (load_data(&bd, lpO->bit_buffer_size, lpO->bit_buffer)!=lpO->bit_buffer_size)
|
||||
{
|
||||
assert(0);
|
||||
close_buf(&bd);
|
||||
nb_unlink(nametmp);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
close_buf(&bd);
|
||||
nb_unlink(nametmp); //
|
||||
|
||||
arrSize = lpO->bit_buffer_size;
|
||||
return lpO->bit_buffer;
|
||||
}
|
||||
|
||||
sgCObject* sgFileManager::BitArrayToObject(const void* bitArray, unsigned long arrSize)
|
||||
{
|
||||
if (!bitArray || arrSize<1)
|
||||
return NULL;
|
||||
|
||||
char nametmp[144];
|
||||
BOOL cod = FALSE;
|
||||
BUFFER_DAT bd;
|
||||
|
||||
{
|
||||
/*char Buffer[MAX_PATH]; // address of buffer for temp. path
|
||||
GetTempPath(MAX_PATH, Buffer );
|
||||
GetTempFileName(Buffer, "pge", 0, nametmp);*/
|
||||
strcpy(nametmp, tempnam("/usr/temp","pge"));
|
||||
}
|
||||
|
||||
appl_init();
|
||||
if (!init_buf(&bd,nametmp,BUF_NEWINMEM)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!story_data(&bd,arrSize,const_cast<void*>(bitArray)))
|
||||
{
|
||||
close_buf(&bd);
|
||||
nb_unlink(nametmp);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
hOBJ obj_new;
|
||||
if ( !seek_buf(&bd,0) )
|
||||
{
|
||||
close_buf(&bd);
|
||||
nb_unlink(nametmp);
|
||||
return NULL;
|
||||
}
|
||||
LISTH oLis;
|
||||
init_listh(&oLis);
|
||||
short cnt = 1;
|
||||
if ( !o_load_list(&bd,&oLis,SEL_LIST,&cnt,0,NULL) )
|
||||
{
|
||||
close_buf(&bd);
|
||||
nb_unlink(nametmp);
|
||||
return NULL;
|
||||
}
|
||||
obj_new = oLis.hhead;
|
||||
if (obj_new)
|
||||
detach_item_z(SEL_LIST,&oLis,obj_new);
|
||||
init_listh(&oLis);
|
||||
|
||||
close_buf(&bd);
|
||||
nb_unlink(nametmp); //
|
||||
|
||||
return ObjectFromHandle(obj_new);
|
||||
}
|
||||
|
||||
|
||||
|
||||
sgCObject* sgFileManager::ObjectFromTriangles(const SG_VERT* vertexes, long vert_count,
|
||||
const SG_INDEX_TRIANGLE* triangles, long tr_count,
|
||||
float smooth_angle_in_radians/*=30.0*3.14159265/180.0*/,
|
||||
bool solids_checking/*=false*/)
|
||||
{
|
||||
if (vertexes==NULL || vert_count<3 || triangles==NULL || tr_count<1)
|
||||
return NULL;
|
||||
NPTRP trp;
|
||||
TRI_BIAND trb;
|
||||
D_POINT pp, min, max;
|
||||
MATR m, matr, matri;
|
||||
hOBJ hobj;
|
||||
long i;
|
||||
sgCObject* ooo = NULL;
|
||||
|
||||
// :
|
||||
min.x = min.y = min.z = 1.e35;
|
||||
max.x = max.y = max.z = -1.e35;
|
||||
// num_proc = start_grad(GetIDS(IDS_SG178), bd->len_file);
|
||||
for (i=0;i<vert_count;i++)
|
||||
{
|
||||
memcpy(&pp,&(vertexes[i]),sizeof(D_POINT));
|
||||
modify_limits_by_point(&pp, &min, &max);
|
||||
}
|
||||
// end_grad (num_proc , bd->p_beg+bd->cur_buf);
|
||||
//
|
||||
pp.x = - (min.x + max.x) / 2;
|
||||
pp.y = - (min.y + max.y) / 2;
|
||||
pp.z = - (min.z + max.z) / 2;
|
||||
o_hcunit(matr);
|
||||
o_hcunit(m);
|
||||
o_tdtran(matr, &pp);
|
||||
o_minv(matr, matri);
|
||||
o_hcmult(matr, m);
|
||||
|
||||
//
|
||||
if ( !begin_tri_biand(&trb) ) return NULL;
|
||||
|
||||
sgFloat old_smooth_angle = c_smooth_angle;
|
||||
c_smooth_angle = smooth_angle_in_radians;
|
||||
|
||||
trp.constr = 0;
|
||||
for (i=0;i<tr_count;i++)
|
||||
{
|
||||
for (short j=0;j<3;j++)
|
||||
{
|
||||
if (triangles[i].ver_indexes[j]>=vert_count)
|
||||
goto err;
|
||||
trp.v[j].x = vertexes[triangles[i].ver_indexes[j]].x;
|
||||
trp.v[j].y = vertexes[triangles[i].ver_indexes[j]].y;
|
||||
trp.v[j].z = vertexes[triangles[i].ver_indexes[j]].z;
|
||||
|
||||
trp.color[j].x = vertexes[triangles[i].ver_indexes[j]].r;
|
||||
trp.color[j].y = vertexes[triangles[i].ver_indexes[j]].g;
|
||||
trp.color[j].z = vertexes[triangles[i].ver_indexes[j]].b;
|
||||
|
||||
o_hcncrd(matr,&trp.v[j],&trp.v[j]);
|
||||
}
|
||||
|
||||
if ( !put_tri(&trb, &trp, solids_checking)) {
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
LISTH resList;
|
||||
init_listh(&resList);
|
||||
if ( !end_tri_biand(&trb, &resList, &trp) )
|
||||
goto err2;
|
||||
else
|
||||
{
|
||||
if (resList.num>1)
|
||||
{
|
||||
assert(0);
|
||||
goto err2;
|
||||
}
|
||||
hobj = resList.htail;
|
||||
while (hobj){
|
||||
o_trans(hobj, matri);
|
||||
ooo = ObjectFromHandle(hobj);
|
||||
get_prev_item(hobj, &hobj);
|
||||
}
|
||||
c_smooth_angle = old_smooth_angle;
|
||||
return ooo;
|
||||
}
|
||||
|
||||
err2:
|
||||
free_item_list(&resList);
|
||||
err:
|
||||
free_vdim(&trb.vdtri);
|
||||
free_vdim(&trb.coor);
|
||||
if ( trb.indv ) SGFree(trb.indv);
|
||||
np_end_of_put(&trb.list_str,NP_CANCEL,0,NULL); //
|
||||
trb.indv = NULL;
|
||||
c_smooth_angle = old_smooth_angle;
|
||||
return ooo;
|
||||
}
|
||||
Reference in New Issue
Block a user