find_package(ZLIB REQUIRED)
find_package(JPEG REQUIRED)
find_package(Threads REQUIRED)
find_package(PhysX)

include_directories(${CMAKE_CURRENT_SOURCE_DIR})
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/3rdPartyLibs/squish)
include_directories(${ZLIB_INCLUDE_DIR})
include_directories(${JPEG_INCLUDE_DIR})

if(PHYSX_FOUND)
    add_definitions(-DHAVE_PX_SDK)
    include_directories(${PHYSX_INCLUDE_DIRS})
endif(PHYSX_FOUND)

add_definitions(-DBUILD_PLASMA_DLL)

set(DEBUG_SRCS
    Debug/hsExceptions.cpp
    Debug/plDebug.cpp
)
set(DEBUG_HDRS
    Debug/hsExceptions.h
    Debug/plDebug.h
)

set(MATH_SRCS
    Math/hsAffineParts.cpp
    Math/hsGeometry3.cpp
    Math/hsMatrix33.cpp
    Math/hsMatrix44.cpp
    Math/hsQuat.cpp
)
set(MATH_HDRS
    Math/hsAffineParts.h
    Math/hsGeometry3.h
    Math/hsMatrix33.h
    Math/hsMatrix44.h
    Math/hsQuat.h
)

set(PRP_ANIM_SRCS
    PRP/Animation/hsKeys.cpp
    PRP/Animation/pfObjectFlocker.cpp
    PRP/Animation/plATCEaseCurves.cpp
    PRP/Animation/plAnimPath.cpp
    PRP/Animation/plAnimTimeConvert.cpp
    PRP/Animation/plBlower.cpp
    PRP/Animation/plController.cpp
    PRP/Animation/plFilterCoordInterface.cpp
    PRP/Animation/plLeafController.cpp
    PRP/Animation/plLineFollowMod.cpp
    PRP/Animation/plPosController.cpp
    PRP/Animation/plRotController.cpp
    PRP/Animation/plScaleController.cpp
    PRP/Animation/plStereizer.cpp
    PRP/Animation/plTMController.cpp
    PRP/Animation/plViewFaceModifier.cpp
)
set(PRP_ANIM_HDRS
    PRP/Animation/hsKeys.h
    PRP/Animation/pfObjectFlocker.h
    PRP/Animation/plATCEaseCurves.h
    PRP/Animation/plAnimPath.h
    PRP/Animation/plAnimTimeConvert.h
    PRP/Animation/plBlower.h
    PRP/Animation/plController.h
    PRP/Animation/plFilterCoordInterface.h
    PRP/Animation/plKeyControllers.hpp
    PRP/Animation/plLeafController.h
    PRP/Animation/plLineFollowMod.h
    PRP/Animation/plPosController.h
    PRP/Animation/plRotController.h
    PRP/Animation/plScaleController.h
    PRP/Animation/plStereizer.h
    PRP/Animation/plTMController.h
    PRP/Animation/plViewFaceModifier.h
)

set(PRP_AUD_SRCS
    PRP/Audio/plAudible.cpp
    PRP/Audio/plCrossfade.cpp
    PRP/Audio/plDirectMusicSound.cpp
    PRP/Audio/plEAXEffects.cpp
    PRP/Audio/plEAXListenerMod.cpp
    PRP/Audio/plSound.cpp
    PRP/Audio/plSoundBuffer.cpp
    PRP/Audio/plWin32Sound.cpp
    PRP/Audio/plWin32StaticSound.cpp
)
set(PRP_AUD_HDRS
    PRP/Audio/plAudible.h
    PRP/Audio/plCrossfade.h
    PRP/Audio/plDirectMusicSound.h
    PRP/Audio/plEAXEffects.h
    PRP/Audio/plEAXListenerMod.h
    PRP/Audio/plSound.h
    PRP/Audio/plSoundBuffer.h
    PRP/Audio/plWin32Sound.h
    PRP/Audio/plWin32StaticSound.h
)

set(PRP_AVTR_SRCS
    PRP/Avatar/plAGAnim.cpp
    PRP/Avatar/plAGApplicator.cpp
    PRP/Avatar/plAGChannel.cpp
    PRP/Avatar/plAGMasterMod.cpp
    PRP/Avatar/plAGModifier.cpp
    PRP/Avatar/plATCAnim.cpp
    PRP/Avatar/plAnimStage.cpp
    PRP/Avatar/plArmatureBrain.cpp
    PRP/Avatar/plArmatureEffects.cpp
    PRP/Avatar/plArmatureMod.cpp
    PRP/Avatar/plAvBrainCoop.cpp
    PRP/Avatar/plAvBrainGeneric.cpp
    PRP/Avatar/plAvTask.cpp
    PRP/Avatar/plAvatarClothing.cpp
    PRP/Avatar/plClothingItem.cpp
    PRP/Avatar/plLadderModifier.cpp
    PRP/Avatar/plMatrixChannel.cpp
    PRP/Avatar/plMultistageBehMod.cpp
    PRP/Avatar/plNPCSpawnMod.cpp
    PRP/Avatar/plPointChannel.cpp
    PRP/Avatar/plQuatChannel.cpp
    PRP/Avatar/plScalarChannel.cpp
    PRP/Avatar/plSeekPointMod.cpp
    PRP/Avatar/plSittingModifier.cpp
)
set(PRP_AVTR_HDRS
    PRP/Avatar/plAGAnim.h
    PRP/Avatar/plAGApplicator.h
    PRP/Avatar/plAGChannel.h
    PRP/Avatar/plAGMasterMod.h
    PRP/Avatar/plAGModifier.h
    PRP/Avatar/plATCAnim.h
    PRP/Avatar/plAnimStage.h
    PRP/Avatar/plArmatureBrain.h
    PRP/Avatar/plArmatureEffects.h
    PRP/Avatar/plArmatureMod.h
    PRP/Avatar/plAvBrainCoop.h
    PRP/Avatar/plAvBrainGeneric.h
    PRP/Avatar/plAvTask.h
    PRP/Avatar/plAvatarClothing.h
    PRP/Avatar/plClothingItem.h
    PRP/Avatar/plLadderModifier.h
    PRP/Avatar/plMatrixChannel.h
    PRP/Avatar/plMultistageBehMod.h
    PRP/Avatar/plNPCSpawnMod.h
    PRP/Avatar/plPointChannel.h
    PRP/Avatar/plQuatChannel.h
    PRP/Avatar/plScalarChannel.h
    PRP/Avatar/plSeekPointMod.h
    PRP/Avatar/plSittingModifier.h
)

set(PRP_CMRA_SRCS
    PRP/Camera/plCameraBrain.cpp
    PRP/Camera/plCameraModifier.cpp
)
set(PRP_CMRA_HDRS
    PRP/Camera/plCameraBrain.h
    PRP/Camera/plCameraModifier.h
)

set(PRP_COND_SRCS
    PRP/ConditionalObject/plActivatorConditionalObject.cpp
    PRP/ConditionalObject/plAnimationEventConditionalObject.cpp
    PRP/ConditionalObject/plBooleanConditionalObject.cpp
    PRP/ConditionalObject/plConditionalObject.cpp
    PRP/ConditionalObject/plControlEventConditionalObject.cpp
    PRP/ConditionalObject/plFacingConditionalObject.cpp
    PRP/ConditionalObject/plKeyPressConditionalObject.cpp
    PRP/ConditionalObject/plVolumeSensorConditionalObject.cpp
)
set(PRP_COND_HDRS
    PRP/ConditionalObject/plActivatorConditionalObject.h
    PRP/ConditionalObject/plAnimationEventConditionalObject.h
    PRP/ConditionalObject/plBooleanConditionalObject.h
    PRP/ConditionalObject/plConditionalObject.h
    PRP/ConditionalObject/plControlEventConditionalObject.h
    PRP/ConditionalObject/plDetectConditionalObjects.hpp
    PRP/ConditionalObject/plFacingConditionalObject.h
    PRP/ConditionalObject/plKeyPressConditionalObject.h
    PRP/ConditionalObject/plVolumeSensorConditionalObject.h
)

set(PRP_GEOM_SRCS
    PRP/Geometry/hsGDeviceRef.cpp
    PRP/Geometry/plCluster.cpp
    PRP/Geometry/plClusterGroup.cpp
    PRP/Geometry/plCullPoly.cpp
    PRP/Geometry/plDrawableSpans.cpp
    PRP/Geometry/plGBufferGroup.cpp
    PRP/Geometry/plGeometrySpan.cpp
    PRP/Geometry/plIcicle.cpp
    PRP/Geometry/plMorphArray.cpp
    PRP/Geometry/plMorphDataSet.cpp
    PRP/Geometry/plMorphDelta.cpp
    PRP/Geometry/plMorphSequence.cpp
    PRP/Geometry/plOccluder.cpp
    PRP/Geometry/plSharedMesh.cpp
    PRP/Geometry/plSpaceTree.cpp
    PRP/Geometry/plSpan.cpp
    PRP/Geometry/plSpanInstance.cpp
    PRP/Geometry/plSpanTemplate.cpp
    PRP/Geometry/plVertCoder.cpp
    PRP/Geometry/plVertexSpan.cpp
)
set(PRP_GEOM_HDRS
    PRP/Geometry/hsGDeviceRef.h
    PRP/Geometry/plCluster.h
    PRP/Geometry/plClusterGroup.h
    PRP/Geometry/plCullPoly.h
    PRP/Geometry/plDrawableSpans.h
    PRP/Geometry/plGBufferGroup.h
    PRP/Geometry/plGeometrySpan.h
    PRP/Geometry/plIcicle.h
    PRP/Geometry/plMorphArray.h
    PRP/Geometry/plMorphDataSet.h
    PRP/Geometry/plMorphDelta.h
    PRP/Geometry/plMorphSequence.h
    PRP/Geometry/plOccluder.h
    PRP/Geometry/plSharedMesh.h
    PRP/Geometry/plSpaceTree.h
    PRP/Geometry/plSpan.h
    PRP/Geometry/plSpanInstance.h
    PRP/Geometry/plSpanTemplate.h
    PRP/Geometry/plVertCoder.h
    PRP/Geometry/plVertexSpan.h
)

set(PRP_GUI_SRCS
    PRP/GUI/pfGUIButtonMod.cpp
    PRP/GUI/pfGUICheckBoxCtrl.cpp
    PRP/GUI/pfGUIControlHandlers.cpp
    PRP/GUI/pfGUIControlMod.cpp
    PRP/GUI/pfGUIDialogMod.cpp
    PRP/GUI/pfGUIDynDisplayCtrl.cpp
    PRP/GUI/pfGUIKnobCtrl.cpp
    PRP/GUI/pfGUIListBoxMod.cpp
    PRP/GUI/pfGUIMultiLineEditCtrl.cpp
    PRP/GUI/pfGUIPopUpMenu.cpp
    PRP/GUI/pfGUIProgressCtrl.cpp
    PRP/GUI/pfGUIRadioGroupCtrl.cpp
    PRP/GUI/pfGUISkin.cpp
    PRP/GUI/pfGUITextBoxMod.cpp
    PRP/GUI/pfGUIUpDownPairMod.cpp
    PRP/GUI/pfGUIValueCtrl.cpp
    PRP/GUI/plImageLibMod.cpp
)
set(PRP_GUI_HDRS
    PRP/GUI/pfGUIButtonMod.h
    PRP/GUI/pfGUICheckBoxCtrl.h
    PRP/GUI/pfGUIControlHandlers.h
    PRP/GUI/pfGUIControlMod.h
    PRP/GUI/pfGUIDialogMod.h
    PRP/GUI/pfGUIDynDisplayCtrl.h
    PRP/GUI/pfGUIKnobCtrl.h
    PRP/GUI/pfGUIListBoxMod.h
    PRP/GUI/pfGUIMisc.hpp
    PRP/GUI/pfGUIMultiLineEditCtrl.h
    PRP/GUI/pfGUIPopUpMenu.h
    PRP/GUI/pfGUIProgressCtrl.h
    PRP/GUI/pfGUIRadioGroupCtrl.h
    PRP/GUI/pfGUISkin.h
    PRP/GUI/pfGUITextBoxMod.h
    PRP/GUI/pfGUIUpDownPairMod.h
    PRP/GUI/pfGUIValueCtrl.h
    PRP/GUI/plImageLibMod.h
)

set(PRP_KEY_SRCS
    PRP/KeyedObject/hsKeyedObject.cpp
    PRP/KeyedObject/plKey.cpp
    PRP/KeyedObject/plLoadMask.cpp
    PRP/KeyedObject/plLocation.cpp
    PRP/KeyedObject/plUoid.cpp
)
set(PRP_KEY_HDRS
    PRP/KeyedObject/hsKeyedObject.h
    PRP/KeyedObject/plKey.h
    PRP/KeyedObject/plLoadMask.h
    PRP/KeyedObject/plLocation.h
    PRP/KeyedObject/plUoid.h
)

set(PRP_LIT_SRCS
    PRP/Light/plDirectionalLightInfo.cpp
    PRP/Light/plLightInfo.cpp
    PRP/Light/plOmniLightInfo.cpp
    PRP/Light/plShadowCaster.cpp
    PRP/Light/plShadowMaster.cpp
)
set(PRP_LIT_HDRS
    PRP/Light/plDirectionalLightInfo.h
    PRP/Light/plLightInfo.h
    PRP/Light/plOmniLightInfo.h
    PRP/Light/plShadowCaster.h
    PRP/Light/plShadowMaster.h
)

set(PRP_MSG_SRCS
    PRP/Message/pfKIMsg.cpp
    PRP/Message/plAccountUpdateMsg.cpp
    PRP/Message/plAnimCmdMsg.cpp
    PRP/Message/plArmatureEffectMsg.cpp
    PRP/Message/plAvSeekMsg.cpp
    PRP/Message/plAvTaskMsg.cpp
    PRP/Message/plAvatarInputStateMsg.cpp
    PRP/Message/plAvatarMsg.cpp
    PRP/Message/plCameraMsg.cpp
    PRP/Message/plClimbMsg.cpp
    PRP/Message/plConsoleMsg.cpp
    PRP/Message/plEnableMsg.cpp
    PRP/Message/plEventCallbackMsg.cpp
    PRP/Message/plExcludeRegionMsg.cpp
    PRP/Message/plInputIfaceMgrMsg.cpp
    PRP/Message/plLinkEffectsTriggerMsg.cpp
    PRP/Message/plLinkToAgeMsg.cpp
    PRP/Message/plLoadAvatarMsg.cpp
    PRP/Message/plLoadCloneMsg.cpp
    PRP/Message/plMessage.cpp
    PRP/Message/plMessageWithCallbacks.cpp
    PRP/Message/plMsgForwarder.cpp
    PRP/Message/plNotifyMsg.cpp
    PRP/Message/plOneShotCallbacks.cpp
    PRP/Message/plPseudoLinkEffectMsg.cpp
    PRP/Message/plResponderMsg.cpp
    PRP/Message/plRideAnimatedPhysMsg.cpp
    PRP/Message/plServerReplyMsg.cpp
    PRP/Message/plSimulationMsg.cpp
    PRP/Message/plSoundMsg.cpp
    PRP/Message/plSwimMsg.cpp
    PRP/Message/plTimerCallbackMsg.cpp
    PRP/Message/plTransitionMsg.cpp
    PRP/Message/proEventData.cpp
)
set(PRP_MSG_HDRS
    PRP/Message/pfKIMsg.h
    PRP/Message/plAccountUpdateMsg.h
    PRP/Message/plAnimCmdMsg.h
    PRP/Message/plArmatureEffectMsg.h
    PRP/Message/plAvSeekMsg.h
    PRP/Message/plAvTaskMsg.h
    PRP/Message/plAvatarInputStateMsg.h
    PRP/Message/plAvatarMsg.h
    PRP/Message/plCameraMsg.h
    PRP/Message/plClimbMsg.h
    PRP/Message/plConsoleMsg.h
    PRP/Message/plEnableMsg.h
    PRP/Message/plEventCallbackMsg.h
    PRP/Message/plExcludeRegionMsg.h
    PRP/Message/plInputIfaceMgrMsg.h
    PRP/Message/plLinkEffectsTriggerMsg.h
    PRP/Message/plLinkToAgeMsg.h
    PRP/Message/plLoadAvatarMsg.h
    PRP/Message/plLoadCloneMsg.h
    PRP/Message/plMessage.h
    PRP/Message/plMessageWithCallbacks.h
    PRP/Message/plMsgForwarder.h
    PRP/Message/plNotifyMsg.h
    PRP/Message/plOneShotCallbacks.h
    PRP/Message/plPseudoLinkEffectMsg.h
    PRP/Message/plResponderMsg.h
    PRP/Message/plRideAnimatedPhysMsg.h
    PRP/Message/plServerReplyMsg.h
    PRP/Message/plSimulationMsg.h
    PRP/Message/plSoundMsg.h
    PRP/Message/plSwimMsg.h
    PRP/Message/plTimerCallbackMsg.h
    PRP/Message/plTransitionMsg.h
    PRP/Message/proEventData.h
)

