📄 engineobjects.c
字号:
#ifdef COMPILE_WITH_C
typedef struct
{
BaseClass m_BaseClass;
} StartPoint;
BEGIN_CLASS(StartPoint)
END_CLASS_DEFAULT_FLAGS(StartPoint, BaseClass, bc_EngineMessageFn, bc_ObjectMessageFn, CF_ALWAYSLOAD)
#endif // COMPILE_WITH_C
// OutsideDef class.
// These are used if you want the preprocessor to make a leak file for a level.
typedef struct
{
BaseClass m_BaseClass;
} OutsideDef;
BEGIN_CLASS(OutsideDef)
END_CLASS_DEFAULT_FLAGS(OutsideDef, BaseClass, bc_EngineMessageFn, bc_ObjectMessageFn, CF_NORUNTIME )
// FastApproxArea class.
// This defines an area where only fast approximation vising will occur. The
// area is bounded by hullmakers and portals.
typedef struct
{
BaseClass m_BaseClass;
} FastApproxArea;
BEGIN_CLASS(FastApproxArea)
END_CLASS_DEFAULT_FLAGS(FastApproxArea, BaseClass, bc_EngineMessageFn, bc_ObjectMessageFn, CF_NORUNTIME )
// Light class.
typedef struct
{
BaseClass m_BaseClass;
} Light;
BEGIN_CLASS(Light)
ADD_BOOLPROP(ClipLight, 1)
ADD_BOOLPROP(LightObjects, 1)
ADD_REALPROP_FLAG(LightRadius, 300.0f, PF_RADIUS)
ADD_COLORPROP(LightColor, 255.0f, 255.0f, 255.0f)
ADD_COLORPROP(OuterColor, 0.0f, 0.0f, 0.0f)
ADD_REALPROP(BrightScale, 1.0f)
ADD_REALPROP(Time, 0.0f)
END_CLASS_DEFAULT_FLAGS(Light, BaseClass, bc_EngineMessageFn, bc_ObjectMessageFn, CF_NORUNTIME )
// ObjectLight class (these lights only light objects.. they don't light the world). These
// are used for landscape areas lit by GlobalDirLights (which don't light objects).
typedef struct
{
BaseClass m_BaseClass;
} ObjectLight;
BEGIN_CLASS(ObjectLight)
ADD_REALPROP_FLAG(LightRadius, 300.0f, PF_RADIUS)
ADD_COLORPROP(LightColor, 255.0f, 255.0f, 255.0f)
ADD_COLORPROP(OuterColor, 0.0f, 0.0f, 0.0f)
ADD_REALPROP(BrightScale, 1.0f)
END_CLASS_DEFAULT_FLAGS(ObjectLight, BaseClass, bc_EngineMessageFn, bc_ObjectMessageFn, CF_NORUNTIME)
// DirLight class (just uses the Light code).
typedef struct DirLight_t
{
BaseClass m_BaseClass;
} DirLight;
BEGIN_CLASS(DirLight)
ADD_BOOLPROP(LightObjects, 1)
ADD_BOOLPROP(ClipLight, 1)
ADD_REALPROP_FLAG(LightRadius, 300.0f, PF_RADIUS)
ADD_COLORPROP(InnerColor, 255.0f, 255.0f, 255.0f)
ADD_COLORPROP(OuterColor, 0.0f, 0.0f, 0.0f)
ADD_REALPROP_FLAG(FOV, 90.0f, PF_FIELDOFVIEW)
ADD_REALPROP(BrightScale, 1.0f)
ADD_REALPROP(Time, 0.0f)
END_CLASS_DEFAULT_FLAGS(DirLight, BaseClass, bc_EngineMessageFn, bc_ObjectMessageFn, CF_NORUNTIME)
// LightAnimator class.
typedef struct LightAnimator_t
{
BaseClass m_BaseClass;
} LightAnimator;
BEGIN_CLASS(LightAnimator)
ADD_STRINGPROP(BaseLightName, "light")
END_CLASS_DEFAULT_FLAGS(LightAnimator, BaseClass, bc_EngineMessageFn, bc_ObjectMessageFn, CF_NORUNTIME)
// ProjectorSprite.
typedef struct ProjectorSprite_t
{
BaseClass m_BaseClass;
} ProjectorSprite;
BEGIN_CLASS(ProjectorSprite)
ADD_STRINGPROP(Filename, "sprite.spr")
END_CLASS_DEFAULT_FLAGS(ProjectorSprite, BaseClass, bc_EngineMessageFn, bc_ObjectMessageFn, CF_NORUNTIME)
// GlobalDirLight class (just uses the Light code).
typedef struct GlobalDirLight_t
{
BaseClass m_BaseClass;
} GlobalDirLight;
BEGIN_CLASS(GlobalDirLight)
ADD_VECTORPROP_VAL_FLAG(BigDims, 90.0f, 90.0f, 90.0f, PF_DIMS|PF_HIDDEN)
ADD_COLORPROP(InnerColor, 255.0f, 255.0f, 255.0f)
ADD_COLORPROP(OuterColor, 0.0f, 0.0f, 0.0f)
ADD_REALPROP(BrightScale, 1.0f)
END_CLASS_DEFAULT_FLAGS(GlobalDirLight, BaseClass, bc_EngineMessageFn, bc_ObjectMessageFn, CF_NORUNTIME)
// World class..
typedef struct
{
BaseClass m_BaseClass;
} World;
BEGIN_CLASS(World)
END_CLASS_DEFAULT_FLAGS(World, BaseClass, DNULL, DNULL, CF_ALWAYSLOAD)
// Brush class.
typedef struct
{
BaseClass m_BaseClass;
} Brush;
BEGIN_CLASS(Brush)
ADD_BOOLPROP(Solid, 1)
ADD_BOOLPROP(Nonexistant, 0)
ADD_BOOLPROP(Invisible, 0)
ADD_BOOLPROP(Translucent, 0)
ADD_BOOLPROP(SkyPortal, 0)
ADD_BOOLPROP(FullyBright, 0)
ADD_BOOLPROP(FlatShade, 0)
ADD_BOOLPROP(GouraudShade, 1)
ADD_BOOLPROP(LightMap, 1)
ADD_BOOLPROP(Subdivide, 1)
ADD_BOOLPROP(HullMaker, 0)
ADD_BOOLPROP(AlwaysLightMap, 0)
ADD_BOOLPROP(DirectionalLight, 0)
ADD_BOOLPROP(Portal, 0)
ADD_BOOLPROP(NoSnap, 0)
ADD_BOOLPROP(SkyPan, 0)
ADD_LONGINTPROP(DetailLevel, 0)
ADD_STRINGPROP(Effect, "")
ADD_STRINGPROP(EffectParam, "")
ADD_REALPROP(FrictionCoefficient, 1)
END_CLASS_DEFAULT_FLAGS(Brush, BaseClass, bc_EngineMessageFn, bc_ObjectMessageFn, CF_ALWAYSLOAD)
// DemoSkyWorldModel class. This is a WorldModel that adds itself to the sky object
// list and has properties that level designers can edit to set the sky dimensions.
// If the sky box is set to zero, then it won't set it. (This is so you can have
// multiple DemoSkyWorldModels in the world, and only one sets the sky box).
// The DemoSkyWorldModel uses InnerPercentX, Y, and Z as a percentage of the
// SkyDims box for the inner box.
// Each sky world model must have a (unique) index from 0-30. Ones with
// lower indices get drawn first.
typedef struct
{
BaseClass BaseClass;
DVector SkyDims;
float InnerPercentX, InnerPercentY, InnerPercentZ;
long Index;
} DemoSkyWorldModel;
static DDWORD DemoSky_EngineMessageFn(LPBASECLASS pObject, DDWORD messageID, void *pData, float lData)
{
DemoSkyWorldModel *pModel;
SkyDef def;
DVector pos, temp;
ObjectCreateStruct *pStruct;
HOBJECT hObject;
pModel = (DemoSkyWorldModel*)pObject;
switch(messageID)
{
case MID_PRECREATE:
{
pStruct = (ObjectCreateStruct*)pData;
pStruct->m_ObjectType = OT_WORLDMODEL;
if( lData == 1.0f )
{
g_pServerDE->GetPropVector("SkyDims", &pModel->SkyDims);
g_pServerDE->GetPropString("Name", pStruct->m_Filename, MAX_CS_FILENAME_LEN);
g_pServerDE->GetPropReal("InnerPercentX", &pModel->InnerPercentX);
g_pServerDE->GetPropReal("InnerPercentY", &pModel->InnerPercentY);
g_pServerDE->GetPropReal("InnerPercentZ", &pModel->InnerPercentZ);
g_pServerDE->GetPropLongInt("Index", &pModel->Index);
}
else
{
VEC_INIT( pModel->SkyDims );
pModel->InnerPercentX = 0.1f;
pModel->InnerPercentY = 0.1f;
pModel->InnerPercentZ = 0.1f;
pModel->Index = 0;
}
break;
}
case MID_INITIALUPDATE:
{
// Set the sky box?
if(pModel->SkyDims.x != 0.0f && pModel->SkyDims.y != 0.0f && pModel->SkyDims.z != 0.0f)
{
g_pServerDE->GetObjectPos(pModel->BaseClass.m_hObject, &pos);
VEC_SUB(def.m_Min, pos, pModel->SkyDims);
VEC_ADD(def.m_Max, pos, pModel->SkyDims);
temp.x = pModel->SkyDims.x * pModel->InnerPercentX;
temp.y = pModel->SkyDims.y * pModel->InnerPercentY;
temp.z = pModel->SkyDims.z * pModel->InnerPercentZ;
VEC_SUB(def.m_ViewMin, pos, temp);
VEC_ADD(def.m_ViewMax, pos, temp);
g_pServerDE->SetSkyDef(&def);
}
hObject = pModel->BaseClass.m_hObject;
g_pServerDE->SetObjectFlags(hObject, g_pServerDE->GetObjectFlags(hObject) | (FLAG_SKYOBJECT|FLAG_FORCEOPTIMIZEOBJECT));
g_pServerDE->AddObjectToSky(pModel->BaseClass.m_hObject, pModel->Index);
break;
}
}
return bc_EngineMessageFn(pObject, messageID, pData, lData);
}
BEGIN_CLASS(DemoSkyWorldModel)
ADD_VECTORPROP_VAL_FLAG(SkyDims, 0.0f, 0.0f, 0.0f, PF_DIMS)
ADD_LONGINTPROP(Flags, 1)
ADD_LONGINTPROP(Index, 0)
ADD_REALPROP(InnerPercentX, 0.1f)
ADD_REALPROP(InnerPercentY, 0.1f)
ADD_REALPROP(InnerPercentZ, 0.1f)
END_CLASS_DEFAULT_FLAGS(DemoSkyWorldModel, BaseClass, DemoSky_EngineMessageFn, bc_ObjectMessageFn, CF_ALWAYSLOAD)
// This works exactly the same as a DemoSkyWorldModel, except you identify the object by name.
typedef struct
{
BaseClass BaseClass;
DVector SkyDims;
float InnerPercentX, InnerPercentY, InnerPercentZ;
long Index;
char m_ObjectName[100];
HOBJECT m_hObject;
} SkyPointer;
static DDWORD SkyPointer_EngineMessageFn(LPBASECLASS pObject, DDWORD messageID, void *pData, float lData)
{
SkyPointer *pModel;
SkyDef def;
DVector pos, temp;
ObjectCreateStruct *pStruct;
ObjectList *pList;
HOBJECT hObject;
pModel = (SkyPointer*)pObject;
switch(messageID)
{
case MID_PRECREATE:
{
pStruct = (ObjectCreateStruct*)pData;
pStruct->m_ObjectType = OT_NORMAL;
pModel->m_hObject = 0;
if( lData == 1.0f )
{
g_pServerDE->GetPropVector("SkyDims", &pModel->SkyDims);
g_pServerDE->GetPropString("Name", pStruct->m_Filename, MAX_CS_FILENAME_LEN);
g_pServerDE->GetPropString("SkyObjectName", pModel->m_ObjectName, sizeof(pModel->m_ObjectName)-1);
g_pServerDE->GetPropReal("InnerPercentX", &pModel->InnerPercentX);
g_pServerDE->GetPropReal("InnerPercentY", &pModel->InnerPercentY);
g_pServerDE->GetPropReal("InnerPercentZ", &pModel->InnerPercentZ);
g_pServerDE->GetPropLongInt("Index", &pModel->Index);
}
else
{
pModel->m_ObjectName[0] = 0;
VEC_INIT( pModel->SkyDims );
pModel->InnerPercentX = 0.1f;
pModel->InnerPercentY = 0.1f;
pModel->InnerPercentZ = 0.1f;
pModel->Index = 0;
}
break;
}
case MID_INITIALUPDATE:
{
// Set the sky box?
if(pModel->SkyDims.x != 0.0f && pModel->SkyDims.y != 0.0f && pModel->SkyDims.z != 0.0f)
{
g_pServerDE->GetObjectPos(pModel->BaseClass.m_hObject, &pos);
VEC_SUB(def.m_Min, pos, pModel->SkyDims);
VEC_ADD(def.m_Max, pos, pModel->SkyDims);
temp.x = pModel->SkyDims.x * pModel->InnerPercentX;
temp.y = pModel->SkyDims.y * pModel->InnerPercentY;
temp.z = pModel->SkyDims.z * pModel->InnerPercentZ;
VEC_SUB(def.m_ViewMin, pos, temp);
VEC_ADD(def.m_ViewMax, pos, temp);
g_pServerDE->SetSkyDef(&def);
}
g_pServerDE->SetNextUpdate(pModel->BaseClass.m_hObject, 0.001f);
break;
}
case MID_UPDATE:
{
// Add the first object to the sky.
pList = g_pServerDE->FindNamedObjects(pModel->m_ObjectName);
if(pList && pList->m_pFirstLink)
{
hObject = pList->m_pFirstLink->m_hObject;
g_pServerDE->AddObjectToSky(hObject, pModel->Index);
g_pServerDE->SetObjectFlags(hObject, g_pServerDE->GetObjectFlags(hObject) | (FLAG_SKYOBJECT|FLAG_FORCEOPTIMIZEOBJECT));
g_pServerDE->RelinquishList(pList);
}
g_pServerDE->RemoveObject(pModel->BaseClass.m_hObject);
break;
}
}
return bc_EngineMessageFn(pObject, messageID, pData, lData);
}
BEGIN_CLASS(SkyPointer)
ADD_STRINGPROP(SkyObjectName, "")
ADD_VECTORPROP_VAL_FLAG(SkyDims, 0.0f, 0.0f, 0.0f, PF_DIMS)
ADD_LONGINTPROP(Flags, 1)
ADD_LONGINTPROP(Index, 0)
ADD_REALPROP(InnerPercentX, 0.1f)
ADD_REALPROP(InnerPercentY, 0.1f)
ADD_REALPROP(InnerPercentZ, 0.1f)
END_CLASS_DEFAULT_FLAGS(SkyPointer, BaseClass, SkyPointer_EngineMessageFn, bc_ObjectMessageFn, CF_ALWAYSLOAD)
// These generate areas of fog.
typedef struct FogSphere_t
{
BaseClass m_BaseClass;
float m_Radius;
} FogSphere;
static DDWORD FogSphere_EngineMessageFn(LPBASECLASS pObject, DDWORD messageID, void *pData, float lData)
{
ObjectCreateStruct *pStruct;
GenericProp prop;
FogSphere *pSphere;
pSphere = (FogSphere*)pObject;
switch(messageID)
{
case MID_PRECREATE:
{
pStruct = (ObjectCreateStruct*)pData;
pStruct->m_ObjectType = OT_LIGHT;
pStruct->m_Flags = FLAG_VISIBLE | FLAG_FOGLIGHT;
g_pServerDE->GetPropGeneric("LightRadius", &prop);
pSphere->m_Radius = prop.m_Float;
}
break;
case MID_INITIALUPDATE:
{
g_pServerDE->SetLightRadius(pObject->m_hObject, pSphere->m_Radius);
}
break;
}
return bc_EngineMessageFn(pObject, messageID, pData, lData);
}
BEGIN_CLASS(FogSphere)
ADD_REALPROP_FLAG(LightRadius, 300.0f, PF_RADIUS)
END_CLASS_DEFAULT_FLAGS(FogSphere, BaseClass, FogSphere_EngineMessageFn, bc_ObjectMessageFn, CF_ALWAYSLOAD)
// These objects, when used with the preprocessor's -RaySelect flag, will cause the
// first brush this object's forward vector hits to be selected in the ED file.
typedef struct RaySelecter_t
{
BaseClass m_BaseClass;
} RaySelecter;
BEGIN_CLASS(RaySelecter)
END_CLASS_DEFAULT_FLAGS(RaySelecter, BaseClass, bc_EngineMessageFn, bc_ObjectMessageFn, CF_NORUNTIME)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -