diff options
Diffstat (limited to 'hammer/helperfactory.cpp')
| -rw-r--r-- | hammer/helperfactory.cpp | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/hammer/helperfactory.cpp b/hammer/helperfactory.cpp new file mode 100644 index 0000000..2cb7e71 --- /dev/null +++ b/hammer/helperfactory.cpp @@ -0,0 +1,102 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: Implements a factory for entity helpers. When an entity is created, +// the helpers from its class definition in the FGD are each instantiated +// and added as children of the entity. +// +//============================================================================= + +#include "stdafx.h" +#include "HelperFactory.h" +#include "fgdlib/HelperInfo.h" +#include "MapAlignedBox.h" +#include "MapAnimator.h" +#include "MapAxisHandle.h" +#include "MapDecal.h" +#include "MapFrustum.h" +#include "MapKeyFrame.h" +#include "MapLightCone.h" +#include "MapLine.h" +#include "MapSprite.h" +#include "MapSphere.h" +#include "MapStudioModel.h" +#include "MapOverlay.h" +#include "MapPointHandle.h" +#include "MapQuadBounds.h" +#include "MapLight.h" +#include "MapSideList.h" +#include "MapCylinder.h" +#include "MapInstance.h" +#include "mapsweptplayerhull.h" +#include "DispShore.h" + +// memdbgon must be the last include file in a .cpp file!!! +#include <tier0/memdbgon.h> + +typedef CMapClass *HELPERFACTORY(CHelperInfo *, CMapEntity *); + + +typedef struct +{ + char *pszName; + HELPERFACTORY *pfnFactory; +} HelperFactoryMap_t; + + +static HelperFactoryMap_t HelperFactoryMap[] = +{ + "sprite", CMapSprite::CreateMapSprite, // Sprite, gets its render mode from the SPR file, has a selection handle. + "iconsprite", CMapSprite::CreateMapSprite, // Masked alpha sprite, no selection handle. + "studio", CMapStudioModel::CreateMapStudioModel, // Studio model with an axial bounding box. + "studioprop", CMapStudioModel::CreateMapStudioModel, // Studio model with an oriented bounding box. + "lightprop", CMapStudioModel::CreateMapStudioModel, // Studio model with an oriented bounding box, reverses pitch. + "quadbounds", CMapQuadBounds::CreateQuadBounds, // Extracts the verts from a quad face of a brush. + "animator", CMapAnimator::CreateMapAnimator, // Previews the motion of a moving entity (keyframe follower). + "keyframe", CMapKeyFrame::CreateMapKeyFrame, // Autonames when cloned and draws lines to the next keyframe. + "decal", CMapDecal::CreateMapDecal, // Decal that automatically attaches to nearby faces. + "wirebox", CMapAlignedBox::Create, // Wireframe box that can extract its mins & maxs. + "line", CMapLine::Create, // Line drawn between any two entities. + "nodelink", CMapLine::Create, // Line drawn between any two navigation nodes. + "lightcone", CMapLightCone::Create, // Faceted cone showing light angles and falloff. + "frustum", CMapFrustum::Create, // Wireframe frustum. + "sphere", CMapSphere::Create, // Wireframe sphere indicating a radius. + "overlay", CMapOverlay::CreateMapOverlay, // A decal with manipulatable vertices. + "light", CMapLight::CreateMapLight, // Light source for lighting preview. + "sidelist", CMapSideList::CreateMapSideList, // List of CMapFace pointers set by face ID. + "origin", CMapPointHandle::Create, // Handle used to manipulate the origin of an entity. + "vecline", CMapPointHandle::Create, // Handle used to manipulate another point that draws a line back to its parent entity. + "axis", CMapAxisHandle::Create, // Handle used to manipulate the axis of an entity. + "cylinder", CMapCylinder::Create, // Wireframe cylinder with separate radii at each end + "sweptplayerhull", CMapSweptPlayerHull::Create, // A swept player sized hull between two points (ladders) + "overlay_transition", CMapOverlayTransition::Create, // Notes!! + "instance", CMapInstance::Create, // A map instance used for rendering the sub-map +}; + + +//----------------------------------------------------------------------------- +// Purpose: Creates a helper from a helper info object. +// Input : pHelperInfo - holds information about the helper to be created and +// arguments to be passed to the helper when it is created. +// pParent - The entity that will be the helper's parent. +// Output : Returns a pointer to the newly created helper. +//----------------------------------------------------------------------------- +CMapClass *CHelperFactory::CreateHelper(CHelperInfo *pHelperInfo, CMapEntity *pParent) +{ + // + // Look up the helper factory function in the factory function table. + // + for (int i = 0; i < sizeof(HelperFactoryMap) / sizeof(HelperFactoryMap[0]); i++) + { + // + // If the function was found in the table, create the helper and return it. + // + if (!stricmp(HelperFactoryMap[i].pszName, pHelperInfo->GetName())) + { + CMapClass *pHelper = HelperFactoryMap[i].pfnFactory(pHelperInfo, pParent); + return(pHelper); + } + } + + return(NULL); +} + |