set(PRP_MISC_SRCS
    PRP/Misc/plAgeLinkInfo.cpp
    PRP/Misc/plFogEnvironment.cpp
    PRP/Misc/plSpawnPointInfo.cpp
)
set(PRP_MISC_HDRS
    PRP/Misc/plAgeLinkInfo.h
    PRP/Misc/plFogEnvironment.h
    PRP/Misc/plRenderLevel.h
    PRP/Misc/plSpawnPointInfo.h
)

set(PRP_MOD_SRCS
    PRP/Modifier/plAliasModifier.cpp
    PRP/Modifier/plAnimEventModifier.cpp
    PRP/Modifier/plAxisAnimModifier.cpp
    PRP/Modifier/plExcludeRegionModifier.cpp
    PRP/Modifier/plGameMarkerModifier.cpp
    PRP/Modifier/plInterfaceInfoModifier.cpp
    PRP/Modifier/plLogicModBase.cpp
    PRP/Modifier/plLogicModifier.cpp
    PRP/Modifier/plMaintainersMarkerModifier.cpp
    PRP/Modifier/plModifier.cpp
    PRP/Modifier/plNodeRegionModifier.cpp
    PRP/Modifier/plOneShotMod.cpp
    PRP/Modifier/plPostEffectMod.cpp
    PRP/Modifier/plPythonFileMod.cpp
    PRP/Modifier/plPythonMod.cpp
    PRP/Modifier/plRandomCommandMod.cpp
    PRP/Modifier/plRandomSoundMod.cpp
    PRP/Modifier/plResponderModifier.cpp
    PRP/Modifier/plSpawnModifier.cpp
)
set(PRP_MOD_HDRS
    PRP/Modifier/plAliasModifier.h
    PRP/Modifier/plAnimEventModifier.h
    PRP/Modifier/plAxisAnimModifier.h
    PRP/Modifier/plExcludeRegionModifier.h
    PRP/Modifier/plGameMarkerModifier.h
    PRP/Modifier/plInterfaceInfoModifier.h
    PRP/Modifier/plLogicModBase.h
    PRP/Modifier/plLogicModifier.h
    PRP/Modifier/plMaintainersMarkerModifier.h
    PRP/Modifier/plModifier.h
    PRP/Modifier/plNodeRegionModifier.h
    PRP/Modifier/plOneShotMod.h
    PRP/Modifier/plPostEffectMod.h
    PRP/Modifier/plPythonFileMod.h
    PRP/Modifier/plPythonMod.h
    PRP/Modifier/plRandomCommandMod.h
    PRP/Modifier/plRandomSoundMod.h
    PRP/Modifier/plResponderModifier.h
    PRP/Modifier/plSpawnModifier.h
)

set(PRP_NMSG_SRCS
    PRP/NetMessage/plClientGuid.cpp
    PRP/NetMessage/plNetGroupId.cpp
    PRP/NetMessage/plNetMessage.cpp
    PRP/NetMessage/plNetMsgGameMessage.cpp
    PRP/NetMessage/plNetMsgGroupOwner.cpp
    PRP/NetMessage/plNetMsgInitialAgeStateSent.cpp
    PRP/NetMessage/plNetMsgLoadClone.cpp
    PRP/NetMessage/plNetMsgMembersList.cpp
    PRP/NetMessage/plNetMsgObject.cpp
    PRP/NetMessage/plNetMsgPlayerPage.cpp
    PRP/NetMessage/plNetMsgRelevanceRegions.cpp
    PRP/NetMessage/plNetMsgRoomsList.cpp
    PRP/NetMessage/plNetMsgSDLState.cpp
    PRP/NetMessage/plNetMsgSharedState.cpp
    PRP/NetMessage/plNetMsgStream.cpp
    PRP/NetMessage/plNetMsgStreamedObject.cpp
    PRP/NetMessage/plNetSharedState.cpp
)
set(PRP_NMSG_HDRS
    PRP/NetMessage/plClientGuid.h
    PRP/NetMessage/plNetGroupId.h
    PRP/NetMessage/plNetMessage.h
    PRP/NetMessage/plNetMsgGameMessage.h
    PRP/NetMessage/plNetMsgGroupOwner.h
    PRP/NetMessage/plNetMsgInitialAgeStateSent.h
    PRP/NetMessage/plNetMsgLoadClone.h
    PRP/NetMessage/plNetMsgMembersList.h
    PRP/NetMessage/plNetMsgObject.h
    PRP/NetMessage/plNetMsgPlayerPage.h
    PRP/NetMessage/plNetMsgRelevanceRegions.h
    PRP/NetMessage/plNetMsgRoomsList.h
    PRP/NetMessage/plNetMsgSDLState.h
    PRP/NetMessage/plNetMsgSharedState.h
    PRP/NetMessage/plNetMsgStream.h
    PRP/NetMessage/plNetMsgStreamedObject.h
    PRP/NetMessage/plNetSharedState.h
)

