Files
watrbx-game-engine/CSG/sgCore/Core/ZMDI/OBJREGS.cpp
T
2025-09-18 17:55:52 -04:00

342 lines
7.4 KiB
C++

#include "../sg.h"
typedef struct {
char *Name;
SG_PTR_TO_DIGIT Idle;
}COMMONMETHOD;
typedef COMMONMETHOD * pCOMMONMETHOD;
typedef struct {
char *Name;
int GeoSize;
int OldType;
EL_OBJTYPE ElGeoMask;
}OBJTEMPL;
typedef OBJTEMPL * pOBJTEMPL;
typedef struct {
int iObjType;
int iMethod;
SG_PTR_TO_DIGIT MethodData;
}OBJMETHOD;
typedef OBJMETHOD * pOBJMETHOD;
typedef struct {
INDEX_KW iKey;
UINT PromptID;
}SNAPTEMPL;
typedef SNAPTEMPL * pSNAPTEMPL;
int GeoObjMethodsCount = 0;
int GeoObjTypesCount = 0;
SG_PTR_TO_DIGIT* pMethods = NULL;
char** ppGeoObjNames = NULL;
int* pOldTypes = NULL;
pEL_OBJTYPE pElTypes = NULL;
OBJTYPE ALL_OBJECTS;
OBJTYPE NULL_OBJECTS;
static lpVDIM pGeoObjVD = NULL;
static lpVDIM pMethodsVD = NULL;
static lpVDIM pObjMethodsVD = NULL;
static EL_OBJTYPE CurrElGeoMask = 0x00000001;
static BOOL ObjectsRegStatus = FALSE;
BOOL GeoObjectsInit(void)
{
BOOL ret = FALSE;
int i, j;
pCOMMONMETHOD pMt;
pOBJMETHOD pObjMt;
pOBJTEMPL pObjTempl;
DWORD FFlags;
pGeoObjVD = (lpVDIM)SGMalloc(3*sizeof(VDIM));
if(!pGeoObjVD)
return FALSE;
pMethodsVD = pGeoObjVD + 1;
pObjMethodsVD = pMethodsVD + 1;
init_vdim(pGeoObjVD, sizeof(OBJTEMPL));
init_vdim(pMethodsVD, sizeof(COMMONMETHOD));
init_vdim(pObjMethodsVD, sizeof(OBJMETHOD));
ObjectsRegStatus = TRUE;
RegCoreObjects();
if(pExtRegObjects)
pExtRegObjects();
RegCommonMethods();
if(pExtRegCommonMethods)
pExtRegCommonMethods();
if(!ObjectsRegStatus)
goto err;
ObjectsRegStatus = FALSE;
GeoObjMethodsCount = pMethodsVD->num_elem;
GeoObjTypesCount = pGeoObjVD->num_elem;
if(!GeoObjMethodsCount || !GeoObjTypesCount)
return FALSE;
geo_size = (WORD*)SGMalloc(GeoObjTypesCount*sizeof(WORD));
if(!geo_size)
goto err;
ppGeoObjNames = (char**)SGMalloc(GeoObjTypesCount*sizeof(char*));
if(!ppGeoObjNames)
goto err;
pOldTypes = (int*)SGMalloc(GeoObjTypesCount*sizeof(int));
if(!pOldTypes)
goto err;
pElTypes = (pEL_OBJTYPE)SGMalloc(GeoObjTypesCount*sizeof(EL_OBJTYPE));
if(!pElTypes)
goto err;
pMethods = (SG_PTR_TO_DIGIT*)SGMalloc(GeoObjTypesCount*GeoObjMethodsCount*sizeof(SG_PTR_TO_DIGIT));
if(!pMethods)
goto err;
for(i = 0; i < GeoObjMethodsCount; i++){
pMt =(pCOMMONMETHOD)get_elem(pMethodsVD, i);
for(j = 0; j < GeoObjTypesCount; j++)
pMethods[GeoObjTypesCount*i + j] = pMt->Idle;
}
ALL_OBJECTS = GeoObjTypesCount + 1;
NULL_OBJECTS = GeoObjTypesCount + 2;
for(i = 0; i < GeoObjTypesCount; i++){
pObjTempl =(pOBJTEMPL)get_elem(pGeoObjVD, i);
geo_size[i] = (WORD)pObjTempl->GeoSize;
ppGeoObjNames[i] = pObjTempl->Name;
pOldTypes[i] = pObjTempl->OldType;
pElTypes[i] = pObjTempl->ElGeoMask;
}
InitCoreObjMetods();
ObjectsRegStatus = TRUE;
if(pExtInitObjMetods)
pExtInitObjMetods();
if(!ObjectsRegStatus)
goto err;
ObjectsRegStatus = FALSE;
for(i = 0; i < pObjMethodsVD->num_elem; i++){
pObjMt =(pOBJMETHOD)get_elem(pObjMethodsVD, i);
pMethods[GeoObjTypesCount*pObjMt->iMethod + pObjMt->iObjType] = pObjMt->MethodData;
}
add_type(enable_filter, NULL_OBJECTS);
add_type(struct_filter, NULL_OBJECTS);
add_type(complex_filter, NULL_OBJECTS);
add_type(frame_filter, NULL_OBJECTS);
for(i = 0; i < GeoObjTypesCount; i++){
add_type(enable_filter, i);
FFlags = GetObjMethod(i, OMT_COMMON_FILTERS);
if(FFlags & FF_IS_STRUCT)
add_type(struct_filter, i);
if(FFlags & FF_HAS_MATRIX)
add_type(complex_filter, i);
if(FFlags & FF_FRAME_ITEM)
add_type(frame_filter, i);
}
ret = TRUE;
goto met;
err:
GeoObjectsFreeMem();
met:
free_vdim(pGeoObjVD);
free_vdim(pMethodsVD);
free_vdim(pObjMethodsVD);
SGFree(pGeoObjVD);
return ret;
}
void GeoObjectsFreeMem(void)
{
if(geo_size)
SGFree(geo_size);
geo_size = NULL;
if(ppGeoObjNames)
SGFree(ppGeoObjNames);
ppGeoObjNames = NULL;
if(pOldTypes)
SGFree(pOldTypes);
pOldTypes = NULL;
if(pElTypes)
SGFree(pElTypes);
pElTypes = NULL;
if(pMethods)
SGFree(pMethods);
pMethods = NULL;
}
SG_PTR_TO_DIGIT* GetMethodArray(METHOD iMethod)
{
if(iMethod < 0 || iMethod >= GeoObjMethodsCount)
return 0;
return &pMethods[GeoObjTypesCount*iMethod];
}
SG_PTR_TO_DIGIT GetObjMethod(OBJTYPE Type, METHOD iMethod)
{
if(Type < 0 || Type >= GeoObjTypesCount ||
iMethod < 0 || iMethod >= GeoObjMethodsCount)
return 0;
return pMethods[GeoObjTypesCount*iMethod + Type];
}
void SetTmpObjMethod(OBJTYPE Type, METHOD iMethod, SG_PTR_TO_DIGIT MethodData)
{
if(Type < 0 || Type >= GeoObjTypesCount ||
iMethod < 0 || iMethod >= GeoObjMethodsCount)
return;
pMethods[GeoObjTypesCount*iMethod + Type] = MethodData;
}
METHOD RegCommonMethod(SG_PTR_TO_DIGIT IdleMethod)
{
COMMONMETHOD Mt;
if(!ObjectsRegStatus)
return -1;
Mt.Idle = IdleMethod;
if(!add_elem(pMethodsVD, &Mt))
goto err;
return pMethodsVD->num_elem - 1;
err:
ObjectsRegStatus = FALSE;
return -1;
}
OBJTYPE RegObjType(char* ObjName, int ObjGeoSize, int OldType, pEL_OBJTYPE pElObjType, BOOL bInGeoObj)
{
int i;
OBJTEMPL ObjTempl;
pOBJTEMPL pObjTempl;
if(!ObjectsRegStatus)
return -1;
if(pGeoObjVD->num_elem >= MAX_OBJECTS_TYPES)
goto err;
for(i = 0; i < pGeoObjVD->num_elem; i++){
pObjTempl =(pOBJTEMPL)get_elem(pGeoObjVD, i);
if(!z_stricmp(pObjTempl->Name, ObjName))
goto err;
}
ObjTempl.Name = ObjName;
ObjTempl.GeoSize = ObjGeoSize;
ObjTempl.OldType = OldType;
ObjTempl.ElGeoMask = 0;
if(bInGeoObj && (sizeof(GEO_OBJ) < ObjGeoSize)){
if(bINHOUSE_VERSION){
char Buf[100];
strcpy(Buf, " MAX_SIMPLE_GEO_SIZE o_model.h ");
//itoa(ObjGeoSize, &Buf[lstrlen(Buf)], 10);
// MessageBox(NULL, Buf, "!", MB_OK|MB_ICONERROR|MB_TASKMODAL);
}
goto err;
}
if(pElObjType){
if(CurrElGeoMask == 0xFFFFFFFF){
if(bINHOUSE_VERSION)
goto err;
}
*pElObjType = ObjTempl.ElGeoMask = CurrElGeoMask;
if(CurrElGeoMask == 0x80000000)
CurrElGeoMask = 0xFFFFFFFF;
else
CurrElGeoMask = CurrElGeoMask << 1;
}
if(!add_elem(pGeoObjVD, &ObjTempl))
goto err;
return pGeoObjVD->num_elem - 1;
err:
ObjectsRegStatus = FALSE;
return -1;
}
OBJTYPE RegCoreObjType(COREOBJTYPE Type, char* ObjName, int ObjGeoSize, int OldType,
pEL_OBJTYPE pElObjType, BOOL bInGeoObj)
{
if(Type == RegObjType(ObjName, ObjGeoSize, OldType, pElObjType, bInGeoObj))
return Type;
ObjectsRegStatus = FALSE;
return -1;
}
BOOL RegObjMethod(OBJTYPE Type, METHOD iMethod, SG_PTR_TO_DIGIT MethodData)
{
OBJMETHOD OMt;
if(!ObjectsRegStatus)
return FALSE;
if(Type >= pGeoObjVD->num_elem || Type < 0)
goto err;
if(iMethod >= pMethodsVD->num_elem || iMethod < 0)
goto err;
OMt.iObjType = Type;
OMt.iMethod = iMethod;
OMt.MethodData = MethodData;
if(!add_elem(pObjMethodsVD, &OMt))
goto err;
return TRUE;
err:
ObjectsRegStatus = FALSE;
return FALSE;
}
OBJTYPE FindObjTypeByName(char* TypeName)
{
OBJTYPE i;
if(!ppGeoObjNames)
return -1;
for(i = 0; i < GeoObjTypesCount; i++){
if(!z_stricmp(ppGeoObjNames[i], TypeName))
return i;
}
return -1;
}
OBJTYPE FindObjTypeByOldType(int OldType)
{
OBJTYPE i;
if(!pOldTypes)
return -1;
for(i = 0; i < GeoObjTypesCount; i++){
if(OldType == pOldTypes[i])
return i;
}
return -1;
}