set(PRP_OBJ_SRCS
    PRP/Object/plAudioInterface.cpp
    PRP/Object/plCoordinateInterface.cpp
    PRP/Object/plDrawInterface.cpp
    PRP/Object/plObjInterface.cpp
    PRP/Object/plSceneObject.cpp
    PRP/Object/plSimulationInterface.cpp
    PRP/Object/plSynchedObject.cpp
)
set(PRP_OBJ_HDRS
    PRP/Object/plAudioInterface.h
    PRP/Object/plCoordinateInterface.h
    PRP/Object/plDrawInterface.h
    PRP/Object/plObjInterface.h
    PRP/Object/plSceneObject.h
    PRP/Object/plSimulationInterface.h
    PRP/Object/plSynchedObject.h
)

set(PRP_PRTL_SRCS
    PRP/Particle/plBoundInterface.cpp
    PRP/Particle/plParticleEffect.cpp
    PRP/Particle/plParticleEmitter.cpp
    PRP/Particle/plParticleGenerator.cpp
    PRP/Particle/plParticleSystem.cpp
)
set(PRP_PRTL_HDRS
    PRP/Particle/plBoundInterface.h
    PRP/Particle/plParticleApplicator.hpp
    PRP/Particle/plParticleEffect.h
    PRP/Particle/plParticleEmitter.h
    PRP/Particle/plParticleGenerator.h
    PRP/Particle/plParticleSystem.h
)

set(PRP_PHYS_SRCS
    PRP/Physics/plCollisionDetector.cpp
    PRP/Physics/plDetectorModifier.cpp
    PRP/Physics/plGenericPhysical.cpp
    PRP/Physics/plHKSubWorld.cpp
    PRP/Physics/plObjectInVolumeDetector.cpp
    PRP/Physics/plPhysical.cpp
    PRP/Physics/plPhysicalSndGroup.cpp
    PRP/Physics/plPXPhysical.cpp
    PRP/Physics/plVehicleModifier.cpp
)
set(PRP_PHYS_HDRS
    PRP/Physics/plCollisionDetector.h
    PRP/Physics/plDetectorModifier.h
    PRP/Physics/plGenericPhysical.h
    PRP/Physics/plHKSubWorld.h
    PRP/Physics/plObjectInVolumeDetector.h
    PRP/Physics/plPhysical.h
    PRP/Physics/plPhysicalSndGroup.h
    PRP/Physics/plVehicleModifier.h
)

set(PRP_RGN_SRCS
    PRP/Region/hsBounds.cpp
    PRP/Region/plConvexVolume.cpp
    PRP/Region/plHardRegion.cpp
    PRP/Region/plHardRegionPlanes.cpp
    PRP/Region/plRelevanceRegion.cpp
    PRP/Region/plSimpleRegionSensor.cpp
    PRP/Region/plSoftVolume.cpp
    PRP/Region/plSwimRegion.cpp
    PRP/Region/plVisRegion.cpp
    PRP/Region/plVolumeIsect.cpp
)
set(PRP_RGN_HDRS
    PRP/Region/hsBounds.h
    PRP/Region/plConvexVolume.h
    PRP/Region/plHardRegion.h
    PRP/Region/plHardRegionPlanes.h
    PRP/Region/plRegionBase.hpp
    PRP/Region/plRelevanceRegion.h
    PRP/Region/plSimpleRegionSensor.h
    PRP/Region/plSoftVolume.h
    PRP/Region/plSwimRegion.h
    PRP/Region/plVisRegion.h
    PRP/Region/plVolumeIsect.h
)

set(PRP_SRFC_SRCS
    PRP/Surface/hsGMatState.cpp
    PRP/Surface/hsGMaterial.cpp
    PRP/Surface/plBitmap.cpp
    PRP/Surface/plCubicEnvironmap.cpp
    PRP/Surface/plDistOpacityMod.cpp
    PRP/Surface/plDynaDecalMgr.cpp
    PRP/Surface/plDynaRippleMgr.cpp
    PRP/Surface/plDynamicEnvMap.cpp
    PRP/Surface/plDynamicTextMap.cpp
    PRP/Surface/plFadeOpacityMod.cpp
    PRP/Surface/plFixedWaterState6.cpp
    PRP/Surface/plFixedWaterState7.cpp
    PRP/Surface/plFont.cpp
    PRP/Surface/plGrassShaderMod.cpp
    PRP/Surface/plLayer.cpp
    PRP/Surface/plLayerAnimation.cpp
    PRP/Surface/plLayerInterface.cpp
    PRP/Surface/plLayerMovie.cpp
    PRP/Surface/plMipmap.cpp
    PRP/Surface/plPrintShape.cpp
    PRP/Surface/plRenderTarget.cpp
    PRP/Surface/plShader.cpp
    PRP/Surface/plWaveSet.cpp
)
set(PRP_SRFC_HDRS
    PRP/Surface/hsGMatState.h
    PRP/Surface/hsGMaterial.h
    PRP/Surface/plBitmap.h
    PRP/Surface/plCubicEnvironmap.h
    PRP/Surface/plDistOpacityMod.h
    PRP/Surface/plDynaDecalMgr.h
    PRP/Surface/plDynaRippleMgr.h
    PRP/Surface/plDynamicEnvMap.h
    PRP/Surface/plDynamicTextMap.h
    PRP/Surface/plFadeOpacityMod.h
    PRP/Surface/plFixedWaterState6.h
    PRP/Surface/plFixedWaterState7.h
    PRP/Surface/plFont.h
    PRP/Surface/plGrassShaderMod.h
    PRP/Surface/plLayer.h
    PRP/Surface/plLayerAnimation.h
    PRP/Surface/plLayerInterface.h
    PRP/Surface/plLayerMovie.h
    PRP/Surface/plMipmap.h
    PRP/Surface/plPrintShape.h
    PRP/Surface/plRenderTarget.h
    PRP/Surface/plShader.h
    PRP/Surface/plWaveSet.h
)

set(PRP_SRCS
    PRP/plCreatable.cpp
    PRP/plCreatableListHelper.cpp
    PRP/plPageInfo.cpp
    PRP/plSceneNode.cpp
)
set(PRP_HDRS
    PRP/plCreatable.h
    PRP/plCreatableListHelper.h
    PRP/plPageInfo.h
    PRP/plSceneNode.h
)

set(RESMGR_SRCS
    ResManager/pdUnifiedTypeMap.cpp
    ResManager/plAgeInfo.cpp
    ResManager/plFactory.cpp
    ResManager/plKeyCollector.cpp
    ResManager/plResManager.cpp
)
set(RESMGR_HDRS
    ResManager/pdUnifiedTypeMap.h
    ResManager/plAgeInfo.h
    ResManager/plFactory.h
    ResManager/plKeyCollector.h
    ResManager/plResManager.h
)

set(SDL_SRCS
    SDL/plNetGameServerState.cpp
    SDL/plSDL.cpp
    SDL/plSDLMgr.cpp
    SDL/plStateDataRecord.cpp
    SDL/plStateDescriptor.cpp
    SDL/plStateVariable.cpp
)
set(SDL_HDRS
    SDL/plNetGameServerState.h
    SDL/plSDL.h
    SDL/plSDLMgr.h
    SDL/plStateDataRecord.h
    SDL/plStateDescriptor.h
    SDL/plStateVariable.h
)

set(STREAM_SRCS
    Stream/hsElfStream.cpp
    Stream/hsRAMStream.cpp
    Stream/hsStdioStream.cpp
    Stream/hsStream.cpp
    Stream/hsTokenStream.cpp
    Stream/pfPrcHelper.cpp
    Stream/pfPrcParser.cpp
    Stream/pfSizedStream.cpp
    Stream/plEncryptedStream.cpp
)
set(STREAM_HDRS
    Stream/hsElfStream.h
    Stream/hsRAMStream.h
    Stream/hsStdioStream.h
    Stream/hsStream.h
    Stream/hsTokenStream.h
    Stream/pfPrcHelper.h
    Stream/pfPrcParser.h
    Stream/pfSizedStream.h
    Stream/plEncryptedStream.h
)

set(SYS_SRCS
    Sys/hsColor.cpp
    Sys/hsSemaphore.cpp
    Sys/plUnifiedTime.cpp
    Sys/plUuid.cpp
)
if(CMAKE_USE_WIN32_THREADS_INIT)
    set(SYS_SRCS ${SYS_SRCS} Sys/hsThread_win32.cpp)
else(CMAKE_USE_WIN32_THREADS_INIT)
    set(SYS_SRCS ${SYS_SRCS} Sys/hsThread_pthread.cpp)
endif(CMAKE_USE_WIN32_THREADS_INIT)
set(SYS_HDRS
    Sys/Platform.h
    Sys/hsColor.h
    Sys/hsSemaphore.h
    Sys/hsThread.h
    Sys/plUnifiedTime.h
    Sys/plUuid.h
)

set(UTIL_SRCS
    Util/PlasmaVersions.cpp
    Util/hs3DDevice.cpp
    Util/hsBitVector.cpp
    Util/hsRadixSort.cpp
    Util/plDDSurface.cpp
    Util/plJPEG.cpp
    Util/plMD5.cpp
    Util/plString.cpp
    Util/plZlib.cpp
)
set(UTIL_HDRS
    Util/PlasmaVersions.h
    Util/hs3DDevice.h
    Util/hsBitVector.h
    Util/hsRadixSort.h
    Util/hsTArray.hpp
    Util/hsTList.hpp
    Util/plDDSurface.h
    Util/plJPEG.h
    Util/plMD5.h
    Util/plString.h
    Util/plZlib.h
)

set(VAULT_SRCS
    Vault/plServerGuid.cpp
    Vault/plVaultNode.cpp
    Vault/plVaultNodeRef.cpp
    Vault/plVaultNodeTypes.cpp
    Vault/plVaultStore.cpp
)
set(VAULT_HDRS
    Vault/plServerGuid.h
    Vault/plVaultNode.h
    Vault/plVaultNodeRef.h
    Vault/plVaultNodeTypes.h
    Vault/plVaultStore.h
)

set(PLASMA_HDRS
        PlasmaDefs.h
)

set(RIJNDAEL
    3rdPartyLibs/rijndael.cpp
    3rdPartyLibs/rijndael.h
)

set(SQUISH
    3rdPartyLibs/squish/alpha.cpp
    3rdPartyLibs/squish/alpha.h
    3rdPartyLibs/squish/clusterfit.cpp
    3rdPartyLibs/squish/clusterfit.h
    3rdPartyLibs/squish/colourblock.cpp
    3rdPartyLibs/squish/colourblock.h
    3rdPartyLibs/squish/colourfit.cpp
    3rdPartyLibs/squish/colourfit.h
    3rdPartyLibs/squish/colourset.cpp
    3rdPartyLibs/squish/colourset.h
    3rdPartyLibs/squish/maths.cpp
    3rdPartyLibs/squish/maths.h
    3rdPartyLibs/squish/rangefit.cpp
    3rdPartyLibs/squish/rangefit.h
    3rdPartyLibs/squish/singlecolourfit.cpp
    3rdPartyLibs/squish/singlecolourfit.h
    3rdPartyLibs/squish/squish.cpp
    3rdPartyLibs/squish/squish.h
)

add_library(HSPlasma SHARED
            ${DEBUG_SRCS}    ${DEBUG_HDRS}
            ${MATH_SRCS}     ${MATH_HDRS}
            ${PRP_ANIM_SRCS} ${PRP_ANIM_HDRS}
            ${PRP_AUD_SRCS}  ${PRP_AUD_HDRS}
            ${PRP_AVTR_SRCS} ${PRP_AVTR_HDRS}
            ${PRP_CMRA_SRCS} ${PRP_CMRA_HDRS}
            ${PRP_COND_SRCS} ${PRP_COND_HDRS}
            ${PRP_GEOM_SRCS} ${PRP_GEOM_HDRS}
            ${PRP_GUI_SRCS}  ${PRP_GUI_HDRS}
            ${PRP_KEY_SRCS}  ${PRP_KEY_HDRS}
            ${PRP_LIT_SRCS}  ${PRP_LIT_HDRS}
            ${PRP_MISC_SRCS} ${PRP_MISC_HDRS}
            ${PRP_MOD_SRCS}  ${PRP_MOD_HDRS}
            ${PRP_MSG_SRCS}  ${PRP_MSG_HDRS}
            ${PRP_NMSG_SRCS} ${PRP_NMSG_HDRS}
            ${PRP_OBJ_SRCS}  ${PRP_OBJ_HDRS}
            ${PRP_PRTL_SRCS} ${PRP_PRTL_HDRS}
            ${PRP_PHYS_SRCS} ${PRP_PHYS_HDRS}
            ${PRP_RGN_SRCS}  ${PRP_RGN_HDRS}
            ${PRP_SRFC_SRCS} ${PRP_SRFC_HDRS}
            ${PRP_SRCS}      ${PRP_HDRS}
            ${RESMGR_SRCS}   ${RESMGR_HDRS}
            ${SDL_SRCS}      ${SDL_HDRS}
            ${STREAM_SRCS}   ${STREAM_HDRS}
            ${SYS_SRCS}      ${SYS_HDRS}
            ${UTIL_SRCS}     ${UTIL_HDRS}
            ${VAULT_SRCS}    ${VAULT_HDRS}
                             ${PLASMA_HDRS}
            ${RIJNDAEL}
            ${SQUISH}
)
target_link_libraries(HSPlasma ${ZLIB_LIBRARIES} ${JPEG_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT})
if(PHYSX_FOUND)
    target_link_libraries(HSPlasma ${PHYSX_COOKING_LIBRARY})
endif(PHYSX_FOUND)

configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libhsplasma.pc.in.cmake ${CMAKE_CURRENT_BINARY_DIR}/libhsplasma.pc @ONLY)

# Package Installation
install(TARGETS HSPlasma
        EXPORT HSPlasma-targets
        RUNTIME DESTINATION bin
        LIBRARY DESTINATION lib
        ARCHIVE DESTINATION lib
)
install(FILES HSPlasmaConfig.cmake DESTINATION share/cmake/HSPlasma)
install(FILES ${DEBUG_HDRS} DESTINATION include/HSPlasma/Debug)
install(FILES ${MATH_HDRS} DESTINATION include/HSPlasma/Math)
install(FILES ${PRP_ANIM_HDRS} DESTINATION include/HSPlasma/PRP/Animation)
install(FILES ${PRP_AUD_HDRS} DESTINATION include/HSPlasma/PRP/Audio)
install(FILES ${PRP_AVTR_HDRS} DESTINATION include/HSPlasma/PRP/Avatar)
install(FILES ${PRP_CMRA_HDRS} DESTINATION include/HSPlasma/PRP/Camera)
install(FILES ${PRP_COND_HDRS} DESTINATION include/HSPlasma/PRP/ConditionalObject)
install(FILES ${PRP_GEOM_HDRS} DESTINATION include/HSPlasma/PRP/Geometry)
install(FILES ${PRP_GUI_HDRS} DESTINATION include/HSPlasma/PRP/GUI)
install(FILES ${PRP_KEY_HDRS} DESTINATION include/HSPlasma/PRP/KeyedObject)
install(FILES ${PRP_LIT_HDRS} DESTINATION include/HSPlasma/PRP/Light)
install(FILES ${PRP_MSG_HDRS} DESTINATION include/HSPlasma/PRP/Message)
install(FILES ${PRP_MISC_HDRS} DESTINATION include/HSPlasma/PRP/Misc)
install(FILES ${PRP_MOD_HDRS} DESTINATION include/HSPlasma/PRP/Modifier)
install(FILES ${PRP_NMSG_HDRS} DESTINATION include/HSPlasma/PRP/NetMessage)
install(FILES ${PRP_OBJ_HDRS} DESTINATION include/HSPlasma/PRP/Object)
install(FILES ${PRP_PRTL_HDRS} DESTINATION include/HSPlasma/PRP/Particle)
install(FILES ${PRP_PHYS_HDRS} DESTINATION include/HSPlasma/PRP/Physics)
install(FILES ${PRP_RGN_HDRS} DESTINATION include/HSPlasma/PRP/Region)
install(FILES ${PRP_SRFC_HDRS} DESTINATION include/HSPlasma/PRP/Surface)
install(FILES ${PRP_HDRS} DESTINATION include/HSPlasma/PRP)
install(FILES ${RESMGR_HDRS} DESTINATION include/HSPlasma/ResManager)
install(FILES ${SDL_HDRS} DESTINATION include/HSPlasma/SDL)
install(FILES ${STREAM_HDRS} DESTINATION include/HSPlasma/Stream)
install(FILES ${SYS_HDRS} DESTINATION include/HSPlasma/Sys)
install(FILES ${UTIL_HDRS} DESTINATION include/HSPlasma/Util)
install(FILES ${VAULT_HDRS} DESTINATION include/HSPlasma/Vault)
install(FILES ${PLASMA_HDRS} DESTINATION include/HSPlasma)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libhsplasma.pc DESTINATION lib/pkgconfig)

# Visual studio source grouping
source_group("Debug" FILES ${DEBUG_HDRS} ${DEBUG_SRCS})
source_group("Math" FILES ${MATH_HDRS} ${MATH_SRCS})
source_group("PRP\\Animation" FILES ${PRP_ANIM_HDRS} ${PRP_ANIM_SRCS})
source_group("PRP\\Audio" FILES ${PRP_AUD_HDRS} ${PRP_AUD_SRCS})
source_group("PRP\\Avatar" FILES ${PRP_AVTR_HDRS} ${PRP_AVTR_SRCS})
source_group("PRP\\Camera" FILES ${PRP_CMRA_HDRS} ${PRP_CMRA_SRCS})
source_group("PRP\\ConditionalObject" FILES ${PRP_COND_HDRS} ${PRP_COND_SRCS})
source_group("PRP\\Geometry" FILES ${PRP_GEOM_HDRS} ${PRP_GEOM_SRCS})
source_group("PRP\\GUI" FILES ${PRP_GUI_HDRS} ${PRP_GUI_SRCS})
source_group("PRP\\KeyedObject" FILES ${PRP_KEY_HDRS} ${PRP_KEY_SRCS})
source_group("PRP\\Light" FILES ${PRP_LIT_HDRS} ${PRP_LIT_SRCS})
source_group("PRP\\Message" FILES ${PRP_MSG_HDRS} ${PRP_MSG_SRCS})
source_group("PRP\\Misc" FILES ${PRP_MISC_HDRS} ${PRP_MISC_SRCS})
source_group("PRP\\Modifier" FILES ${PRP_MOD_HDRS} ${PRP_MOD_SRCS})
source_group("PRP\\NetMessage" FILES ${PRP_NMSG_HDRS} ${PRP_NMSG_SRCS})
source_group("PRP\\Object" FILES ${PRP_OBJ_HDRS} ${PRP_OBJ_SRCS})
source_group("PRP\\Particle" FILES ${PRP_PRTL_HDRS} ${PRP_PRTL_SRCS})
source_group("PRP\\Physics" FILES ${PRP_PHYS_HDRS} ${PRP_PHYS_SRCS})
source_group("PRP\\Region" FILES ${PRP_RGN_HDRS} ${PRP_RGN_SRCS})
source_group("PRP\\Surface" FILES ${PRP_SRFC_HDRS} ${PRP_SRFC_SRCS})
source_group("PRP" FILES ${PRP_HDRS} ${PRP_SRCS})
source_group("ResManager" FILES ${RESMGR_HDRS} ${RESMGR_SRCS})
source_group("SDL" FILES ${SDL_HDRS} ${SDL_SRCS})
source_group("Stream" FILES ${STREAM_HDRS} ${STREAM_SRCS})
source_group("Sys" FILES ${SYS_HDRS} ${SYS_SRCS})
source_group("Util" FILES ${UTIL_HDRS} ${UTIL_SRCS})
source_group("Vault" FILES ${VAULT_HDRS} ${VAULT_SRCS})
