commit
53b3a51b54
@ -0,0 +1,84 @@
|
||||
/**
|
||||
* \file fxaa.h
|
||||
* \brief CFXAA
|
||||
* \date 2014-08-03 21:41GMT
|
||||
* \author Jan Boon (Kaetemi)
|
||||
* CFXAA
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2014 by authors
|
||||
*
|
||||
* This file is part of NL3D.
|
||||
* NL3D is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* NL3D is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General
|
||||
* Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with NL3D. If not, see
|
||||
* <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef NL3D_FXAA_H
|
||||
#define NL3D_FXAA_H
|
||||
#include <nel/misc/types_nl.h>
|
||||
|
||||
// STL includes
|
||||
|
||||
// NeL includes
|
||||
#include <nel/misc/smart_ptr.h>
|
||||
#include <nel/misc/geom_ext.h>
|
||||
|
||||
// Project includes
|
||||
#include <nel/3d/u_material.h>
|
||||
#include <nel/3d/vertex_buffer.h>
|
||||
|
||||
#define NL_STEREO_MAX_USER_CAMERAS 8
|
||||
|
||||
namespace NL3D {
|
||||
|
||||
class ITexture;
|
||||
class CTextureUser;
|
||||
class CPixelProgram;
|
||||
class CVertexProgram;
|
||||
|
||||
/**
|
||||
* \brief CFXAA
|
||||
* \date 2014-08-03 21:41GMT
|
||||
* \author Jan Boon (Kaetemi)
|
||||
* CFXAA
|
||||
*/
|
||||
class CFXAA
|
||||
{
|
||||
public:
|
||||
CFXAA(NL3D::UDriver *driver);
|
||||
virtual ~CFXAA();
|
||||
|
||||
/// Apply effect to current render target. Render target must be managed by render target manager
|
||||
virtual void applyEffect();
|
||||
|
||||
private:
|
||||
UDriver *m_Driver;
|
||||
|
||||
NL3D::UMaterial m_Mat;
|
||||
// NL3D::CVertexBuffer m_VB;
|
||||
NLMISC::CQuadUV m_QuadUV;
|
||||
CVertexProgram *m_VP;
|
||||
CPixelProgram *m_PP;
|
||||
|
||||
uint m_Width;
|
||||
uint m_Height;
|
||||
|
||||
}; /* class CFXAA */
|
||||
|
||||
} /* namespace NL3D */
|
||||
|
||||
#endif /* #ifndef NL3D_FXAA_H */
|
||||
|
||||
/* end of file */
|
@ -0,0 +1,83 @@
|
||||
/**
|
||||
* \file render_target_manager.h
|
||||
* \brief CRenderTargetManager
|
||||
* \date 2014-07-30 21:30GMT
|
||||
* \author Jan Boon (Kaetemi)
|
||||
* CRenderTargetManager
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2013 by authors
|
||||
*
|
||||
* This file is part of NL3D.
|
||||
* NL3D is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* NL3D is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General
|
||||
* Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with NL3D. If not, see
|
||||
* <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef NL3D_RENDER_TARGET_MANAGER_H
|
||||
#define NL3D_RENDER_TARGET_MANAGER_H
|
||||
#include <nel/misc/types_nl.h>
|
||||
|
||||
// STL includes
|
||||
|
||||
// NeL includes
|
||||
#include <nel/misc/smart_ptr.h>
|
||||
#include <nel/misc/geom_ext.h>
|
||||
|
||||
// Project includes
|
||||
#include <nel/3d/u_texture.h>
|
||||
|
||||
namespace NL3D {
|
||||
|
||||
class UDriver;
|
||||
class ITexture;
|
||||
class CTextureUser;
|
||||
class CDriverUser;
|
||||
|
||||
struct CRenderTargetDescInt;
|
||||
|
||||
/**
|
||||
* \brief CRenderTargetManager
|
||||
* \date 2013-07-03 20:17GMT
|
||||
* \author Jan Boon (Kaetemi)
|
||||
* CRenderTargetManager
|
||||
* Usage: Call 'getRenderTarget' when you start using a render target,
|
||||
* call 'recycledRenderTarget' when the render target can be recycled.
|
||||
* At end of frame call cleanup.
|
||||
* Assumes semi-constant render target quantity between frames,
|
||||
* except on changes of resolution or feature settings.
|
||||
*/
|
||||
class CRenderTargetManager
|
||||
{
|
||||
public:
|
||||
CRenderTargetManager();
|
||||
~CRenderTargetManager();
|
||||
|
||||
NL3D::CTextureUser *getRenderTarget(uint width, uint height, bool mode2D = false, UTexture::TUploadFormat format = UTexture::Auto);
|
||||
void recycleRenderTarget(NL3D::CTextureUser *renderTarget);
|
||||
|
||||
void cleanup();
|
||||
|
||||
private:
|
||||
friend class CDriverUser;
|
||||
NL3D::UDriver *m_Driver;
|
||||
std::vector<CRenderTargetDescInt *> m_RenderTargets;
|
||||
|
||||
}; /* class CRenderTargetManager */
|
||||
|
||||
} /* namespace NL3D */
|
||||
|
||||
#endif /* #ifndef NL3D_RENDER_TARGET_MANAGER_H */
|
||||
|
||||
/* end of file */
|
@ -0,0 +1,225 @@
|
||||
/**
|
||||
* \file stereo_ovr.h
|
||||
* \brief CStereoOVR
|
||||
* \date 2014-08-04 16:21GMT
|
||||
* \author Jan Boon (Kaetemi)
|
||||
* CStereoOVR
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2014 by authors
|
||||
*
|
||||
* This file is part of NL3D.
|
||||
* NL3D is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* NL3D is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General
|
||||
* Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with NL3D. If not, see
|
||||
* <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Linking this library statically or dynamically with other modules
|
||||
* is making a combined work based on this library. Thus, the terms
|
||||
* and conditions of the GNU General Public License cover the whole
|
||||
* combination.
|
||||
*
|
||||
* As a special exception, the copyright holders of this library give
|
||||
* you permission to link this library with the Oculus SDK to produce
|
||||
* an executable, regardless of the license terms of the Oculus SDK,
|
||||
* and distribute linked combinations including the two, provided that
|
||||
* you also meet the terms and conditions of the license of the Oculus
|
||||
* SDK. You must obey the GNU General Public License in all respects
|
||||
* for all of the code used other than the Oculus SDK. If you modify
|
||||
* this file, you may extend this exception to your version of the
|
||||
* file, but you are not obligated to do so. If you do not wish to do
|
||||
* so, delete this exception statement from your version.
|
||||
*/
|
||||
|
||||
#ifndef NL3D_STEREO_OVR_04_H
|
||||
#define NL3D_STEREO_OVR_04_H
|
||||
|
||||
#ifdef HAVE_LIBOVR
|
||||
|
||||
#include <nel/misc/types_nl.h>
|
||||
|
||||
// STL includes
|
||||
|
||||
// NeL includes
|
||||
#include <nel/misc/smart_ptr.h>
|
||||
#include <nel/misc/geom_ext.h>
|
||||
|
||||
// Project includes
|
||||
#include <nel/3d/stereo_hmd.h>
|
||||
#include <nel/3d/frustum.h>
|
||||
#include <nel/3d/viewport.h>
|
||||
#include <nel/3d/u_material.h>
|
||||
#include <nel/3d/u_driver.h>
|
||||
#include <nel/3d/index_buffer.h>
|
||||
#include <nel/3d/vertex_buffer.h>
|
||||
|
||||
struct ovrHmdDesc_;
|
||||
typedef const ovrHmdDesc_ *ovrHmd;
|
||||
|
||||
namespace NL3D {
|
||||
|
||||
class ITexture;
|
||||
class CTextureUser;
|
||||
class CStereoOVRDeviceFactory;
|
||||
|
||||
#define NL_STEREO_MAX_USER_CAMERAS 8
|
||||
#define NL_OVR_EYE_COUNT 2
|
||||
|
||||
/**
|
||||
* \brief CStereoOVR
|
||||
* \date 2014-08-04 16:21GMT
|
||||
* \author Jan Boon (Kaetemi)
|
||||
* CStereoOVR
|
||||
*/
|
||||
class CStereoOVR : public IStereoHMD
|
||||
{
|
||||
public:
|
||||
CStereoOVR(const CStereoOVRDeviceFactory *factory);
|
||||
virtual ~CStereoOVR();
|
||||
|
||||
/// Sets driver and generates necessary render targets
|
||||
virtual void setDriver(NL3D::UDriver *driver);
|
||||
|
||||
/// Attach the driver to the display
|
||||
virtual bool attachToDisplay();
|
||||
/// Detach the driver from the display
|
||||
virtual void detachFromDisplay();
|
||||
|
||||
/// Gets the required screen resolution for this device
|
||||
virtual bool getScreenResolution(uint &width, uint &height);
|
||||
/// Set latest camera position etcetera
|
||||
virtual void updateCamera(uint cid, const NL3D::UCamera *camera);
|
||||
/// Get the frustum to use for clipping
|
||||
virtual void getClippingFrustum(uint cid, NL3D::UCamera *camera) const;
|
||||
/// Get the original frustum of the camera
|
||||
virtual void getOriginalFrustum(uint cid, NL3D::UCamera *camera) const;
|
||||
|
||||
/// Is there a next pass
|
||||
virtual bool nextPass();
|
||||
/// Gets the current viewport
|
||||
virtual const NL3D::CViewport &getCurrentViewport() const;
|
||||
/// Gets the current camera frustum
|
||||
virtual const NL3D::CFrustum &getCurrentFrustum(uint cid) const;
|
||||
/// Gets the current camera frustum
|
||||
virtual void getCurrentFrustum(uint cid, NL3D::UCamera *camera) const;
|
||||
/// Gets the current camera matrix
|
||||
virtual void getCurrentMatrix(uint cid, NL3D::UCamera *camera) const;
|
||||
|
||||
/// At the start of a new render target
|
||||
virtual bool wantClear();
|
||||
/// The 3D scene
|
||||
virtual bool wantScene();
|
||||
/// Scene post processing effects
|
||||
virtual bool wantSceneEffects();
|
||||
/// Interface within the 3D scene
|
||||
virtual bool wantInterface3D();
|
||||
/// 2D Interface
|
||||
virtual bool wantInterface2D();
|
||||
|
||||
/// Is this the first 3D scene of the frame
|
||||
virtual bool isSceneFirst();
|
||||
/// Is this the last 3D scene of the frame
|
||||
virtual bool isSceneLast();
|
||||
|
||||
/// Returns true if a new render target was set, always fase if not using render targets
|
||||
virtual bool beginRenderTarget();
|
||||
/// Returns true if a render target was fully drawn, always false if not using render targets
|
||||
virtual bool endRenderTarget();
|
||||
|
||||
|
||||
/// Get the HMD orientation
|
||||
virtual NLMISC::CQuat getOrientation() const;
|
||||
|
||||
/// Set the GUI reference
|
||||
virtual void setInterfaceMatrix(const NL3D::CMatrix &matrix);
|
||||
|
||||
/// Get GUI center (1 = width, 1 = height, 0 = center)
|
||||
virtual void getInterface2DShift(uint cid, float &x, float &y, float distance) const;
|
||||
|
||||
/// Set the head model, eye position relative to orientation point
|
||||
virtual void setEyePosition(const NLMISC::CVector &v);
|
||||
/// Get the head model, eye position relative to orientation point
|
||||
virtual const NLMISC::CVector &getEyePosition() const;
|
||||
|
||||
/// Set the scale of the game in units per meter
|
||||
virtual void setScale(float s);
|
||||
|
||||
/// Calculates internal camera information based on the reference camera
|
||||
void initCamera(uint cid, const NL3D::UCamera *camera);
|
||||
/// Render GUI
|
||||
void renderGUI();
|
||||
|
||||
/// Checks if the device used by this class was actually created
|
||||
bool isDeviceCreated();
|
||||
|
||||
static void listDevices(std::vector<CStereoDeviceInfo> &devicesOut);
|
||||
static bool isLibraryInUse();
|
||||
static void releaseLibrary();
|
||||
|
||||
private:
|
||||
ovrHmd m_DevicePtr;
|
||||
bool m_DebugDevice;
|
||||
|
||||
int m_Stage;
|
||||
int m_SubStage;
|
||||
|
||||
CViewport m_RegularViewport;
|
||||
CViewport m_EyeViewport[NL_OVR_EYE_COUNT];
|
||||
CFrustum m_EyeFrustumBase[NL_OVR_EYE_COUNT];
|
||||
uint m_RenderTargetWidth;
|
||||
uint m_RenderTargetHeight;
|
||||
NLMISC::CVector2f m_EyeUVScaleOffset[NL_OVR_EYE_COUNT][2];
|
||||
float m_EyeViewAdjustX[NL_OVR_EYE_COUNT];
|
||||
|
||||
CVertexBuffer m_VB[NL_OVR_EYE_COUNT];
|
||||
CIndexBuffer m_IB[NL_OVR_EYE_COUNT];
|
||||
uint32 m_NbTris[NL_OVR_EYE_COUNT];
|
||||
|
||||
CFrustum m_ClippingFrustum[NL_STEREO_MAX_USER_CAMERAS];
|
||||
CFrustum m_LeftFrustum[NL_STEREO_MAX_USER_CAMERAS];
|
||||
CFrustum m_RightFrustum[NL_STEREO_MAX_USER_CAMERAS];
|
||||
CFrustum m_OriginalFrustum[NL_STEREO_MAX_USER_CAMERAS];
|
||||
CMatrix m_CameraMatrix[NL_STEREO_MAX_USER_CAMERAS];
|
||||
CMatrix m_InterfaceCameraMatrix;
|
||||
mutable bool m_OrientationCached;
|
||||
mutable NLMISC::CQuat m_OrientationCache;
|
||||
|
||||
UDriver *m_Driver;
|
||||
|
||||
CTextureUser *m_GUITexture;
|
||||
NL3D::CTextureUser *m_SceneTexture;
|
||||
|
||||
UMaterial m_UnlitMat;
|
||||
|
||||
UDriver::CMode m_OriginalMode;
|
||||
sint32 m_OriginalWinPosX;
|
||||
sint32 m_OriginalWinPosY;
|
||||
bool m_AttachedDisplay;
|
||||
|
||||
/*
|
||||
NL3D::UMaterial m_BarrelMat;
|
||||
NLMISC::CQuadUV m_BarrelQuadLeft;
|
||||
NLMISC::CQuadUV m_BarrelQuadRight;
|
||||
NLMISC::CRefPtr<CPixelProgramOVR> m_PixelProgram;*/
|
||||
NLMISC::CVector m_EyePosition;
|
||||
float m_Scale;
|
||||
|
||||
}; /* class CStereoOVR */
|
||||
|
||||
} /* namespace NL3D */
|
||||
|
||||
#endif /* HAVE_LIBOVR */
|
||||
|
||||
#endif /* #ifndef NL3D_STEREO_OVR_04_H */
|
||||
|
||||
/* end of file */
|
@ -0,0 +1,46 @@
|
||||
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||
// Copyright (C) 2010 Winch Gate Property Limited
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
|
||||
#ifndef ROOT_GROUP_H
|
||||
#define ROOT_GROUP_H
|
||||
|
||||
#include <string>
|
||||
#include <map>
|
||||
|
||||
#include "nel/gui/interface_group.h"
|
||||
|
||||
namespace NLGUI
|
||||
{
|
||||
|
||||
class CRootGroup : public CInterfaceGroup
|
||||
{
|
||||
public:
|
||||
CRootGroup(const TCtorParam ¶m);
|
||||
virtual ~CRootGroup();
|
||||
|
||||
virtual CInterfaceElement* getElement (const std::string &id);
|
||||
virtual void addGroup (CInterfaceGroup *child, sint eltOrder = -1);
|
||||
virtual bool delGroup (CInterfaceGroup *child, bool dontDelete = false);
|
||||
|
||||
private:
|
||||
std::map< std::string, CInterfaceGroup* > _Accel;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -0,0 +1,327 @@
|
||||
/*
|
||||
|
||||
Copyright (c) 2009-2014, Jan BOON
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
*/
|
||||
|
||||
#ifndef NLMISC_CALLBACK_H
|
||||
#define NLMISC_CALLBACK_H
|
||||
#include <nel/misc/types_nl.h>
|
||||
|
||||
// STL includes
|
||||
|
||||
// NeL includes
|
||||
#include <nel/misc/debug.h>
|
||||
|
||||
// Project includes
|
||||
|
||||
namespace NLMISC {
|
||||
|
||||
#define NLMISC_CALLBACK_TEMPLATE \
|
||||
/** \
|
||||
* \brief NLMISC_CALLBACK_ARGS_CLASS \
|
||||
* \date 2009-03-03 18:09GMT \
|
||||
* \author Jan BOON \
|
||||
* Callback template \
|
||||
*/ \
|
||||
template<typename TReturn NLMISC_CALLBACK_ARGS_TYPENAME> \
|
||||
class NLMISC_CALLBACK_ARGS_CLASS \
|
||||
{ \
|
||||
/* Very simple reference counting callback base */ \
|
||||
class CCallbackBase \
|
||||
{ \
|
||||
public: \
|
||||
CCallbackBase() : m_RefCount(0) \
|
||||
{ \
|
||||
\
|
||||
} \
|
||||
\
|
||||
virtual ~CCallbackBase() \
|
||||
{ \
|
||||
nlassert(!m_RefCount); \
|
||||
} \
|
||||
\
|
||||
void refAdd() \
|
||||
{ \
|
||||
++m_RefCount; \
|
||||
} \
|
||||
\
|
||||
void refRemove() \
|
||||
{ \
|
||||
--m_RefCount; \
|
||||
if (!m_RefCount) \
|
||||
delete this; \
|
||||
} \
|
||||
\
|
||||
virtual TReturn callback(NLMISC_CALLBACK_ARGS_DECL) = 0; \
|
||||
\
|
||||
virtual bool equals(const CCallbackBase *callbackBase) = 0; \
|
||||
\
|
||||
/* disable copy */ \
|
||||
CCallbackBase(const CCallbackBase &); \
|
||||
CCallbackBase &operator=(const CCallbackBase &); \
|
||||
\
|
||||
private: \
|
||||
uint m_RefCount; \
|
||||
}; \
|
||||
\
|
||||
typedef TReturn TCallbackFunction(NLMISC_CALLBACK_ARGS_DECL); \
|
||||
class CCallbackFunction : public CCallbackBase \
|
||||
{ \
|
||||
public: \
|
||||
CCallbackFunction(TCallbackFunction *callbackFunction) : m_CallbackFunction(callbackFunction) \
|
||||
{ \
|
||||
nlassert(m_CallbackFunction); \
|
||||
} \
|
||||
\
|
||||
virtual ~CCallbackFunction() \
|
||||
{ \
|
||||
m_CallbackFunction = NULL; \
|
||||
} \
|
||||
\
|
||||
virtual TReturn callback(NLMISC_CALLBACK_ARGS_DECL) \
|
||||
{ \
|
||||
return m_CallbackFunction(NLMISC_CALLBACK_ARGS_IMPL); \
|
||||
} \
|
||||
\
|
||||
virtual bool equals(const CCallbackBase *callbackBase) \
|
||||
{ \
|
||||
const CCallbackFunction *callbackFunction = \
|
||||
dynamic_cast<const CCallbackFunction *>(callbackBase); \
|
||||
if (!callbackFunction) return false; \
|
||||
return m_CallbackFunction == callbackFunction->m_CallbackFunction; \
|
||||
} \
|
||||
\
|
||||
private: \
|
||||
TCallbackFunction *m_CallbackFunction; \
|
||||
}; \
|
||||
\
|
||||
template<typename TClass> \
|
||||
class CCallbackMethod : public CCallbackBase \
|
||||
{ \
|
||||
typedef TReturn (TClass::*TCallbackMethod)(NLMISC_CALLBACK_ARGS_DECL); \
|
||||
public: \
|
||||
CCallbackMethod(TClass *callbackObject, TCallbackMethod callbackMethod) : m_CallbackObject(callbackObject), m_CallbackMethod(callbackMethod) \
|
||||
{ \
|
||||
nlassert(m_CallbackObject); \
|
||||
nlassert(m_CallbackMethod); \
|
||||
} \
|
||||
\
|
||||
virtual ~CCallbackMethod() \
|
||||
{ \
|
||||
m_CallbackObject = NULL; \
|
||||
m_CallbackMethod = NULL; \
|
||||
} \
|
||||
\
|
||||
virtual TReturn callback(NLMISC_CALLBACK_ARGS_DECL) \
|
||||
{ \
|
||||
return (m_CallbackObject->*m_CallbackMethod)(NLMISC_CALLBACK_ARGS_IMPL); \
|
||||
} \
|
||||
\
|
||||
virtual bool equals(const CCallbackBase *callbackBase) \
|
||||
{ \
|
||||
const CCallbackMethod *callbackMethod = \
|
||||
dynamic_cast<const CCallbackMethod *>(callbackBase); \
|
||||
if (!callbackMethod) return false; \
|
||||
return m_CallbackObject == callbackMethod->m_CallbackObject \
|
||||
&& m_CallbackMethod == callbackMethod->m_CallbackMethod; \
|
||||
} \
|
||||
\
|
||||
private: \
|
||||
TClass *m_CallbackObject; \
|
||||
TCallbackMethod m_CallbackMethod; \
|
||||
}; \
|
||||
\
|
||||
public: \
|
||||
CCallback() : m_CallbackBase(NULL) \
|
||||
{ \
|
||||
\
|
||||
} \
|
||||
\
|
||||
CCallback(TCallbackFunction *callbackFunction) : m_CallbackBase(new CCallbackFunction(callbackFunction)) \
|
||||
{ \
|
||||
nlassert(m_CallbackBase); \
|
||||
m_CallbackBase->refAdd(); \
|
||||
} \
|
||||
\
|
||||
template<typename TClass> \
|
||||
CCallback(TClass *callbackObject, TReturn (TClass::*callbackMethod)(NLMISC_CALLBACK_ARGS_DECL)) : m_CallbackBase(new CCallbackMethod<TClass>(callbackObject, callbackMethod)) \
|
||||
{ \
|
||||
nlassert(m_CallbackBase); \
|
||||
m_CallbackBase->refAdd(); \
|
||||
} \
|
||||
\
|
||||
CCallback(const CCallback &callback) \
|
||||
{ \
|
||||
m_CallbackBase = callback.m_CallbackBase; \
|
||||
if (m_CallbackBase) \
|
||||
m_CallbackBase->refAdd(); \
|
||||
} \
|
||||
\
|
||||
CCallback &operator=(const CCallback &callback) \
|
||||
{ \
|
||||
if (m_CallbackBase != callback.m_CallbackBase) \
|
||||
{ \
|
||||
if (m_CallbackBase) \
|
||||
m_CallbackBase->refRemove(); \
|
||||
m_CallbackBase = callback.m_CallbackBase; \
|
||||
if (m_CallbackBase) \
|
||||
m_CallbackBase->refAdd(); \
|
||||
} \
|
||||
return *this; \
|
||||
} \
|
||||
\
|
||||
~CCallback() \
|
||||
{ \
|
||||
if (m_CallbackBase) \
|
||||
{ \
|
||||
m_CallbackBase->refRemove(); \
|
||||
m_CallbackBase = NULL; \
|
||||
} \
|
||||
} \
|
||||
\
|
||||
TReturn callback(NLMISC_CALLBACK_ARGS_DECL) \
|
||||
{ \
|
||||
nlassert(m_CallbackBase); \
|
||||
return m_CallbackBase->callback(NLMISC_CALLBACK_ARGS_IMPL); \
|
||||
} \
|
||||
\
|
||||
TReturn operator()(NLMISC_CALLBACK_ARGS_DECL) \
|
||||
{ \
|
||||
nlassert(m_CallbackBase); \
|
||||
return m_CallbackBase->callback(NLMISC_CALLBACK_ARGS_IMPL); \
|
||||
} \
|
||||
\
|
||||
bool valid() const \
|
||||
{ \
|
||||
return m_CallbackBase != NULL; \
|
||||
} \
|
||||
\
|
||||
operator bool() const \
|
||||
{ \
|
||||
return m_CallbackBase != NULL; \
|
||||
} \
|
||||
\
|
||||
bool operator==(const CCallback &callback) \
|
||||
{ \
|
||||
return m_CallbackBase->equals(callback.m_CallbackBase); \
|
||||
} \
|
||||
\
|
||||
private: \
|
||||
CCallbackBase *m_CallbackBase; \
|
||||
\
|
||||
}; /* class CCallback */ \
|
||||
|
||||
template<typename TReturn, typename TArgsA = void, typename TArgsB = void, typename TArgsC = void, typename TArgsD = void, typename TArgsE = void, typename TArgsF = void, typename TArgsG = void, typename TDummy = void>
|
||||
class CCallback;
|
||||
|
||||
#define NLMISC_CALLBACK_ARGS_CLASS CCallback<TReturn, void, void, void, void, void, void, void, void>
|
||||
#define NLMISC_CALLBACK_ARGS_TYPENAME
|
||||
#define NLMISC_CALLBACK_ARGS_DECL
|
||||
#define NLMISC_CALLBACK_ARGS_IMPL
|
||||
NLMISC_CALLBACK_TEMPLATE
|
||||
#undef NLMISC_CALLBACK_ARGS_CLASS
|
||||
#undef NLMISC_CALLBACK_ARGS_TYPENAME
|
||||
#undef NLMISC_CALLBACK_ARGS_DECL
|
||||
#undef NLMISC_CALLBACK_ARGS_IMPL
|
||||
|
||||
#define NLMISC_CALLBACK_ARGS_CLASS CCallback<TReturn, TArgsA, void, void, void, void, void, void, void>
|
||||
#define NLMISC_CALLBACK_ARGS_TYPENAME , typename TArgsA
|
||||
#define NLMISC_CALLBACK_ARGS_DECL TArgsA argsA
|
||||
#define NLMISC_CALLBACK_ARGS_IMPL argsA
|
||||
NLMISC_CALLBACK_TEMPLATE
|
||||
#undef NLMISC_CALLBACK_ARGS_CLASS
|
||||
#undef NLMISC_CALLBACK_ARGS_TYPENAME
|
||||
#undef NLMISC_CALLBACK_ARGS_DECL
|
||||
#undef NLMISC_CALLBACK_ARGS_IMPL
|
||||
|
||||
#define NLMISC_CALLBACK_ARGS_CLASS CCallback<TReturn, TArgsA, TArgsB, void, void, void, void, void, void>
|
||||
#define NLMISC_CALLBACK_ARGS_TYPENAME , typename TArgsA, typename TArgsB
|
||||
#define NLMISC_CALLBACK_ARGS_DECL TArgsA argsA, TArgsB argsB
|
||||
#define NLMISC_CALLBACK_ARGS_IMPL argsA, argsB
|
||||
NLMISC_CALLBACK_TEMPLATE
|
||||
#undef NLMISC_CALLBACK_ARGS_CLASS
|
||||
#undef NLMISC_CALLBACK_ARGS_TYPENAME
|
||||
#undef NLMISC_CALLBACK_ARGS_DECL
|
||||
#undef NLMISC_CALLBACK_ARGS_IMPL
|
||||
|
||||
#define NLMISC_CALLBACK_ARGS_CLASS CCallback<TReturn, TArgsA, TArgsB, TArgsC, void, void, void, void, void>
|
||||
#define NLMISC_CALLBACK_ARGS_TYPENAME , typename TArgsA, typename TArgsB, typename TArgsC
|
||||
#define NLMISC_CALLBACK_ARGS_DECL TArgsA argsA, TArgsB argsB, TArgsC argsC
|
||||
#define NLMISC_CALLBACK_ARGS_IMPL argsA, argsB, argsC
|
||||
NLMISC_CALLBACK_TEMPLATE
|
||||
#undef NLMISC_CALLBACK_ARGS_CLASS
|
||||
#undef NLMISC_CALLBACK_ARGS_TYPENAME
|
||||
#undef NLMISC_CALLBACK_ARGS_DECL
|
||||
#undef NLMISC_CALLBACK_ARGS_IMPL
|
||||
|
||||
#define NLMISC_CALLBACK_ARGS_CLASS CCallback<TReturn, TArgsA, TArgsB, TArgsC, TArgsD, void, void, void, void>
|
||||
#define NLMISC_CALLBACK_ARGS_TYPENAME , typename TArgsA, typename TArgsB, typename TArgsC, typename TArgsD
|
||||
#define NLMISC_CALLBACK_ARGS_DECL TArgsA argsA, TArgsB argsB, TArgsC argsC, TArgsD argsD
|
||||
#define NLMISC_CALLBACK_ARGS_IMPL argsA, argsB, argsC, argsD
|
||||
NLMISC_CALLBACK_TEMPLATE
|
||||
#undef NLMISC_CALLBACK_ARGS_CLASS
|
||||
#undef NLMISC_CALLBACK_ARGS_TYPENAME
|
||||
#undef NLMISC_CALLBACK_ARGS_DECL
|
||||
#undef NLMISC_CALLBACK_ARGS_IMPL
|
||||
|
||||
#define NLMISC_CALLBACK_ARGS_CLASS CCallback<TReturn, TArgsA, TArgsB, TArgsC, TArgsD, TArgsE, void, void, void>
|
||||
#define NLMISC_CALLBACK_ARGS_TYPENAME , typename TArgsA, typename TArgsB, typename TArgsC, typename TArgsD, typename TArgsE
|
||||
#define NLMISC_CALLBACK_ARGS_DECL TArgsA argsA, TArgsB argsB, TArgsC argsC, TArgsD argsD, TArgsE argsE
|
||||
#define NLMISC_CALLBACK_ARGS_IMPL argsA, argsB, argsC, argsD, argsE
|
||||
NLMISC_CALLBACK_TEMPLATE
|
||||
#undef NLMISC_CALLBACK_ARGS_CLASS
|
||||
#undef NLMISC_CALLBACK_ARGS_TYPENAME
|
||||
#undef NLMISC_CALLBACK_ARGS_DECL
|
||||
#undef NLMISC_CALLBACK_ARGS_IMPL
|
||||
|
||||
#define NLMISC_CALLBACK_ARGS_CLASS CCallback<TReturn, TArgsA, TArgsB, TArgsC, TArgsD, TArgsE, TArgsF, void, void>
|
||||
#define NLMISC_CALLBACK_ARGS_TYPENAME , typename TArgsA, typename TArgsB, typename TArgsC, typename TArgsD, typename TArgsE, typename TArgsF
|
||||
#define NLMISC_CALLBACK_ARGS_DECL TArgsA argsA, TArgsB argsB, TArgsC argsC, TArgsD argsD, TArgsE argsE, TArgsF argsF
|
||||
#define NLMISC_CALLBACK_ARGS_IMPL argsA, argsB, argsC, argsD, argsE, argsF
|
||||
NLMISC_CALLBACK_TEMPLATE
|
||||
#undef NLMISC_CALLBACK_ARGS_CLASS
|
||||
#undef NLMISC_CALLBACK_ARGS_TYPENAME
|
||||
#undef NLMISC_CALLBACK_ARGS_DECL
|
||||
#undef NLMISC_CALLBACK_ARGS_IMPL
|
||||
|
||||
#define NLMISC_CALLBACK_ARGS_CLASS CCallback<TReturn, TArgsA, TArgsB, TArgsC, TArgsD, TArgsE, TArgsF, TArgsG, void>
|
||||
#define NLMISC_CALLBACK_ARGS_TYPENAME , typename TArgsA, typename TArgsB, typename TArgsC, typename TArgsD, typename TArgsE, typename TArgsF, typename TArgsG
|
||||
#define NLMISC_CALLBACK_ARGS_DECL TArgsA argsA, TArgsB argsB, TArgsC argsC, TArgsD argsD, TArgsE argsE, TArgsF argsF, TArgsG argsG
|
||||
#define NLMISC_CALLBACK_ARGS_IMPL argsA, argsB, argsC, argsD, argsE, argsF, argsG
|
||||
NLMISC_CALLBACK_TEMPLATE
|
||||
#undef NLMISC_CALLBACK_ARGS_CLASS
|
||||
#undef NLMISC_CALLBACK_ARGS_TYPENAME
|
||||
#undef NLMISC_CALLBACK_ARGS_DECL
|
||||
#undef NLMISC_CALLBACK_ARGS_IMPL
|
||||
#undef NLMISC_CALLBACK_ARGS_CLASSNAME
|
||||
|
||||
#undef NLMISC_CALLBACK_TEMPLATE
|
||||
|
||||
} /* namespace NLMISC */
|
||||
|
||||
#endif /* #ifndef NLMISC_CALLBACK_H */
|
||||
|
||||
/* end of file */
|
@ -1,204 +0,0 @@
|
||||
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
|
||||
// Copyright (C) 2010 Winch Gate Property Limited
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
#ifndef NL_DI_EVENT_EMITTER_H
|
||||
#define NL_DI_EVENT_EMITTER_H
|
||||
|
||||
|
||||
|
||||
#include "types_nl.h"
|
||||
|
||||
|
||||
#ifdef NL_OS_WINDOWS
|
||||
|
||||
|
||||
#define DIRECTINPUT_VERSION 0x0800
|
||||
|
||||
#include "input_device_server.h"
|
||||
#include "input_device_manager.h"
|
||||
#include "event_emitter.h"
|
||||
#include "smart_ptr.h"
|
||||
#include "events.h"
|
||||
#include "rect.h"
|
||||
#include "game_device.h"
|
||||
#ifndef NL_COMP_MINGW
|
||||
# define NOMINMAX
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#include <dinput.h>
|
||||
|
||||
|
||||
|
||||
namespace NLMISC
|
||||
{
|
||||
|
||||
|
||||
class CWinEventEmitter;
|
||||
class CDIKeyboard;
|
||||
class CDIMouse;
|
||||
struct IMouseDevice;
|
||||
struct IKeyboardDevice;
|
||||
|
||||
//
|
||||
struct EDirectInput : public EInputDevice
|
||||
{
|
||||
EDirectInput(const char *reason) : EInputDevice(reason) {}
|
||||
};
|
||||
//
|
||||
struct EDirectInputLibNotFound : public EDirectInput
|
||||
{
|
||||
EDirectInputLibNotFound() : EDirectInput("can't found the direct input dll") {}
|
||||
};
|
||||
//
|
||||
struct EDirectInputInitFailed : public EDirectInput
|
||||
{
|
||||
EDirectInputInitFailed() : EDirectInput("Direct input initialization failed") {}
|
||||
};
|
||||
//
|
||||
struct EDirectInputCooperativeLevelFailed : public EDirectInput
|
||||
{
|
||||
EDirectInputCooperativeLevelFailed() : EDirectInput("Direct Input Device Cooperative level couldn't be set") {}
|
||||
};
|
||||
|
||||
|
||||
// Class to represent Direct Inputs events
|
||||
struct CDIEvent : public IInputDeviceEvent
|
||||
{
|
||||
virtual bool operator < (const IInputDeviceEvent &ide) const
|
||||
{
|
||||
// just compare the dates
|
||||
return Datas.dwTimeStamp < (safe_cast<const CDIEvent *>(&ide))->Datas.dwTimeStamp;
|
||||
}
|
||||
DIDEVICEOBJECTDATA Datas;
|
||||
};
|
||||
|
||||
/**
|
||||
* This manage events by using DirectInput8.
|
||||
* This should be polled regularly.
|
||||
* This can be mixed with a CWinEmitter (for example, you may have mouse using direct input, and keyboard using standard messages)
|
||||
* \author Nicolas Vizerie
|
||||
* \author Nevrax France
|
||||
* \date 2002
|
||||
*/
|
||||
class CDIEventEmitter : public IEventEmitter, public IInputDeviceManager
|
||||
{
|
||||
public:
|
||||
/** Build a Direct Input Event Emitter object. An exception containing the reason is thrown if the initialization failed.
|
||||
* The obtained object must be released by deleting it.
|
||||
* \param hinst the instance of the application.
|
||||
* \param hwnd the main window of the application.
|
||||
* \param we A windows eventsemitter. Can be NULL. Needed if you want to mix WIN32 events and Direct Input events
|
||||
* (for example, a Direct Input Mouse and a Win32 Keyboard)
|
||||
*/
|
||||
static CDIEventEmitter *create(HINSTANCE hinst, HWND hwnd, CWinEventEmitter *we) throw(EDirectInput);
|
||||
~CDIEventEmitter();
|
||||
public:
|
||||
|
||||
/// This poll the direct input state, directly storing the result in the given server, or keeping the result in internal server if NULL.
|
||||
void poll(CEventServer *server = NULL);
|
||||
|
||||
///\name From IDeviceManager, access to devices
|
||||
//@{
|
||||
// Test if a mouse has been created (by a call to getMouseDeivce)
|
||||
virtual bool isMouseCreated() { return _Mouse != NULL; }
|
||||
/** Create the mouse device if needed (one active at a time for that object, repeated calls returns the same pointer) and get an interface on it. An exception if thrown if it couldn't be obtained.
|
||||
* If this object has a pointer on a win32 emiter, Win32 mouse messages are replaced by this mouse messages.
|
||||
*/
|
||||
virtual IMouseDevice *getMouseDevice(bool hardware) throw(EInputDevice);
|
||||
/// remove the direct input mouse
|
||||
virtual void releaseMouse();
|
||||
/** Create the keyboard device if needed (one active at a time for that object, repeated calls returns the same pointer) and get an interface on it.
|
||||
* If this object has a pointer on a win32 emiter, Win32 keyboard messages are replaced by this keyboard messages.
|
||||
* NB: A direct input has no notion of localization or key combinations. See keyboard_device.h for more infos
|
||||
*/
|
||||
virtual IKeyboardDevice *getKeyboardDevice() throw(EInputDevice);
|
||||
/// remove the direct input keyboard
|
||||
virtual void releaseKeyboard();
|
||||
// Enumerates current game devices (gamepads, joystick etc.). The result is stored in the given vector
|
||||
virtual void enumerateGameDevice(TDeviceDescVect &descs) throw(EInputDevice);
|
||||
// Create the given game device from its instance name. It also means that it will begin to sends inputs
|
||||
virtual IGameDevice *createGameDevice(const std::string &instanceName) throw(EInputDevice);
|
||||
// Release the given game device
|
||||
virtual void releaseGameDevice(IGameDevice *);
|
||||
//@}
|
||||
|
||||
/// from IEventEmitter
|
||||
virtual void submitEvents(CEventServer &server, bool allWindows);
|
||||
virtual void emulateMouseRawMode(bool enable);
|
||||
|
||||
// Build a TMouseButton value from the current buttons state
|
||||
TMouseButton buildButtonsFlags() const;
|
||||
// Build a TMouseButton value (but with no mouse values)
|
||||
TMouseButton buildKeyboardButtonFlags() const
|
||||
{
|
||||
return (TMouseButton) (buildButtonsFlags() & (ctrlButton|shiftButton|altButton));
|
||||
}
|
||||
|
||||
//================================================================
|
||||
//================================================================
|
||||
//================================================================
|
||||
private:
|
||||
typedef HRESULT (WINAPI * TPDirectInput8Create) (HINSTANCE hinst, DWORD dwVersion, REFIID riidltf, LPVOID* ppvOut, LPUNKNOWN punkOuter);
|
||||
// Private internal server message, used to stored all messages internally before to dispatch them, when no server is supplied to poll(...
|
||||
class CDIEventServer : CEventServer
|
||||
{
|
||||
friend class CDIEventEmitter;
|
||||
public:
|
||||
void setServer (CEventServer *server)
|
||||
{
|
||||
_Server = server;
|
||||
}
|
||||
private:
|
||||
bool pumpEvent(CEvent *event)
|
||||
{
|
||||
CEventServer::pumpEvent(event);
|
||||
_Server->postEvent (event);
|
||||
return false;
|
||||
}
|
||||
private:
|
||||
CEventServer *_Server;
|
||||
};
|
||||
private:
|
||||
HWND _hWnd;
|
||||
TMouseButton _ButtonsFlags;
|
||||
NLMISC::CRefPtr<CWinEventEmitter> _WE;
|
||||
static HMODULE _DirectInputLibHandle;
|
||||
static TPDirectInput8Create _PDirectInput8Create;
|
||||
static uint _NumCreatedInterfaces;
|
||||
private:
|
||||
static bool loadLib();
|
||||
static void unloadLib();
|
||||
//====
|
||||
private:
|
||||
CDIEventServer _InternalServer;
|
||||
CInputDeviceServer _DeviceServer;
|
||||
IDirectInput8 *_DInput8;
|
||||
CDIMouse *_Mouse;
|
||||
CDIKeyboard *_Keyboard;
|
||||
private:
|
||||
CDIEventEmitter(HWND hwnd, CWinEventEmitter *we);
|
||||
};
|
||||
|
||||
|
||||
|
||||
} // NLMISC
|
||||
|
||||
#endif // NL_WINDOWS
|
||||
|
||||
|
||||
#endif // NL_DX_EVENT_EMITTER_H
|
||||
|
||||
/* End of dx_event_emitter.h */
|
@ -1,114 +0,0 @@
|
||||
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
|
||||
// Copyright (C) 2010 Winch Gate Property Limited
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
#ifndef NL_GAME_DEVICE_H
|
||||
#define NL_GAME_DEVICE_H
|
||||
|
||||
#include "types_nl.h"
|
||||
#include "input_device.h"
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
|
||||
namespace NLMISC
|
||||
{
|
||||
|
||||
/// Describe a game device
|
||||
struct CGameDeviceDesc
|
||||
{
|
||||
// type of the device
|
||||
enum TDevType { GamePad, Joystick, DontKnow, DevTypeLast } DevType;
|
||||
// Friendly name for the instance. For example, "Joystick 1."
|
||||
std::string InstanceName;
|
||||
// Friendly name for the product
|
||||
std::string ProductName;
|
||||
// Tells whether this device is connected
|
||||
bool Connected;
|
||||
};
|
||||
|
||||
// a list of game device description
|
||||
typedef std::vector<CGameDeviceDesc> TDeviceDescVect;
|
||||
|
||||
/// for devices comparison. The 'Connected' field is ignored.
|
||||
inline bool operator == (const CGameDeviceDesc &lhs, const CGameDeviceDesc &rhs)
|
||||
{
|
||||
return lhs.InstanceName == rhs.InstanceName && lhs.ProductName == rhs.ProductName;
|
||||
}
|
||||
//
|
||||
inline bool operator != (const CGameDeviceDesc &lhs, const CGameDeviceDesc &rhs)
|
||||
{
|
||||
return !(lhs == rhs);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* This abstract a joystick or gamepad
|
||||
* \author Nicolas Vizerie
|
||||
* \author Nevrax France
|
||||
* \date 2002
|
||||
*/
|
||||
struct IGameDevice : public IInputDevice
|
||||
{
|
||||
enum TAxis { XAxis = 0, YAxis, ZAxis, /* translation */
|
||||
RXAxis, RYAxis, RZAxis, /* rotations */
|
||||
MaxNumAxis
|
||||
};
|
||||
|
||||
/// Get a general description of this device
|
||||
virtual const CGameDeviceDesc &getDescription() const = 0;
|
||||
|
||||
///\name Controls presence
|
||||
//@{
|
||||
// returns the number of buttons available on this game device
|
||||
virtual uint getNumButtons() const = 0;
|
||||
/** Check if the given axe is present on this game device
|
||||
* NB : only absolute axis are managed
|
||||
*/
|
||||
virtual bool hasAxis(TAxis axis) const = 0;
|
||||
// Check the number of sliders presents on this game device
|
||||
virtual uint getNumSliders() const = 0;
|
||||
// Check the number of point of views controls present on this game device
|
||||
virtual uint getNumPOV() const = 0;
|
||||
//@}
|
||||
|
||||
///\name Controls names. Must ensure that controls are present before calling these methods.
|
||||
//@{
|
||||
virtual const char *getButtonName(uint index) const = 0;
|
||||
virtual const char *getAxisName(TAxis axis) const = 0;
|
||||
virtual const char *getSliderName(uint index) const = 0;
|
||||
virtual const char *getPOVName(uint index) const = 0;
|
||||
//@}
|
||||
|
||||
///\name Controls state. Must ensure that controls are present before calling these methods.
|
||||
//@{
|
||||
// Return true if the given button is pushed.
|
||||
virtual bool getButtonState(uint index) const = 0;
|
||||
// Return a value in [-1, 1] for a translation axis, or an orientation.
|
||||
virtual float getAxisValue(TAxis axis) const = 0;
|
||||
// Return a value in [0, 1]
|
||||
virtual float getSliderPos(uint index) const = 0;
|
||||
// Return a CCW angle in degrees
|
||||
virtual float getPOVAngle(uint index) const = 0;
|
||||
//@}
|
||||
};
|
||||
|
||||
|
||||
} // NLMISC
|
||||
|
||||
|
||||
#endif // NL_GAME_DEVICE_H
|
||||
|
||||
/* End of GAME_device.h */
|
@ -1,209 +0,0 @@
|
||||
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
|
||||
// Copyright (C) 2010 Winch Gate Property Limited
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
#ifndef NL_GAME_DEVICE_EVENT_H
|
||||
#define NL_GAME_DEVICE_EVENT_H
|
||||
|
||||
#include "types_nl.h"
|
||||
#include "events.h"
|
||||
#include "game_device.h"
|
||||
|
||||
|
||||
|
||||
|
||||
namespace NLMISC
|
||||
{
|
||||
|
||||
struct IMouseDevice;
|
||||
struct IGameDevice;
|
||||
|
||||
const CClassId EventGDMouseMove(0x12142bc4, 0x43c73e74);
|
||||
const CClassId EventGDButtonDownId(0x57141957, 0x3efb143a);
|
||||
const CClassId EventGDButtonUpId(0x16105e06, 0x302536b2);
|
||||
const CClassId EventGDAxisMovedId(0x073306, 0x41173626);
|
||||
const CClassId EventGDSliderMovedId(0x68776586, 0x394a6916);
|
||||
const CClassId EventGDPOVChanged(0x362851b9, 0x395c4d61);
|
||||
|
||||
|
||||
//==========================================================================================
|
||||
/// A raw mouse move message, expressed in mickeys (relative values)
|
||||
class CGDMouseMove : public CEvent
|
||||
{
|
||||
public:
|
||||
IMouseDevice *MD;
|
||||
sint X, Y;
|
||||
public:
|
||||
CGDMouseMove(IEventEmitter *emitter, IMouseDevice *md, sint x, sint y) : CEvent(emitter, EventGDMouseMove), MD(md), X(x), Y(y)
|
||||
{}
|
||||
|
||||
virtual CEvent *clone() const {return new CGDMouseMove(*this);}
|
||||
};
|
||||
|
||||
|
||||
//==========================================================================================
|
||||
/**
|
||||
* An event from a game device (joystick, joypad ...)
|
||||
*/
|
||||
class CGameDeviceEvent : public CEvent
|
||||
{
|
||||
public:
|
||||
/// the game device this event come from
|
||||
IGameDevice *GameDevice;
|
||||
public:
|
||||
CGameDeviceEvent(
|
||||
IGameDevice *gameDevice,
|
||||
IEventEmitter *emitter,
|
||||
const CClassId &classId
|
||||
)
|
||||
: CEvent(emitter, classId),
|
||||
GameDevice(gameDevice)
|
||||
{}
|
||||
};
|
||||
|
||||
|
||||
//==========================================================================================
|
||||
/** A button state has changed
|
||||
*/
|
||||
class CGDButton : public CGameDeviceEvent
|
||||
{
|
||||
public:
|
||||
// index of the buttons that has been pushed
|
||||
uint ButtonIndex;
|
||||
bool Pushed;
|
||||
public:
|
||||
///
|
||||
CGDButton(
|
||||
uint buttonIndex,
|
||||
bool pushed,
|
||||
IGameDevice *gameDevice,
|
||||
IEventEmitter *emitter,
|
||||
const CClassId &classId
|
||||
)
|
||||
: CGameDeviceEvent(gameDevice, emitter, classId),
|
||||
ButtonIndex(buttonIndex),
|
||||
Pushed(pushed)
|
||||
{}
|
||||
};
|
||||
|
||||
|
||||
//==========================================================================================
|
||||
/** A button has been pushed
|
||||
*/
|
||||
class CGDButtonDown : public CGDButton
|
||||
{
|
||||
public:
|
||||
///
|
||||
CGDButtonDown(uint buttonIndex, IGameDevice *gameDevice, IEventEmitter *emitter)
|
||||
: CGDButton(buttonIndex, true, gameDevice, emitter, EventGDButtonDownId)
|
||||
{}
|
||||
|
||||
virtual CEvent *clone() const {return new CGDButtonDown(*this);}
|
||||
};
|
||||
|
||||
//==========================================================================================
|
||||
/** A button has been released
|
||||
*/
|
||||
class CGDButtonUp : public CGDButton
|
||||
{
|
||||
public:
|
||||
///
|
||||
CGDButtonUp(uint buttonIndex, IGameDevice *gameDevice, IEventEmitter *emitter)
|
||||
: CGDButton(buttonIndex, false, gameDevice, emitter, EventGDButtonUpId)
|
||||
{}
|
||||
|
||||
virtual CEvent *clone() const {return new CGDButtonUp(*this);}
|
||||
};
|
||||
|
||||
//==========================================================================================
|
||||
/// An axis has moved
|
||||
class CGDAxisMoved : public CGameDeviceEvent
|
||||
{
|
||||
public:
|
||||
IGameDevice::TAxis Axis;
|
||||
// current position of the axis, ranges from -1.f to 1.f
|
||||
float Value;
|
||||
public:
|
||||
CGDAxisMoved(
|
||||
IGameDevice::TAxis axis,
|
||||
float value,
|
||||
IGameDevice *gameDevice,
|
||||
IEventEmitter *emitter
|
||||
)
|
||||
: CGameDeviceEvent(gameDevice, emitter, EventGDAxisMovedId),
|
||||
Axis(axis),
|
||||
Value(value)
|
||||
{}
|
||||
|
||||
virtual CEvent *clone() const {return new CGDAxisMoved(*this);}
|
||||
};
|
||||
|
||||
|
||||
//==========================================================================================
|
||||
/// A slider position has changed
|
||||
class CGDSliderMoved : public CGameDeviceEvent
|
||||
{
|
||||
public:
|
||||
uint SliderIndex;
|
||||
// current position of the slider, ranges from 0.f to 1.f
|
||||
float SliderPos;
|
||||
public:
|
||||
CGDSliderMoved(
|
||||
float sliderPos,
|
||||
uint sliderIndex,
|
||||
IGameDevice *gameDevice,
|
||||
IEventEmitter *emitter
|
||||
)
|
||||
: CGameDeviceEvent(gameDevice, emitter, EventGDSliderMovedId),
|
||||
SliderIndex(sliderIndex),
|
||||
SliderPos(sliderPos)
|
||||
{}
|
||||
|
||||
virtual CEvent *clone() const {return new CGDSliderMoved(*this);}
|
||||
};
|
||||
|
||||
//==========================================================================================
|
||||
/// A point of view control changed
|
||||
class CGDPOVChanged : public CGameDeviceEvent
|
||||
{
|
||||
public:
|
||||
uint POVIndex;
|
||||
bool Centered;
|
||||
// The POV angle, in degrees (CW)
|
||||
float POVAngle;
|
||||
public:
|
||||
CGDPOVChanged(
|
||||
bool centered,
|
||||
float povAngle,
|
||||
uint povIndex,
|
||||
IGameDevice *gameDevice,
|
||||
IEventEmitter *emitter
|
||||
)
|
||||
: CGameDeviceEvent(gameDevice, emitter, EventGDPOVChanged),
|
||||
POVIndex(povIndex),
|
||||
Centered(centered),
|
||||
POVAngle(povAngle)
|
||||
{}
|
||||
|
||||
virtual CEvent *clone() const {return new CGDPOVChanged(*this);}
|
||||
};
|
||||
|
||||
|
||||
} // NLMISC
|
||||
|
||||
|
||||
#endif // NL_GAME_DEVICE_EVENT_H
|
||||
|
||||
/* End of game_device_event.h */
|
@ -1,84 +0,0 @@
|
||||
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
|
||||
// Copyright (C) 2010 Winch Gate Property Limited
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
#ifndef NL_INPUT_DEVICE_H
|
||||
#define NL_INPUT_DEVICE_H
|
||||
|
||||
#include "types_nl.h"
|
||||
|
||||
|
||||
namespace NLMISC
|
||||
{
|
||||
|
||||
|
||||
class CEventServer;
|
||||
class CInputDeviceServer;
|
||||
struct IInputDeviceEvent;
|
||||
|
||||
|
||||
/**
|
||||
* Base class that wrap to a device
|
||||
* \author Nicolas Vizerie
|
||||
* \author Nevrax France
|
||||
* \date 2002
|
||||
*/
|
||||
|
||||
struct IInputDevice
|
||||
{
|
||||
/** Set the buffer size for this device (the number of samples it can retains).
|
||||
* This return true if the size could be set
|
||||
*/
|
||||
virtual bool setBufferSize(uint size) = 0;
|
||||
/// Get the buffer size for this device
|
||||
virtual uint getBufferSize() const = 0;
|
||||
|
||||
///\name Device server specifics. You usually don't want to call these
|
||||
//@{
|
||||
/** For device server usage :
|
||||
* Called at the beginning of each events retrieval.
|
||||
* If a device doesn't support buffered datas, the state changes can be directly send to the event server.
|
||||
* The default does nothing.
|
||||
*/
|
||||
virtual void begin(CEventServer * /* server */) {}
|
||||
|
||||
/** For device server usage :
|
||||
* Poll all events from that device, and notify them to the given device server, so that they can be sorted between devices.
|
||||
* This retrieves messages, but do not process them.
|
||||
*/
|
||||
virtual void poll(CInputDeviceServer *dev) = 0;
|
||||
/** For device server usage :
|
||||
* Process an event (eventually update this device state), and translate the message to a IEventServerMessage
|
||||
*/
|
||||
virtual void submit(IInputDeviceEvent *deviceEvent, CEventServer *server) = 0;
|
||||
/** For device server usage :
|
||||
* Says that the next message is for another device, or that it is the last message that will be received.
|
||||
* This allow to pack several messages in one (for example, to sum up mouse moves until a click occurs)
|
||||
* The default does nothing.
|
||||
* The next message can be used to get a time stamp for example. It may be NULL is no next message is available
|
||||
*/
|
||||
virtual void transitionOccured(CEventServer * /* server */, const IInputDeviceEvent * /* nextMessage */) {}
|
||||
//@}
|
||||
|
||||
// dtor
|
||||
virtual ~IInputDevice() {}
|
||||
};
|
||||
|
||||
} // NLMISC
|
||||
|
||||
|
||||
#endif // NL_INPUT_DEVICE_H
|
||||
|
||||
/* End of input_device.h */
|
@ -1,69 +0,0 @@
|
||||
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
|
||||
// Copyright (C) 2010 Winch Gate Property Limited
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
#ifndef NL_INPUT_DEVICE_MANAGER_H
|
||||
#define NL_INPUT_DEVICE_MANAGER_H
|
||||
|
||||
#include "types_nl.h"
|
||||
#include "game_device.h"
|
||||
#include "common.h"
|
||||
|
||||
namespace NLMISC
|
||||
{
|
||||
|
||||
|
||||
struct IMouseDevice;
|
||||
struct IKeyboardDevice;
|
||||
|
||||
|
||||
|
||||
struct EInputDevice : public Exception
|
||||
{
|
||||
EInputDevice(const char *reason) : Exception(reason) {}
|
||||
};
|
||||
|
||||
|
||||
/** Interface for objects that give low level access to devices (mouse, keyboard, joypads and joysticks).
|
||||
* Generally an object implementing this interface will send the appropriate events when a device is 'created'.
|
||||
* (Example of implementation : a direct input event emitter)
|
||||
*/
|
||||
struct IInputDeviceManager
|
||||
{
|
||||
// Test if a mouse has been created (by a call to getMouseDeivce)
|
||||
virtual bool isMouseCreated() = 0;
|
||||
/// Create the low level mouse device if needed (one active at a time for that object, repeated calls returns the same pointer). An exception if thrown if it couldn't be obtained.
|
||||
virtual IMouseDevice *getMouseDevice(bool hardware) throw(EInputDevice) = 0;
|
||||
/// remove the low level mouse
|
||||
virtual void releaseMouse() = 0;
|
||||
/// Create the low level keyboard device if needed (one active at a time for that object, repeated calls returns the same pointer). An exception if thrown if it couldn't be obtained.
|
||||
virtual IKeyboardDevice *getKeyboardDevice() throw(EInputDevice) = 0;
|
||||
/// remove the low level keyboard
|
||||
virtual void releaseKeyboard() = 0;
|
||||
// Enumerates current game devices (gamepads, joystick etc.). The result is stored in the given vector
|
||||
virtual void enumerateGameDevice(TDeviceDescVect &descs) throw(EInputDevice) = 0;
|
||||
// Create the given game device interface from its instance name. It also means that it will begin to sends events.
|
||||
virtual IGameDevice *createGameDevice(const std::string &instanceName) throw(EInputDevice) = 0;
|
||||
// Release the given game device.
|
||||
virtual void releaseGameDevice(IGameDevice *gd) = 0;
|
||||
};
|
||||
|
||||
|
||||
} // NLMISC
|
||||
|
||||
|
||||
#endif // NL_INPUT_DEVICE_MANAGER_H
|
||||
|
||||
/* End of device_manager.h */
|
@ -1,84 +0,0 @@
|
||||
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
|
||||
// Copyright (C) 2010 Winch Gate Property Limited
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
#ifndef NL_INPUT_DEVICE_SERVER_H
|
||||
#define NL_INPUT_DEVICE_SERVER_H
|
||||
|
||||
#include "types_nl.h"
|
||||
#include <vector>
|
||||
|
||||
|
||||
namespace NLMISC
|
||||
{
|
||||
|
||||
class CEventServer;
|
||||
struct IInputDevice;
|
||||
struct IInputDeviceEvent;
|
||||
|
||||
|
||||
/** Base class for an input device server. Unlike an event server, it manages several devices, and can sort their events (by date for example).
|
||||
* It keeps a list of active devices.
|
||||
* It can poll datas from every active device.
|
||||
* It can sort devices messages to submit them in correct order to a CEventServer.
|
||||
*/
|
||||
|
||||
class CInputDeviceServer
|
||||
{
|
||||
public:
|
||||
/// register a device into this device server.
|
||||
void registerDevice(IInputDevice *device);
|
||||
/// remove a device from this server (but does not delete it).
|
||||
void removeDevice(IInputDevice *device);
|
||||
// returns the number of registered devices
|
||||
uint getNumDevices() const { return (uint)_Devices.size(); }
|
||||
// return a device
|
||||
IInputDevice *getDevice(uint index) { return _Devices[index]; }
|
||||
/// Test whether the given device is handled by this server.
|
||||
bool isDevice(IInputDevice *device) const;
|
||||
/// Retrieve datas from the devices, and submit them to the given CEventServer.
|
||||
void poll(CEventServer *server);
|
||||
/// Allow an input device to register an event. The event will then be deleted by this server
|
||||
void submitEvent(IInputDeviceEvent *deviceEvent);
|
||||
// dtor
|
||||
virtual ~CInputDeviceServer() {}
|
||||
private:
|
||||
typedef std::vector<IInputDevice *> TDeviceCont;
|
||||
typedef std::vector<IInputDeviceEvent *> TEventCont;
|
||||
private:
|
||||
TDeviceCont _Devices;
|
||||
TEventCont _Events;
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
/** An event from an input device.
|
||||
*/
|
||||
struct IInputDeviceEvent
|
||||
{
|
||||
IInputDevice *Emitter; // the input device that emitted that event
|
||||
// Used to sort events by time stamp.
|
||||
virtual bool operator < (const IInputDeviceEvent &IInputDeviceEvent) const = 0;
|
||||
virtual ~IInputDeviceEvent() {}
|
||||
};
|
||||
|
||||
|
||||
} // NLMISC
|
||||
|
||||
|
||||
#endif // NL_INPUT_DEVICE_SERVER_H
|
||||
|
||||
/* End of input_device_server.h */
|
@ -1,63 +0,0 @@
|
||||
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
|
||||
// Copyright (C) 2010 Winch Gate Property Limited
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
#ifndef NL_KEYBOARD_DEVICE_H
|
||||
#define NL_KEYBOARD_DEVICE_H
|
||||
|
||||
#include "types_nl.h"
|
||||
#include "events.h"
|
||||
#include "input_device.h"
|
||||
|
||||
|
||||
|
||||
namespace NLMISC
|
||||
{
|
||||
|
||||
/** Gives access to low level keyboard parameters
|
||||
* - 'Shift' messages are replaced by RShift and LShift msg.
|
||||
* - 'Control' messages are replaced by 'RControl' and 'LControl' msg.
|
||||
* - 'Menu' (alternate) messages are replaced by 'RMenu' and 'LMenu' msg.
|
||||
*/
|
||||
struct IKeyboardDevice : public IInputDevice
|
||||
{
|
||||
/// Max number of supported keys
|
||||
enum { NumKeys = 256 };
|
||||
/// Get the delay before key repeat, in milliseconds
|
||||
virtual uint getKeyRepeatDelay() const = 0;
|
||||
/// Get the delay before key repeat, in milliseconds
|
||||
virtual void setKeyRepeatDelay(uint delay) = 0;
|
||||
/// Get the period before key repeat, in milliseconds
|
||||
virtual uint getKeyRepeatPeriod() const = 0;
|
||||
/// Get the period before key repeat, in milliseconds
|
||||
virtual void setKeyRepeatPeriod(uint period) = 0;
|
||||
/// Set a set of keys for which repetition is disabled
|
||||
virtual void disableRepetition(const TKey *keyTab, uint numKey) = 0;
|
||||
/// Get the number of disabled keys
|
||||
virtual uint getNumDisabledRepetition() const = 0;
|
||||
/** Get the disabled keys and stores in the given tab.
|
||||
* NB: must ensure the destination table has the right size
|
||||
* \see getNumDisabledKeys()
|
||||
*/
|
||||
virtual void getDisabledRepetitions(TKey *destTab) const = 0;
|
||||
};
|
||||
|
||||
|
||||
} // NLMISC
|
||||
|
||||
|
||||
#endif // NL_KEYBOARD_DEVICE_H
|
||||
|
||||
/* End of keyboard_device.h */
|
@ -1,130 +0,0 @@
|
||||
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
|
||||
// Copyright (C) 2010 Winch Gate Property Limited
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
#ifndef NL_MOUSE_DEVICE_H
|
||||
#define NL_MOUSE_DEVICE_H
|
||||
|
||||
#include "types_nl.h"
|
||||
#include "input_device.h"
|
||||
|
||||
|
||||
|
||||
namespace NLMISC
|
||||
{
|
||||
|
||||
class CRect;
|
||||
|
||||
/// An interface to a low level mouse device
|
||||
struct IMouseDevice : public IInputDevice
|
||||
{
|
||||
enum TAxisMode { Raw, Clamped, AxisModeLast };
|
||||
enum TAxis { XAxis = 0, YAxis = 1, AxisLast };
|
||||
enum TMessageMode { NormalMode, RawMode, MessageModeLast };
|
||||
|
||||
///\name Messages
|
||||
//@{
|
||||
/** Tells what messages should be sent :
|
||||
* DEFAULT is 'raw' messages
|
||||
* Raw messages : - no clamping nor frames applied
|
||||
* - no speed applied
|
||||
* - no factor applied
|
||||
* - CGDMouseMove messages are sent
|
||||
* - Move expressed in mickeys
|
||||
* Normal messages : - CEventMouseMove messages are sent
|
||||
* - A frame may clamp one or both axis
|
||||
* - The mouse speed can be changed
|
||||
*/
|
||||
virtual void setMessagesMode(TMessageMode mode) = 0;
|
||||
/// retrieve what kinds of messages are sent
|
||||
virtual TMessageMode getMessagesMode() const = 0;
|
||||
//@}
|
||||
|
||||
///\name Mouse MOVE, valid only
|
||||
//@{
|
||||
/** Set the mode of axis of the mouse. This can be raw, or clamped. In clamped mode, a frame is used to limit the move.
|
||||
* NB : invalid in raw message mode
|
||||
* \see setMouseFrame(const CRect &rect)
|
||||
*/
|
||||
virtual void setMouseMode(TAxis axis, TAxisMode axisMode) = 0;
|
||||
/** returns the mode of the mouse for the given axis.
|
||||
* NB : invalid in raw message mode
|
||||
*/
|
||||
virtual TAxisMode getMouseMode(TAxis axis) const = 0;
|
||||
/** Set the mouse speed. It must be in the ]0, +inf] range, 1 gives the natural mouse speed.
|
||||
* NB : invalid in raw message mode
|
||||
*/
|
||||
virtual void setMouseSpeed(float speed) = 0;
|
||||
/** Get the mouse speed.
|
||||
* NB : invalid in raw message mode
|
||||
*/
|
||||
virtual float getMouseSpeed() const = 0;
|
||||
/** Set the mouse acceleration. It is the threshold in mickey, when start the acceleration. 0 means not acceleration.
|
||||
*/
|
||||
virtual void setMouseAcceleration(uint speed) = 0;
|
||||
/** Get the mouse acceleration.
|
||||
*/
|
||||
virtual uint getMouseAcceleration() const = 0;
|
||||
/** Set the current frame in which the mouse can move, expressed in pixels.
|
||||
* NB do not forget to call setMouseFactors if you want the results to be reported in the 0-1 range.
|
||||
* NB : invalid in raw message mode.
|
||||
* \see setMouseFactors
|
||||
*/
|
||||
virtual void setMouseFrame(const CRect &rect) = 0;
|
||||
/** Gives factor by which the mouse coordinates must be multiplied before an event is sent.
|
||||
* The default factor is 1.
|
||||
* NB : invalid in raw message mode.
|
||||
*
|
||||
* Example : this set a frame of 800x600 and reports event in the [0, 1] range.
|
||||
* \code
|
||||
* mouse->setMouseFrame(800, 600);
|
||||
* mouse->setMouseMode(XAxis, IMouseDevice::Clamped);
|
||||
* mouse->setMouseMode(YAxis, IMouseDevice::Clamped);
|
||||
* mouse->setFactors(1.f / 800, 1.f / 600);
|
||||
* \endcode
|
||||
*/
|
||||
virtual void setFactors(float xFactor, float yFactor) = 0;
|
||||
/** Get the x factor, use to multiply the mouse position before an event is sent.
|
||||
* NB : invalid in raw message mode.
|
||||
* \see setFactors()
|
||||
*/
|
||||
virtual float getXFactor() const = 0;
|
||||
/** Get the y factor, use to multiply the mouse position before an event is sent.
|
||||
* NB : invalid in raw message mode.
|
||||
* \see setFactors()
|
||||
*/
|
||||
virtual float getYFactor() const = 0;
|
||||
//@}
|
||||
|
||||
// Get the current frame used for limiting mouse movements
|
||||
virtual const CRect &getMouseFrame() const = 0;
|
||||
// Set the maximum delay for a double click to be taken in account (in ms).
|
||||
virtual void setDoubleClickDelay(uint ms) = 0;
|
||||
// Get the maximum delay for double click (in ms)
|
||||
virtual uint getDoubleClickDelay() const = 0;
|
||||
// Force the position of the mouse, expressed in pixels
|
||||
virtual void setMousePos(float x, float y) = 0;
|
||||
|
||||
/// From a delta of a mouse position input (eg from CEventMouseMove), deduce delta in mickeys (eg: like received from a CGDMouseMove)
|
||||
virtual void convertStdMouseMoveInMickeys(float &dx, float &dy) const = 0;
|
||||
};
|
||||
|
||||
|
||||
} // NLMISC
|
||||
|
||||
|
||||
#endif // NL_MOUSE_DEVICE_H
|
||||
|
||||
/* End of u_mouse_device.h */
|
@ -0,0 +1,9 @@
|
||||
FILE(GLOB SRC *.cpp)
|
||||
|
||||
ADD_EXECUTABLE(nl_sample_callback ${SRC})
|
||||
|
||||
TARGET_LINK_LIBRARIES(nl_sample_callback nelmisc)
|
||||
NL_DEFAULT_PROPS(nl_sample_callback "NeL, Samples, Misc: Callback")
|
||||
NL_ADD_RUNTIME_FLAGS(nl_sample_callback)
|
||||
|
||||
INSTALL(TARGETS nl_sample_callback RUNTIME DESTINATION ${NL_BIN_PREFIX} COMPONENT samplesmisc)
|
@ -0,0 +1,62 @@
|
||||
/*
|
||||
|
||||
Copyright (c) 2014, Jan BOON
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
*/
|
||||
|
||||
#include <nel/misc/callback.h>
|
||||
#include <nel/misc/debug.h>
|
||||
|
||||
class CTestClass
|
||||
{
|
||||
public:
|
||||
void helloWorld(int y)
|
||||
{
|
||||
nldebug("Method call: %i, %i", y, x);
|
||||
}
|
||||
int x;
|
||||
};
|
||||
|
||||
void functionCall(int i)
|
||||
{
|
||||
nldebug("Function call: %i", i);
|
||||
}
|
||||
|
||||
typedef NLMISC::CCallback<void, int> TCallbackType;
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
CTestClass tc;
|
||||
tc.x = 42;
|
||||
|
||||
TCallbackType cbMethod = TCallbackType(&tc, &CTestClass::helloWorld);
|
||||
TCallbackType cbFunction = TCallbackType(functionCall);
|
||||
cbMethod(100);
|
||||
cbFunction(99);
|
||||
|
||||
getchar();
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
@ -0,0 +1,291 @@
|
||||
/**
|
||||
* \file fxaa.cpp
|
||||
* \brief CFXAA
|
||||
* \date 2014-08-03 21:41GMT
|
||||
* \author Jan Boon (Kaetemi)
|
||||
* CFXAA
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2014 by authors
|
||||
*
|
||||
* This file is part of NL3D.
|
||||
* NL3D is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* NL3D is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General
|
||||
* Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with NL3D. If not, see
|
||||
* <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <nel/misc/types_nl.h>
|
||||
#include <nel/3d/fxaa.h>
|
||||
|
||||
// STL includes
|
||||
|
||||
// NeL includes
|
||||
// #include <nel/misc/debug.h>
|
||||
|
||||
// Project includes
|
||||
#include <nel/3d/u_camera.h>
|
||||
#include <nel/3d/u_driver.h>
|
||||
#include <nel/3d/material.h>
|
||||
#include <nel/3d/texture_bloom.h>
|
||||
#include <nel/3d/texture_user.h>
|
||||
#include <nel/3d/driver_user.h>
|
||||
#include <nel/3d/u_texture.h>
|
||||
#include <nel/3d/render_target_manager.h>
|
||||
|
||||
using namespace std;
|
||||
// using namespace NLMISC;
|
||||
|
||||
namespace NL3D {
|
||||
|
||||
namespace {
|
||||
|
||||
#include "fxaa_program.h"
|
||||
|
||||
} /* anonymous namespace */
|
||||
|
||||
CFXAA::CFXAA(NL3D::UDriver *driver) : m_Driver(driver), m_PP(NULL), m_VP(NULL), m_Width(~0), m_Height(~0)
|
||||
{
|
||||
nldebug("3D: Create FXAA");
|
||||
|
||||
CDriverUser *dru = static_cast<CDriverUser *>(driver);
|
||||
NL3D::IDriver *drv = (dru)->getDriver();
|
||||
|
||||
if (drv->supportBloomEffect() && drv->supportNonPowerOfTwoTextures())
|
||||
{
|
||||
m_PP = new CPixelProgram();
|
||||
// arbfp1
|
||||
{
|
||||
IProgram::CSource *source = new IProgram::CSource();
|
||||
source->Features.MaterialFlags = CProgramFeatures::TextureStages;
|
||||
source->Profile = IProgram::arbfp1;
|
||||
source->setSourcePtr(a_arbfp1);
|
||||
m_PP->addSource(source);
|
||||
}
|
||||
// ps_2_0
|
||||
{
|
||||
IProgram::CSource *source = new IProgram::CSource();
|
||||
source->Features.MaterialFlags = CProgramFeatures::TextureStages;
|
||||
source->Profile = IProgram::ps_2_0;
|
||||
source->setSourcePtr(a_ps_2_0);
|
||||
m_PP->addSource(source);
|
||||
}
|
||||
if (!drv->compilePixelProgram(m_PP))
|
||||
{
|
||||
nlwarning("3D: No supported pixel program for FXAA effect");
|
||||
|
||||
delete m_PP;
|
||||
m_PP = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
nldebug("3D: FXAA pixel program available");
|
||||
}
|
||||
}
|
||||
|
||||
if (!m_PP)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// create vp
|
||||
{
|
||||
m_VP = new CVertexProgram();
|
||||
// nelvp
|
||||
{
|
||||
IProgram::CSource *source = new IProgram::CSource();
|
||||
source->Features.MaterialFlags = CProgramFeatures::TextureStages;
|
||||
source->Profile = IProgram::nelvp;
|
||||
source->setSourcePtr(a_nelvp);
|
||||
m_VP->addSource(source);
|
||||
}
|
||||
if (!drv->compileVertexProgram(m_VP))
|
||||
{
|
||||
nlwarning("3D: No supported vertex program for FXAA effect");
|
||||
|
||||
delete m_VP;
|
||||
m_VP = NULL;
|
||||
delete m_PP;
|
||||
m_PP = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
nldebug("3D: FXAA vertex program available");
|
||||
}
|
||||
}
|
||||
|
||||
if (!m_VP)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// create material and vb
|
||||
{
|
||||
m_Mat = m_Driver->createMaterial();
|
||||
m_Mat.initUnlit();
|
||||
m_Mat.setColor(CRGBA::White);
|
||||
m_Mat.setBlend (false);
|
||||
m_Mat.setAlphaTest (false);
|
||||
NL3D::CMaterial *mat = m_Mat.getObjectPtr();
|
||||
mat->setShader(NL3D::CMaterial::Normal);
|
||||
mat->setBlendFunc(CMaterial::one, CMaterial::zero);
|
||||
mat->setZWrite(false);
|
||||
mat->setZFunc(CMaterial::always);
|
||||
mat->setDoubleSided(true);
|
||||
|
||||
m_QuadUV.V0 = CVector(0.f, 0.f, 0.5f);
|
||||
m_QuadUV.V1 = CVector(1.f, 0.f, 0.5f);
|
||||
m_QuadUV.V2 = CVector(1.f, 1.f, 0.5f);
|
||||
m_QuadUV.V3 = CVector(0.f, 1.f, 0.5f);
|
||||
|
||||
/*if (drv->textureCoordinateAlternativeMode())
|
||||
{
|
||||
m_QuadUV.Uv0 = CUV(0.f, 1.f);
|
||||
m_QuadUV.Uv1 = CUV(1.f, 1.f);
|
||||
m_QuadUV.Uv2 = CUV(1.f, 0.f);
|
||||
m_QuadUV.Uv3 = CUV(0.f, 0.f);
|
||||
}
|
||||
else
|
||||
{*/
|
||||
m_QuadUV.Uv0 = CUV(0.f, 0.f);
|
||||
m_QuadUV.Uv1 = CUV(1.f, 0.f);
|
||||
m_QuadUV.Uv2 = CUV(1.f, 1.f);
|
||||
m_QuadUV.Uv3 = CUV(0.f, 1.f);
|
||||
/*}*/
|
||||
|
||||
/*CVertexBuffer &vb = m_VB;
|
||||
vb.clearValueEx();
|
||||
vb.addValueEx(CVertexBuffer::Position, CVertexBuffer::Float3);
|
||||
vb.addValueEx(CVertexBuffer::TexCoord0, CVertexBuffer::Float2);
|
||||
vb.addValueEx(CVertexBuffer::TexCoord1, CVertexBuffer::Float4);
|
||||
vb.initEx();
|
||||
vb.setPreferredMemory(CVertexBuffer::RAMVolatile, false);
|
||||
vb.setNumVertices(4);*/
|
||||
}
|
||||
}
|
||||
|
||||
CFXAA::~CFXAA()
|
||||
{
|
||||
nldebug("3D: Destroy FXAA");
|
||||
|
||||
if (!m_Mat.empty())
|
||||
{
|
||||
m_Driver->deleteMaterial(m_Mat);
|
||||
}
|
||||
|
||||
delete m_VP;
|
||||
m_VP = NULL;
|
||||
delete m_PP;
|
||||
m_PP = NULL;
|
||||
|
||||
m_Driver = NULL;
|
||||
}
|
||||
|
||||
void CFXAA::applyEffect()
|
||||
{
|
||||
if (!m_PP)
|
||||
return;
|
||||
|
||||
CDriverUser *dru = static_cast<CDriverUser *>(m_Driver);
|
||||
IDriver *drv = dru->getDriver();
|
||||
|
||||
// backup
|
||||
bool fogEnabled = m_Driver->fogEnabled();
|
||||
m_Driver->enableFog(false);
|
||||
|
||||
NL3D::ITexture *renderTarget = drv->getRenderTarget();
|
||||
nlassert(renderTarget);
|
||||
nlassert(renderTarget->isBloomTexture());
|
||||
|
||||
uint width = renderTarget->getWidth();
|
||||
uint height = renderTarget->getHeight();
|
||||
bool mode2D = static_cast<CTextureBloom *>(renderTarget)->isMode2D();
|
||||
nlassert(renderTarget->getUploadFormat() == ITexture::Auto);
|
||||
|
||||
float fwidth = (float)width;
|
||||
float fheight = (float)height;
|
||||
float pwidth = 1.0f / fwidth;
|
||||
float pheight = 1.0f / fheight;
|
||||
float hpwidth = pwidth * 0.5f;
|
||||
float hpheight = pheight * 0.5f;
|
||||
float n = 0.5f;
|
||||
|
||||
//if (width != m_Width || height != m_Height)
|
||||
/*{
|
||||
// Build VB
|
||||
m_Width = width;
|
||||
m_Height = height;
|
||||
CVertexBufferReadWrite vba;
|
||||
m_VB.lock(vba);
|
||||
vba.setValueFloat3Ex(CVertexBuffer::Position, 0, 0.f, 0.f, 0.5f); // BL
|
||||
vba.setValueFloat3Ex(CVertexBuffer::Position, 1, 1.f, 0.f, 0.5f); // BR
|
||||
vba.setValueFloat3Ex(CVertexBuffer::Position, 2, 1.f, 1.f, 0.5f); // TR
|
||||
vba.setValueFloat3Ex(CVertexBuffer::Position, 3, 0.f, 1.f, 0.5f); // TL
|
||||
vba.setValueFloat2Ex(CVertexBuffer::TexCoord0, 0, 0.f, 0.f);
|
||||
vba.setValueFloat2Ex(CVertexBuffer::TexCoord0, 1, 1.f, 0.f);
|
||||
vba.setValueFloat2Ex(CVertexBuffer::TexCoord0, 2, 1.f, 1.f);
|
||||
vba.setValueFloat2Ex(CVertexBuffer::TexCoord0, 3, 0.f, 1.f);
|
||||
vba.setValueFloat4Ex(CVertexBuffer::TexCoord1, 0, 0.f - hpwidth, 0.f - hpheight, 0.f + hpwidth, 0.f + hpheight);
|
||||
vba.setValueFloat4Ex(CVertexBuffer::TexCoord1, 1, 1.f - hpwidth, 0.f - hpheight, 1.f + hpwidth, 0.f + hpheight);
|
||||
vba.setValueFloat4Ex(CVertexBuffer::TexCoord1, 2, 1.f - hpwidth, 1.f - hpheight, 1.f + hpwidth, 1.f + hpheight);
|
||||
vba.setValueFloat4Ex(CVertexBuffer::TexCoord1, 3, 0.f - hpwidth, 1.f - hpheight, 0.f + hpwidth, 1.f + hpheight);
|
||||
}*/
|
||||
|
||||
// create render target
|
||||
CTextureUser *otherRenderTarget = m_Driver->getRenderTargetManager().getRenderTarget(width, height, mode2D);
|
||||
|
||||
// swap render target
|
||||
CTextureUser texNull;
|
||||
dru->setRenderTarget(texNull);
|
||||
drv->swapTextureHandle(*renderTarget, *otherRenderTarget->getITexture());
|
||||
drv->setRenderTarget(renderTarget);
|
||||
m_Driver->setMatrixMode2D11();
|
||||
|
||||
// debug
|
||||
// m_Driver->clearBuffers(CRGBA(128, 128, 128, 128));
|
||||
|
||||
// activate program
|
||||
bool vpok = drv->activeVertexProgram(m_VP);
|
||||
nlassert(vpok);
|
||||
bool ppok = drv->activePixelProgram(m_PP);
|
||||
nlassert(ppok);
|
||||
/*drv->setUniform4f(IDriver::PixelProgram, 0, -n / fwidth, -n / fheight, n / fwidth, n / fheight); // fxaaConsoleRcpFrameOpt
|
||||
drv->setUniform4f(IDriver::PixelProgram, 1, -2.0f / fwidth, -2.0f / fheight, 2.0f / fwidth, 2.0f / fheight); // fxaaConsoleRcpFrameOpt2*/
|
||||
drv->setUniform2f(IDriver::PixelProgram, 0, 1.0f / fwidth, 1.0f / fheight); // fxaaQualityRcpFrame
|
||||
drv->setUniform1f(IDriver::PixelProgram, 1, 0.75f); // fxaaQualitySubpix
|
||||
drv->setUniform1f(IDriver::PixelProgram, 2, 0.166f); // fxaaQualityEdgeThreshold
|
||||
drv->setUniform1f(IDriver::PixelProgram, 3, 0.0833f); // fxaaQualityEdgeThresholdMin
|
||||
drv->setUniformMatrix(IDriver::VertexProgram, 0, IDriver::ModelViewProjection, IDriver::Identity);
|
||||
// drv->setUniform4f(IDriver::VertexProgram, 9, -hpwidth, -hpheight, hpwidth, hpheight);
|
||||
|
||||
// render effect
|
||||
m_Mat.getObjectPtr()->setTexture(0, otherRenderTarget->getITexture());
|
||||
/*drv->activeVertexBuffer(m_VB);
|
||||
drv->renderRawQuads(*m_Mat.getObjectPtr(), 0, 1);*/
|
||||
m_Driver->drawQuad(m_QuadUV, m_Mat);
|
||||
m_Mat.getObjectPtr()->setTexture(0, NULL);
|
||||
|
||||
// deactivate program
|
||||
drv->activeVertexProgram(NULL);
|
||||
drv->activePixelProgram(NULL);
|
||||
|
||||
// restore
|
||||
m_Driver->enableFog(fogEnabled);
|
||||
|
||||
// recycle render target
|
||||
m_Driver->getRenderTargetManager().recycleRenderTarget(otherRenderTarget);
|
||||
}
|
||||
|
||||
} /* namespace NL3D */
|
||||
|
||||
/* end of file */
|
@ -0,0 +1,994 @@
|
||||
|
||||
const char *a_nelvp =
|
||||
"!!VP1.0\n"
|
||||
"DP4 o[HPOS].x, c[0], v[OPOS];\n"
|
||||
"DP4 o[HPOS].y, c[1], v[OPOS];\n"
|
||||
"DP4 o[HPOS].z, c[2], v[OPOS];\n"
|
||||
"DP4 o[HPOS].w, c[3], v[OPOS];\n"
|
||||
"MOV o[TEX0].xy, v[TEX0];\n"
|
||||
// "ADD o[TEX1], v[TEX0].xyxy, c[9];\n"
|
||||
"END\n";
|
||||
|
||||
const char *a_arbfp1_test =
|
||||
"!!ARBfp1.0\n"
|
||||
"OPTION ARB_precision_hint_fastest;\n"
|
||||
"TEX result.color, fragment.texcoord[1].zwzw, texture[0], 2D;\n"
|
||||
"END\n";
|
||||
|
||||
const char *a_arbfp1 =
|
||||
"!!ARBfp1.0\n"
|
||||
"OPTION ARB_precision_hint_fastest;\n"
|
||||
/*"# cgc version 3.1.0013, build date Apr 18 2012\n"
|
||||
"# command line args: -profile arbfp1 -O3 -fastmath -fastprecision\n"
|
||||
"# source file: fxaa_pp.cg\n"
|
||||
"#vendor NVIDIA Corporation\n"
|
||||
"#version 3.1.0.13\n"
|
||||
"#profile arbfp1\n"
|
||||
"#program fxaa_pp\n"
|
||||
"#semantic fxaa_pp.fxaaQualityRcpFrame\n"
|
||||
"#semantic fxaa_pp.fxaaQualitySubpix\n"
|
||||
"#semantic fxaa_pp.fxaaQualityEdgeThreshold\n"
|
||||
"#semantic fxaa_pp.fxaaQualityEdgeThresholdMin\n"
|
||||
"#semantic fxaa_pp.nlTex0 : TEX0\n"
|
||||
"#var float2 pos : $vin.TEXCOORD0 : TEX0 : 0 : 1\n"
|
||||
"#var float2 fxaaQualityRcpFrame : : c[0] : 2 : 1\n"
|
||||
"#var float fxaaQualitySubpix : : c[1] : 3 : 1\n"
|
||||
"#var float fxaaQualityEdgeThreshold : : c[2] : 4 : 1\n"
|
||||
"#var float fxaaQualityEdgeThresholdMin : : c[3] : 5 : 1\n"
|
||||
"#var sampler2D nlTex0 : TEX0 : texunit 0 : 6 : 1\n"
|
||||
"#var float4 oCol : $vout.COLOR : COL : 7 : 1\n"
|
||||
"#const c[4] = 0 -1 1 -2\n"
|
||||
"#const c[5] = 2 0.5 0.25 1.5\n"
|
||||
"#const c[6] = 4 12 0.083333336 3\n"*/
|
||||
"PARAM c[7] = { program.env[0..3],\n"
|
||||
" { 0, -1, 1, -2 },\n"
|
||||
" { 2, 0.5, 0.25, 1.5 },\n"
|
||||
" { 4, 12, 0.083333336, 3 } };\n"
|
||||
"TEMP R0;\n"
|
||||
"TEMP R1;\n"
|
||||
"TEMP R2;\n"
|
||||
"TEMP R3;\n"
|
||||
"TEMP R4;\n"
|
||||
"TEMP R5;\n"
|
||||
"TEMP R6;\n"
|
||||
"TEMP R7;\n"
|
||||
"TEMP R8;\n"
|
||||
"TEMP R9;\n"
|
||||
"MOV R3.xyz, c[4];\n"
|
||||
"MAD R2.zw, R3.xyyz, c[0].xyxy, fragment.texcoord[0].xyxy;\n"
|
||||
"MAD R0.xy, R3, c[0], fragment.texcoord[0];\n"
|
||||
"MAD R1.xy, R3.zyzw, c[0], fragment.texcoord[0];\n"
|
||||
"TEX R5.y, R1, texture[0], 2D;\n"
|
||||
"MAD R1.xy, R3.zxzw, c[0], fragment.texcoord[0];\n"
|
||||
"ADD R0.zw, fragment.texcoord[0].xyxy, -c[0].xyxy;\n"
|
||||
"TEX R4.y, R0.zwzw, texture[0], 2D;\n"
|
||||
"TEX R6.y, R2.zwzw, texture[0], 2D;\n"
|
||||
"TEX R8, fragment.texcoord[0], texture[0], 2D;\n"
|
||||
"TEX R1.y, R1, texture[0], 2D;\n"
|
||||
"TEX R0.y, R0, texture[0], 2D;\n"
|
||||
"ADD R0.z, R4.y, R5.y;\n"
|
||||
"MAD R1.z, R0.y, c[4].w, R0;\n"
|
||||
"MAD R0.zw, R3.xyyx, c[0].xyxy, fragment.texcoord[0].xyxy;\n"
|
||||
"TEX R2.y, R0.zwzw, texture[0], 2D;\n"
|
||||
"ADD R0.x, R2.y, R1.y;\n"
|
||||
"ABS R0.w, R1.z;\n"
|
||||
"ADD R1.zw, fragment.texcoord[0].xyxy, c[0].xyxy;\n"
|
||||
"TEX R7.y, R1.zwzw, texture[0], 2D;\n"
|
||||
"MAD R0.z, R8.y, c[4].w, R0.x;\n"
|
||||
"ABS R0.z, R0;\n"
|
||||
"MAD R2.x, R0.z, c[5], R0.w;\n"
|
||||
"MAD R0.zw, R3.xyxz, c[0].xyxy, fragment.texcoord[0].xyxy;\n"
|
||||
"TEX R3.y, R0.zwzw, texture[0], 2D;\n"
|
||||
"ADD R0.z, R0.y, R3.y;\n"
|
||||
"ADD R1.x, R6.y, R7.y;\n"
|
||||
"MAD R0.w, R3.y, c[4], R1.x;\n"
|
||||
"MAD R1.x, R8.y, c[4].w, R0.z;\n"
|
||||
"ABS R0.w, R0;\n"
|
||||
"ADD R2.x, R0.w, R2;\n"
|
||||
"ADD R2.w, R4.y, R6.y;\n"
|
||||
"ADD R0.w, R5.y, R7.y;\n"
|
||||
"ABS R1.z, R1.x;\n"
|
||||
"MAD R1.x, R1.y, c[4].w, R0.w;\n"
|
||||
"ABS R1.w, R1.x;\n"
|
||||
"MAD R1.x, R2.y, c[4].w, R2.w;\n"
|
||||
"MAD R1.z, R1, c[5].x, R1.w;\n"
|
||||
"ABS R1.x, R1;\n"
|
||||
"ADD R1.x, R1, R1.z;\n"
|
||||
"SGE R4.x, R1, R2;\n"
|
||||
"MAX R1.x, R3.y, R8.y;\n"
|
||||
"MAX R1.z, R1.y, R1.x;\n"
|
||||
"MAX R1.x, R0.y, R2.y;\n"
|
||||
"MAX R1.x, R1, R1.z;\n"
|
||||
"MIN R1.z, R3.y, R8.y;\n"
|
||||
"MIN R1.w, R1.y, R1.z;\n"
|
||||
"MIN R1.z, R0.y, R2.y;\n"
|
||||
"MIN R1.z, R1, R1.w;\n"
|
||||
"MUL R2.x, R1, c[2];\n"
|
||||
"ADD R3.z, R1.x, -R1;\n"
|
||||
"ABS R3.w, R4.x;\n"
|
||||
"MAX R1.w, R2.x, c[3].x;\n"
|
||||
"ADD R2.z, R3, -R1.w;\n"
|
||||
"CMP R2.x, R2.z, c[4], c[4].z;\n"
|
||||
"CMP R1.x, -R3.w, c[4], c[4].z;\n"
|
||||
"MUL R3.w, R2.x, R1.x;\n"
|
||||
"CMP R1.z, -R3.w, R1.y, R3.y;\n"
|
||||
"ADD R1.y, -R8, R1.z;\n"
|
||||
"CMP R1.w, -R3, R2.y, R0.y;\n"
|
||||
"ADD R0.y, -R8, R1.w;\n"
|
||||
"MUL R4.x, R2, R4;\n"
|
||||
"CMP R3.y, -R3.w, c[0], R3.x;\n"
|
||||
"ABS R4.w, R1.y;\n"
|
||||
"ABS R4.z, R0.y;\n"
|
||||
"SGE R0.y, R4.z, R4.w;\n"
|
||||
"MUL R1.y, R2.x, R0;\n"
|
||||
"ABS R0.y, R0;\n"
|
||||
"CMP R4.y, -R0, c[4].x, c[4].z;\n"
|
||||
"ABS R0.y, R1.x;\n"
|
||||
"CMP R0.y, -R0, c[4].x, c[4].z;\n"
|
||||
"MUL R1.x, R2, R0.y;\n"
|
||||
"CMP R2.y, -R4.x, c[0], c[0].x;\n"
|
||||
"CMP R2.y, -R1, -R2, R2;\n"
|
||||
"MAD R1.y, R2, c[5], fragment.texcoord[0];\n"
|
||||
"CMP R5.z, -R4.x, R1.y, fragment.texcoord[0].y;\n"
|
||||
"ADD R5.y, R5.z, -R3;\n"
|
||||
"MAD R0.y, R2, c[5], fragment.texcoord[0].x;\n"
|
||||
"CMP R3.x, -R1, c[0], R3;\n"
|
||||
"CMP R6.x, -R3.w, R0.y, fragment.texcoord[0];\n"
|
||||
"ADD R5.w, R5.z, R3.y;\n"
|
||||
"ADD R1.x, R6, -R3;\n"
|
||||
"MOV R1.y, R5;\n"
|
||||
"TEX R0.y, R1, texture[0], 2D;\n"
|
||||
"MUL R1.y, R2.x, R4;\n"
|
||||
"ADD R0.x, R0.z, R0;\n"
|
||||
"ADD R0.w, R2, R0;\n"
|
||||
"MAD R0.z, R0.x, c[5].x, R0.w;\n"
|
||||
"ADD R1.w, R8.y, R1;\n"
|
||||
"ADD R1.z, R8.y, R1;\n"
|
||||
"CMP R4.y, -R1, R1.z, R1.w;\n"
|
||||
"ADD R1.z, R6.x, R3.x;\n"
|
||||
"MAD R5.x, -R4.y, c[5].y, R0.y;\n"
|
||||
"MOV R1.w, R5;\n"
|
||||
"TEX R0.y, R1.zwzw, texture[0], 2D;\n"
|
||||
"MAX R1.w, R4.z, R4;\n"
|
||||
"MAD R1.y, -R4, c[5], R0;\n"
|
||||
"MUL R4.z, R1.w, c[5];\n"
|
||||
"ABS R0.y, R1;\n"
|
||||
"SGE R1.w, R0.y, R4.z;\n"
|
||||
"ABS R6.y, R5.x;\n"
|
||||
"SGE R0.y, R6, R4.z;\n"
|
||||
"ABS R1.w, R1;\n"
|
||||
"CMP R6.y, -R1.w, c[4].x, c[4].z;\n"
|
||||
"ABS R0.y, R0;\n"
|
||||
"CMP R5.z, -R0.y, c[4].x, c[4];\n"
|
||||
"ADD_SAT R0.y, R5.z, R6;\n"
|
||||
"MUL R4.w, R2.x, R0.y;\n"
|
||||
"MUL R0.y, R2.x, R6;\n"
|
||||
"MAD R1.w, R3.y, c[5], R5;\n"
|
||||
"CMP R6.x, -R0.y, R1.w, R5.w;\n"
|
||||
"MAD R6.z, R3.x, c[5].w, R1;\n"
|
||||
"CMP R1.z, -R0.y, R6, R1;\n"
|
||||
"MOV R1.w, R6.x;\n"
|
||||
"TEX R0.y, R1.zwzw, texture[0], 2D;\n"
|
||||
"MUL R1.w, R4, R6.y;\n"
|
||||
"CMP R6.y, -R1.w, R0, R1;\n"
|
||||
"MUL R0.y, R2.x, R5.z;\n"
|
||||
"MAD R1.y, -R3, c[5].w, R5;\n"
|
||||
"CMP R5.w, -R0.y, R1.y, R5.y;\n"
|
||||
"MAD R6.z, -R3.x, c[5].w, R1.x;\n"
|
||||
"CMP R1.x, -R0.y, R6.z, R1;\n"
|
||||
"MOV R1.y, R5.w;\n"
|
||||
"TEX R0.y, R1, texture[0], 2D;\n"
|
||||
"MUL R5.y, R4.w, R5.z;\n"
|
||||
"CMP R0.y, -R5, R0, R5.x;\n"
|
||||
"MAD R5.x, -R4.y, c[5].y, R0.y;\n"
|
||||
"CMP R5.z, -R5.y, R5.x, R0.y;\n"
|
||||
"MAD R1.y, -R4, c[5], R6;\n"
|
||||
"CMP R1.y, -R1.w, R1, R6;\n"
|
||||
"ABS R1.w, R1.y;\n"
|
||||
"SGE R1.w, R1, R4.z;\n"
|
||||
"ABS R0.y, R5.z;\n"
|
||||
"SGE R0.y, R0, R4.z;\n"
|
||||
"ABS R1.w, R1;\n"
|
||||
"CMP R6.y, -R1.w, c[4].x, c[4].z;\n"
|
||||
"ABS R0.y, R0;\n"
|
||||
"CMP R5.y, -R0, c[4].x, c[4].z;\n"
|
||||
"ADD_SAT R0.y, R5, R6;\n"
|
||||
"MUL R5.x, R4.w, R0.y;\n"
|
||||
"MUL R0.y, R4.w, R6;\n"
|
||||
"MAD R1.w, R3.y, c[5].x, R6.x;\n"
|
||||
"CMP R6.x, -R0.y, R1.w, R6;\n"
|
||||
"MAD R6.z, R3.x, c[5].x, R1;\n"
|
||||
"CMP R1.z, -R0.y, R6, R1;\n"
|
||||
"MOV R1.w, R6.x;\n"
|
||||
"TEX R0.y, R1.zwzw, texture[0], 2D;\n"
|
||||
"MUL R1.w, R5.x, R6.y;\n"
|
||||
"CMP R6.y, -R1.w, R0, R1;\n"
|
||||
"MUL R0.y, R4.w, R5;\n"
|
||||
"MAD R1.y, -R3, c[5].x, R5.w;\n"
|
||||
"CMP R4.w, -R0.y, R1.y, R5;\n"
|
||||
"MAD R6.z, -R3.x, c[5].x, R1.x;\n"
|
||||
"CMP R1.x, -R0.y, R6.z, R1;\n"
|
||||
"MOV R1.y, R4.w;\n"
|
||||
"TEX R0.y, R1, texture[0], 2D;\n"
|
||||
"MUL R5.y, R5.x, R5;\n"
|
||||
"CMP R0.y, -R5, R0, R5.z;\n"
|
||||
"MAD R5.z, -R4.y, c[5].y, R0.y;\n"
|
||||
"CMP R5.w, -R5.y, R5.z, R0.y;\n"
|
||||
"MAD R1.y, -R4, c[5], R6;\n"
|
||||
"CMP R1.y, -R1.w, R1, R6;\n"
|
||||
"ABS R1.w, R1.y;\n"
|
||||
"SGE R1.w, R1, R4.z;\n"
|
||||
"ABS R1.w, R1;\n"
|
||||
"CMP R6.y, -R1.w, c[4].x, c[4].z;\n"
|
||||
"ABS R0.y, R5.w;\n"
|
||||
"SGE R0.y, R0, R4.z;\n"
|
||||
"ABS R0.y, R0;\n"
|
||||
"CMP R5.y, -R0, c[4].x, c[4].z;\n"
|
||||
"ADD_SAT R0.y, R5, R6;\n"
|
||||
"MUL R5.z, R5.x, R0.y;\n"
|
||||
"MUL R0.y, R5.x, R6;\n"
|
||||
"MAD R1.w, R3.y, c[6].x, R6.x;\n"
|
||||
"CMP R6.x, -R0.y, R1.w, R6;\n"
|
||||
"MAD R6.z, R3.x, c[6].x, R1;\n"
|
||||
"CMP R1.z, -R0.y, R6, R1;\n"
|
||||
"MOV R1.w, R6.x;\n"
|
||||
"TEX R0.y, R1.zwzw, texture[0], 2D;\n"
|
||||
"MUL R1.w, R5.z, R6.y;\n"
|
||||
"CMP R6.y, -R1.w, R0, R1;\n"
|
||||
"MUL R0.y, R5.x, R5;\n"
|
||||
"MAD R1.y, -R3, c[6].x, R4.w;\n"
|
||||
"CMP R4.w, -R0.y, R1.y, R4;\n"
|
||||
"MAD R5.x, -R3, c[6], R1;\n"
|
||||
"CMP R1.x, -R0.y, R5, R1;\n"
|
||||
"MOV R1.y, R4.w;\n"
|
||||
"TEX R0.y, R1, texture[0], 2D;\n"
|
||||
"MUL R1.y, R5.z, R5;\n"
|
||||
"CMP R5.x, -R1.y, R0.y, R5.w;\n"
|
||||
"MAD R5.y, -R4, c[5], R5.x;\n"
|
||||
"CMP R1.y, -R1, R5, R5.x;\n"
|
||||
"MAD R0.y, -R4, c[5], R6;\n"
|
||||
"CMP R0.y, -R1.w, R0, R6;\n"
|
||||
"ABS R5.x, R0.y;\n"
|
||||
"ABS R1.w, R1.y;\n"
|
||||
"SGE R1.w, R1, R4.z;\n"
|
||||
"SGE R5.x, R5, R4.z;\n"
|
||||
"ABS R4.z, R5.x;\n"
|
||||
"ABS R1.w, R1;\n"
|
||||
"CMP R4.z, -R4, c[4].x, c[4];\n"
|
||||
"CMP R1.w, -R1, c[4].x, c[4].z;\n"
|
||||
"MUL R4.z, R5, R4;\n"
|
||||
"MAD R5.y, R3.x, c[6], R1.z;\n"
|
||||
"CMP R5.y, -R4.z, R5, R1.z;\n"
|
||||
"MAD R5.x, R3.y, c[6].y, R6;\n"
|
||||
"CMP R1.z, -R4, R5.x, R6.x;\n"
|
||||
"MUL R1.w, R5.z, R1;\n"
|
||||
"ADD R4.z, -fragment.texcoord[0].x, R5.y;\n"
|
||||
"ADD R1.z, -fragment.texcoord[0].y, R1;\n"
|
||||
"CMP R1.z, -R3.w, R1, R4;\n"
|
||||
"MAD R4.z, -R3.x, c[6].y, R1.x;\n"
|
||||
"MAD R3.x, -R3.y, c[6].y, R4.w;\n"
|
||||
"CMP R3.y, -R1.w, R4.z, R1.x;\n"
|
||||
"CMP R1.x, -R1.w, R3, R4.w;\n"
|
||||
"ADD R1.w, fragment.texcoord[0].x, -R3.y;\n"
|
||||
"ADD R1.x, fragment.texcoord[0].y, -R1;\n"
|
||||
"CMP R1.x, -R3.w, R1, R1.w;\n"
|
||||
"SLT R1.w, R1.x, R1.z;\n"
|
||||
"ADD R3.x, R1, R1.z;\n"
|
||||
"ABS R1.w, R1;\n"
|
||||
"MIN R1.x, R1, R1.z;\n"
|
||||
"CMP R1.w, -R1, c[4].x, c[4].z;\n"
|
||||
"MUL R1.z, R2.x, R1.w;\n"
|
||||
"RCP R3.x, R3.x;\n"
|
||||
"MAD R1.x, R1, -R3, c[5].y;\n"
|
||||
"MUL R1.w, R4.y, c[5].y;\n"
|
||||
"SLT R3.x, R1.y, c[4];\n"
|
||||
"SLT R1.y, R8, R1.w;\n"
|
||||
"SLT R0.y, R0, c[4].x;\n"
|
||||
"ADD R0.y, R0, -R1;\n"
|
||||
"ADD R1.y, -R1, R3.x;\n"
|
||||
"ABS R0.y, R0;\n"
|
||||
"ABS R1.y, R1;\n"
|
||||
"CMP R0.y, -R0, c[4].z, c[4].x;\n"
|
||||
"CMP R1.y, -R1, c[4].z, c[4].x;\n"
|
||||
"CMP R0.x, -R1.z, R0.y, R1.y;\n"
|
||||
"MAD R0.y, R0.z, c[6].z, -R8;\n"
|
||||
"ABS R0.x, R0;\n"
|
||||
"CMP R0.x, -R0, c[4], c[4].z;\n"
|
||||
"MUL R0.x, R2, R0;\n"
|
||||
"CMP R0.x, -R0, c[4], R1;\n"
|
||||
"RCP R0.z, R3.z;\n"
|
||||
"ABS R0.y, R0;\n"
|
||||
"MUL_SAT R0.y, R0, R0.z;\n"
|
||||
"MUL R0.z, R0.y, c[4].w;\n"
|
||||
"ADD R0.z, R0, c[6].w;\n"
|
||||
"MUL R0.y, R0, R0;\n"
|
||||
"MUL R0.y, R0.z, R0;\n"
|
||||
"MUL R0.y, R0, R0;\n"
|
||||
"MUL R0.y, R0, c[1].x;\n"
|
||||
"MAX R0.x, R0, R0.y;\n"
|
||||
"MAD R0.y, R0.x, R2, fragment.texcoord[0];\n"
|
||||
"MAD R0.z, R0.x, R2.y, fragment.texcoord[0].x;\n"
|
||||
"CMP R0.x, -R3.w, R0.z, fragment.texcoord[0];\n"
|
||||
"CMP R0.y, -R4.x, R0, fragment.texcoord[0];\n"
|
||||
"TEX R0.xyz, R0, texture[0], 2D;\n"
|
||||
"CMP R1, R2.z, R8, R9;\n"
|
||||
"MOV R0.w, R8.y;\n"
|
||||
"CMP result.color, -R2.x, R0, R1;\n"
|
||||
"END\n";
|
||||
/*"# 260 instructions, 10 R-regs\n"
|
||||
"\n"*/
|
||||
|
||||
const char *a_arbfp1_ps3 =
|
||||
"!!ARBfp1.0\n"
|
||||
"OPTION ARB_precision_hint_fastest;\n"
|
||||
//# cgc version 3.1.0013, build date Apr 18 2012
|
||||
//# command line args: -profile arbfp1 -O3 -fastmath -fastprecision
|
||||
//# source file: fxaa_fp.cg
|
||||
//#vendor NVIDIA Corporation
|
||||
//#version 3.1.0.13
|
||||
//#profile arbfp1
|
||||
//#program fxaa_fp
|
||||
//#semantic fxaa_fp.fxaaConsoleRcpFrameOpt
|
||||
//#semantic fxaa_fp.fxaaConsoleRcpFrameOpt2
|
||||
//#semantic fxaa_fp.nlTex0 : TEX0
|
||||
//#var float2 pos : $vin.TEXCOORD0 : TEX0 : 0 : 1
|
||||
//#var float4 fxaaConsolePosPos : $vin.TEXCOORD1 : TEX1 : 1 : 1
|
||||
//#var float4 fxaaConsoleRcpFrameOpt : : c[0] : 2 : 1
|
||||
//#var float4 fxaaConsoleRcpFrameOpt2 : : c[1] : 3 : 1
|
||||
//#var sampler2D nlTex0 : TEX0 : texunit 0 : 4 : 1
|
||||
//#var float4 oCol : $vout.COLOR : COL : 5 : 1
|
||||
//#const c[2] = 0.125 0 -2 2
|
||||
//#const c[3] = 0.001953125 0.5
|
||||
"PARAM c[4] = { program.env[0..1],\n"
|
||||
" { 0.125, 0, -2, 2 },\n"
|
||||
" { 0.001953125, 0.5 } };\n"
|
||||
"TEMP R0;\n"
|
||||
"TEMP R1;\n"
|
||||
"TEMP R2;\n"
|
||||
"TEMP R3;\n"
|
||||
"TEMP R4;\n"
|
||||
"TEMP R5;\n"
|
||||
"TEX R1.w, fragment.texcoord[1].zyzw, texture[0], 2D;\n"
|
||||
"ADD R0.x, R1.w, c[3];\n"
|
||||
"TEX R0.w, fragment.texcoord[1].xwzw, texture[0], 2D;\n"
|
||||
"TEX R1.w, fragment.texcoord[1], texture[0], 2D;\n"
|
||||
"ADD R0.y, -R0.x, R0.w;\n"
|
||||
"ADD R0.z, R1.w, R0.y;\n"
|
||||
"TEX R2.w, fragment.texcoord[1].zwzw, texture[0], 2D;\n"
|
||||
"ADD R0.y, -R1.w, R0;\n"
|
||||
"ADD R1.x, R2.w, R0.y;\n"
|
||||
"ADD R1.y, R0.z, -R2.w;\n"
|
||||
"MUL R2.xy, R1, R1;\n"
|
||||
"ADD R0.y, R2.x, R2;\n"
|
||||
"RSQ R0.y, R0.y;\n"
|
||||
"MUL R2.xy, R0.y, R1;\n"
|
||||
"MAD R3.xy, R2, c[0].zwzw, fragment.texcoord[0];\n"
|
||||
"ABS R0.z, R2.y;\n"
|
||||
"ABS R0.y, R2.x;\n"
|
||||
"MIN R0.y, R0, R0.z;\n"
|
||||
"RCP R0.y, R0.y;\n"
|
||||
"MUL R1.xy, R0.y, R2;\n"
|
||||
"MUL R1.xy, R1, c[2].x;\n"
|
||||
"MIN R1.xy, R1, c[2].w;\n"
|
||||
"TEX R4, R3, texture[0], 2D;\n"
|
||||
"MAD R2.xy, -R2, c[0].zwzw, fragment.texcoord[0];\n"
|
||||
"TEX R3, R2, texture[0], 2D;\n"
|
||||
"ADD R3, R3, R4;\n"
|
||||
"MAX R1.xy, R1, c[2].z;\n"
|
||||
"MAD R2.xy, R1, c[1].zwzw, fragment.texcoord[0];\n"
|
||||
"MUL R5, R3, c[3].y;\n"
|
||||
"MAD R1.xy, -R1, c[1].zwzw, fragment.texcoord[0];\n"
|
||||
"MIN R0.z, R0.x, R2.w;\n"
|
||||
"MIN R0.y, R0.w, R1.w;\n"
|
||||
"MIN R0.y, R0, R0.z;\n"
|
||||
"MAX R0.z, R0.x, R2.w;\n"
|
||||
"MAX R0.x, R0.w, R1.w;\n"
|
||||
"MAX R0.x, R0, R0.z;\n"
|
||||
"TEX R4, R2, texture[0], 2D;\n"
|
||||
"TEX R3, R1, texture[0], 2D;\n"
|
||||
"ADD R3, R3, R4;\n"
|
||||
"MAD R3, R3, c[3].y, R5;\n"
|
||||
"MUL R3, R3, c[3].y;\n"
|
||||
"SLT R0.z, R0.x, R3.w;\n"
|
||||
"SLT R0.x, R3.w, R0.y;\n"
|
||||
"ADD_SAT R0.x, R0, R0.z;\n"
|
||||
"CMP result.color, -R0.x, R5, R3;\n"
|
||||
"END\n";
|
||||
//# 45 instructions, 6 R-regs
|
||||
|
||||
const char *a_arbfp1_earlyexit =
|
||||
"!!ARBfp1.0\n"
|
||||
"OPTION ARB_precision_hint_fastest;\n"
|
||||
//"# cgc version 3.1.0013, build date Apr 18 2012\n"
|
||||
//"# command line args: -profile arbfp1\n"
|
||||
//"# source file: fxaa_fp.cg\n"
|
||||
//"#vendor NVIDIA Corporation\n"
|
||||
//"#version 3.1.0.13\n"
|
||||
//"#profile arbfp1\n"
|
||||
//"#program fxaa_fp\n"
|
||||
//"#semantic fxaa_fp.fxaaConsoleRcpFrameOpt\n"
|
||||
//"#semantic fxaa_fp.fxaaConsoleRcpFrameOpt2\n"
|
||||
//"#semantic fxaa_fp.nlTex0 : TEX0\n"
|
||||
//"#var float2 pos : $vin.TEXCOORD0 : TEX0 : 0 : 1\n"
|
||||
//"#var float4 fxaaConsolePosPos : $vin.TEXCOORD1 : TEX1 : 1 : 1\n"
|
||||
//"#var float4 fxaaConsoleRcpFrameOpt : : c[0] : 2 : 1\n"
|
||||
//"#var float4 fxaaConsoleRcpFrameOpt2 : : c[1] : 3 : 1\n"
|
||||
//"#var sampler2D nlTex0 : TEX0 : texunit 0 : 4 : 1\n"
|
||||
//"#var float4 oCol : $vout.COLOR : COL : 5 : 1\n"
|
||||
//"#const c[2] = 0.125 0 8 0.001953125\n"
|
||||
//"#const c[3] = -2 2 0.5\n"
|
||||
"PARAM c[4] = { program.env[0..1],\n"
|
||||
" { 0.125, 0, 8, 0.001953125 },\n"
|
||||
" { -2, 2, 0.5 } };\n"
|
||||
"TEMP R0;\n"
|
||||
"TEMP R1;\n"
|
||||
"TEMP R2;\n"
|
||||
"TEMP R3;\n"
|
||||
"TEMP R4;\n"
|
||||
"TEMP R5;\n"
|
||||
"TEX R0.w, fragment.texcoord[1].zyzw, texture[0], 2D;\n"
|
||||
"ADD R0.x, R0.w, c[2].w;\n"
|
||||
"TEX R1.w, fragment.texcoord[1].xwzw, texture[0], 2D;\n"
|
||||
"TEX R0.w, fragment.texcoord[1], texture[0], 2D;\n"
|
||||
"ADD R0.y, R1.w, -R0.x;\n"
|
||||
"ADD R0.z, R0.w, R0.y;\n"
|
||||
"TEX R2.w, fragment.texcoord[1].zwzw, texture[0], 2D;\n"
|
||||
"ADD R0.y, -R0.w, R0;\n"
|
||||
"ADD R1.z, -R2.w, R0;\n"
|
||||
"ADD R1.x, R2.w, R0.y;\n"
|
||||
"MOV R1.y, c[2];\n"
|
||||
"DP3 R0.y, R1, R1;\n"
|
||||
"RSQ R0.y, R0.y;\n"
|
||||
"MUL R2.xy, R0.y, R1.xzzw;\n"
|
||||
"MAD R3.xy, R2, c[0].zwzw, fragment.texcoord[0];\n"
|
||||
"ABS R0.z, R2.y;\n"
|
||||
"ABS R0.y, R2.x;\n"
|
||||
"MIN R0.y, R0, R0.z;\n"
|
||||
"RCP R0.y, R0.y;\n"
|
||||
"MUL R1.xy, R0.y, R2;\n"
|
||||
"MUL R1.xy, R1, c[2].x;\n"
|
||||
"MIN R1.xy, R1, c[3].y;\n"
|
||||
"MIN R0.y, R0.w, R1.w;\n"
|
||||
"TEX R4, R3, texture[0], 2D;\n"
|
||||
"MAD R2.xy, -R2, c[0].zwzw, fragment.texcoord[0];\n"
|
||||
"TEX R3, R2, texture[0], 2D;\n"
|
||||
"ADD R3, R3, R4;\n"
|
||||
"MAX R1.xy, R1, c[3].x;\n"
|
||||
"MAD R2.xy, R1, c[1].zwzw, fragment.texcoord[0];\n"
|
||||
"MAD R1.xy, -R1, c[1].zwzw, fragment.texcoord[0];\n"
|
||||
"MUL R5, R3, c[3].z;\n"
|
||||
"TEX R4, R2, texture[0], 2D;\n"
|
||||
"TEX R3, R1, texture[0], 2D;\n"
|
||||
"MIN R0.z, R0.x, R2.w;\n"
|
||||
"MIN R1.x, R0.y, R0.z;\n"
|
||||
"MAX R0.y, R0.x, R2.w;\n"
|
||||
"MAX R0.x, R0.w, R1.w;\n"
|
||||
"MAX R2.x, R0, R0.y;\n"
|
||||
"ADD R3, R3, R4;\n"
|
||||
"MAD R3, R3, c[3].z, R5;\n"
|
||||
"MUL R3, R3, c[3].z;\n"
|
||||
"SLT R1.z, R2.x, R3.w;\n"
|
||||
"SLT R1.y, R3.w, R1.x;\n"
|
||||
"TEX R0, fragment.texcoord[0], texture[0], 2D;\n"
|
||||
"ADD_SAT R1.y, R1, R1.z;\n"
|
||||
"MIN R1.z, R0.w, R1.x;\n"
|
||||
"MAX R1.x, R2, R0.w;\n"
|
||||
"ADD R2.y, R1.x, -R1.z;\n"
|
||||
"CMP R1, -R1.y, R5, R3;\n"
|
||||
"MAD R2.x, R2.y, c[2].z, -R2;\n"
|
||||
"CMP result.color, R2.x, R0, R1;\n"
|
||||
"END\n";
|
||||
//"# 51 instructions, 6 R-regs\n"
|
||||
|
||||
const char *a_ps_2_0_test_t0 =
|
||||
"ps_2_x\n"
|
||||
"dcl_2d s0\n"
|
||||
"dcl t0.xyz\n"
|
||||
"mov r0.xy, t0.xy\n"
|
||||
"texld r0, r0, s0\n"
|
||||
"mov oC0, r0\n";
|
||||
|
||||
const char *a_ps_2_0_test_avg =
|
||||
"ps_2_x\n"
|
||||
"dcl_2d s0\n"
|
||||
"def c0, 0.25000000, 0, 0, 0\n"
|
||||
"dcl t1\n"
|
||||
"mov r0.xy, t1.xwzw\n"
|
||||
"mov r1.xy, t1.zyzw\n"
|
||||
"texld r0, r0, s0\n"
|
||||
"texld r1, r1, s0\n"
|
||||
"add r2, r1, r0\n"
|
||||
"mov r0.xy, t1.zwzw\n"
|
||||
"texld r1, t1, s0\n"
|
||||
"texld r0, r0, s0\n"
|
||||
"add r1, r2, r1\n"
|
||||
"add r0, r1, r0\n"
|
||||
"mul r0, r0, c0.x\n"
|
||||
"mov oC0, r0\n";
|
||||
|
||||
const char *a_ps_2_0 =
|
||||
"ps_2_x\n"
|
||||
/*"// cgc version 3.1.0013, build date Apr 18 2012\n"
|
||||
"// command line args: -profile ps_2_x -O3 -fastmath -fastprecision\n"
|
||||
"// source file: fxaa_pp.cg\n"
|
||||
"//vendor NVIDIA Corporation\n"
|
||||
"//version 3.1.0.13\n"
|
||||
"//profile ps_2_x\n"
|
||||
"//program fxaa_pp\n"
|
||||
"//semantic fxaa_pp.fxaaQualityRcpFrame\n"
|
||||
"//semantic fxaa_pp.fxaaQualitySubpix\n"
|
||||
"//semantic fxaa_pp.fxaaQualityEdgeThreshold\n"
|
||||
"//semantic fxaa_pp.fxaaQualityEdgeThresholdMin\n"
|
||||
"//semantic fxaa_pp.nlTex0 : TEX0\n"
|
||||
"//var float2 pos : $vin.TEXCOORD0 : TEX0 : 0 : 1\n"
|
||||
"//var float2 fxaaQualityRcpFrame : : c[0] : 2 : 1\n"
|
||||
"//var float fxaaQualitySubpix : : c[1] : 3 : 1\n"
|
||||
"//var float fxaaQualityEdgeThreshold : : c[2] : 4 : 1\n"
|
||||
"//var float fxaaQualityEdgeThresholdMin : : c[3] : 5 : 1\n"
|
||||
"//var sampler2D nlTex0 : TEX0 : texunit 0 : 6 : 1\n"
|
||||
"//var float4 oCol : $vout.COLOR : COL : 7 : 1\n"
|
||||
"//const c[4] = 0 -1 1 -2\n"
|
||||
"//const c[5] = 2 0.5 0.25 1.5\n"
|
||||
"//const c[6] = 4 12 0.083333336\n"
|
||||
"//const c[7] = -2 3\n"*/
|
||||
"dcl_2d s0\n"
|
||||
"def c4, 0.00000000, -1.00000000, 1.00000000, -2.00000000\n"
|
||||
"def c5, 2.00000000, 0.50000000, 0.25000000, 1.50000000\n"
|
||||
"def c6, 4.00000000, 12.00000000, 0.08333334, 0\n"
|
||||
"def c7, -2.00000000, 3.00000000, 0, 0\n"
|
||||
"dcl t0.xy\n"
|
||||
"mov r0.zw, c0.xyxy\n"
|
||||
"mad r3.xy, c4.zxzw, r0.zwzw, t0\n"
|
||||
"texld r7, r3, s0\n"
|
||||
"texld r1, t0, s0\n"
|
||||
"mov r0.xy, c0\n"
|
||||
"mad r0.xy, c4.yxzw, r0, t0\n"
|
||||
"texld r8, r0, s0\n"
|
||||
"mov r0.xy, c0\n"
|
||||
"mad r0.xy, c4, r0, t0\n"
|
||||
"texld r9, r0, s0\n"
|
||||
"add r0.xy, t0, -c0\n"
|
||||
"texld r5, r0, s0\n"
|
||||
"mov r3.xy, c0\n"
|
||||
"mad r3.xy, c4.zyzw, r3, t0\n"
|
||||
"texld r3, r3, s0\n"
|
||||
"add r7.x, r8.y, r7.y\n"
|
||||
"mad r0.z, r1.y, c4.w, r7.x\n"
|
||||
"add r0.x, r5.y, r3.y\n"
|
||||
"mad r0.w, r9.y, c4, r0.x\n"
|
||||
"mov r0.xy, c0\n"
|
||||
"mad r0.xy, c4.xzzw, r0, t0\n"
|
||||
"texld r6, r0, s0\n"
|
||||
"add r5.x, r9.y, r6.y\n"
|
||||
"abs r0.z, r0\n"
|
||||
"abs r0.w, r0\n"
|
||||
"mad r3.x, r0.z, c5, r0.w\n"
|
||||
"mov r0.zw, c0.xyxy\n"
|
||||
"mad r4.xy, c4.yzzw, r0.zwzw, t0\n"
|
||||
"texld r4, r4, s0\n"
|
||||
"add r0.xy, t0, c0\n"
|
||||
"texld r0, r0, s0\n"
|
||||
"add r4.x, r5.y, r4.y\n"
|
||||
"add r5.y, r3, r0\n"
|
||||
"add r0.x, r4.y, r0.y\n"
|
||||
"mad r0.x, r6.y, c4.w, r0\n"
|
||||
"abs r0.x, r0\n"
|
||||
"add r0.w, r0.x, r3.x\n"
|
||||
"mad r0.x, r8.y, c4.w, r4\n"
|
||||
"mad r0.z, r7.y, c4.w, r5.y\n"
|
||||
"mad r0.y, r1, c4.w, r5.x\n"
|
||||
"abs r0.z, r0\n"
|
||||
"abs r0.y, r0\n"
|
||||
"mad r0.y, r0, c5.x, r0.z\n"
|
||||
"abs r0.x, r0\n"
|
||||
"add r0.x, r0, r0.y\n"
|
||||
"add r0.x, r0, -r0.w\n"
|
||||
"cmp r3.y, r0.x, c4.z, c4.x\n"
|
||||
"max r0.y, r6, r1\n"
|
||||
"max r0.z, r7.y, r0.y\n"
|
||||
"max r0.y, r9, r8\n"
|
||||
"max r0.y, r0, r0.z\n"
|
||||
"min r0.z, r6.y, r1.y\n"
|
||||
"min r0.w, r7.y, r0.z\n"
|
||||
"min r0.z, r9.y, r8.y\n"
|
||||
"min r0.z, r0, r0.w\n"
|
||||
"mul r3.x, r0.y, c2\n"
|
||||
"abs_pp r0.x, r3.y\n"
|
||||
"add r4.y, r0, -r0.z\n"
|
||||
"max r0.w, r3.x, c3.x\n"
|
||||
"add r4.z, r4.y, -r0.w\n"
|
||||
"cmp_pp r4.w, r4.z, c4.z, c4.x\n"
|
||||
"mul_pp r5.w, r4, r3.y\n"
|
||||
"cmp_pp r0.y, -r0.x, c4.z, c4.x\n"
|
||||
"mul_pp r5.z, r4.w, r0.y\n"
|
||||
"cmp_pp r3.x, -r0, c4, c4.z\n"
|
||||
"cmp r6.w, -r5.z, r6.y, r7.y\n"
|
||||
"cmp r7.w, -r5.z, r9.y, r8.y\n"
|
||||
"add r0.z, -r1.y, r6.w\n"
|
||||
"add r0.y, -r1, r7.w\n"
|
||||
"abs r9.z, r0\n"
|
||||
"abs r7.y, r0\n"
|
||||
"add r0.y, r7, -r9.z\n"
|
||||
"cmp r0.y, r0, c4.z, c4.x\n"
|
||||
"max r7.y, r7, r9.z\n"
|
||||
"mul_pp r0.z, r4.w, r0.y\n"
|
||||
"cmp r0.w, -r5, c0.x, c0.y\n"
|
||||
"cmp r6.x, -r0.z, r0.w, -r0.w\n"
|
||||
"mov r0.z, c0.y\n"
|
||||
"cmp r6.y, -r5.z, c4.x, r0.z\n"
|
||||
"mad r0.w, r6.x, c5.y, t0.y\n"
|
||||
"cmp r0.z, -r5.w, t0.y, r0.w\n"
|
||||
"add r8.z, r0, r6.y\n"
|
||||
"add r7.z, r0, -r6.y\n"
|
||||
"mov r9.y, r7.z\n"
|
||||
"mov r8.y, r8.z\n"
|
||||
"mad r0.w, r6.x, c5.y, t0.x\n"
|
||||
"mov r0.x, c0\n"
|
||||
"mul_pp r3.x, r4.w, r3\n"
|
||||
"cmp r6.z, -r3.x, c4.x, r0.x\n"
|
||||
"cmp r0.x, -r5.z, t0, r0.w\n"
|
||||
"add r9.x, r0, -r6.z\n"
|
||||
"texld r3, r9, s0\n"
|
||||
"add r8.x, r0, r6.z\n"
|
||||
"abs_pp r3.x, r0.y\n"
|
||||
"texld r0, r8, s0\n"
|
||||
"cmp_pp r0.x, -r3, c4.z, c4\n"
|
||||
"add r0.w, r1.y, r6\n"
|
||||
"add r0.z, r1.y, r7.w\n"
|
||||
"mul_pp r0.x, r4.w, r0\n"
|
||||
"cmp r6.w, -r0.x, r0.z, r0\n"
|
||||
"mad r7.w, -r6, c5.y, r0.y\n"
|
||||
"mad r8.w, -r6, c5.y, r3.y\n"
|
||||
"abs r0.y, r7.w\n"
|
||||
"abs r0.x, r8.w\n"
|
||||
"mad r0.x, -r7.y, c5.z, r0\n"
|
||||
"mad r0.y, -r7, c5.z, r0\n"
|
||||
"cmp r0.x, r0, c4.z, c4\n"
|
||||
"abs_pp r0.x, r0\n"
|
||||
"cmp_pp r9.z, -r0.x, c4, c4.x\n"
|
||||
"cmp r0.y, r0, c4.z, c4.x\n"
|
||||
"abs_pp r0.y, r0\n"
|
||||
"cmp_pp r9.w, -r0.y, c4.z, c4.x\n"
|
||||
"mul_pp r0.x, r4.w, r9.z\n"
|
||||
"mad r0.y, -r6, c5.w, r7.z\n"
|
||||
"cmp r7.z, -r0.x, r7, r0.y\n"
|
||||
"mad r0.z, -r6, c5.w, r9.x\n"
|
||||
"cmp r9.x, -r0, r9, r0.z\n"
|
||||
"mov r9.y, r7.z\n"
|
||||
"texld r3, r9, s0\n"
|
||||
"add_pp_sat r3.z, r9, r9.w\n"
|
||||
"mul_pp r0.x, r4.w, r9.w\n"
|
||||
"mad r0.y, r6, c5.w, r8.z\n"
|
||||
"cmp r3.x, -r0, r8.z, r0.y\n"
|
||||
"mad r0.z, r6, c5.w, r8.x\n"
|
||||
"mul_pp r8.z, r4.w, r3\n"
|
||||
"cmp r8.x, -r0, r8, r0.z\n"
|
||||
"mov r8.y, r3.x\n"
|
||||
"texld r0, r8, s0\n"
|
||||
"mul_pp r0.w, r8.z, r9\n"
|
||||
"cmp r3.z, -r0.w, r7.w, r0.y\n"
|
||||
"mul_pp r0.x, r8.z, r9.z\n"
|
||||
"cmp r0.y, -r0.x, r8.w, r3\n"
|
||||
"mad r0.z, -r6.w, c5.y, r0.y\n"
|
||||
"cmp r8.w, -r0.x, r0.y, r0.z\n"
|
||||
"mad r3.y, -r6.w, c5, r3.z\n"
|
||||
"cmp r9.w, -r0, r3.z, r3.y\n"
|
||||
"abs r0.y, r9.w\n"
|
||||
"abs r0.x, r8.w\n"
|
||||
"mad r0.y, -r7, c5.z, r0\n"
|
||||
"mad r0.x, -r7.y, c5.z, r0\n"
|
||||
"cmp r0.y, r0, c4.z, c4.x\n"
|
||||
"abs_pp r0.y, r0\n"
|
||||
"cmp_pp r10.x, -r0.y, c4.z, c4\n"
|
||||
"cmp r0.x, r0, c4.z, c4\n"
|
||||
"abs_pp r0.x, r0\n"
|
||||
"cmp_pp r9.z, -r0.x, c4, c4.x\n"
|
||||
"mul_pp r0.x, r8.z, r10\n"
|
||||
"mad r0.y, r6, c5.x, r3.x\n"
|
||||
"cmp r7.w, -r0.x, r3.x, r0.y\n"
|
||||
"mad r0.z, r6, c5.x, r8.x\n"
|
||||
"cmp r8.x, -r0, r8, r0.z\n"
|
||||
"mov r8.y, r7.w\n"
|
||||
"texld r0, r8, s0\n"
|
||||
"mul_pp r0.w, r8.z, r9.z\n"
|
||||
"mad r3.x, -r6.z, c5, r9\n"
|
||||
"mad r0.x, -r6.y, c5, r7.z\n"
|
||||
"cmp r0.x, -r0.w, r7.z, r0\n"
|
||||
"add_pp_sat r0.z, r9, r10.x\n"
|
||||
"mul_pp r7.z, r8, r0\n"
|
||||
"cmp r9.x, -r0.w, r9, r3\n"
|
||||
"mov r9.y, r0.x\n"
|
||||
"texld r3, r9, s0\n"
|
||||
"mul_pp r0.z, r7, r9\n"
|
||||
"cmp r0.w, -r0.z, r8, r3.y\n"
|
||||
"mul_pp r3.x, r7.z, r10\n"
|
||||
"cmp r3.y, -r3.x, r9.w, r0\n"
|
||||
"mad r0.y, -r6.w, c5, r0.w\n"
|
||||
"cmp r8.z, -r0, r0.w, r0.y\n"
|
||||
"mad r3.z, -r6.w, c5.y, r3.y\n"
|
||||
"cmp r9.z, -r3.x, r3.y, r3\n"
|
||||
"abs r0.y, r8.z\n"
|
||||
"abs r0.z, r9\n"
|
||||
"mad r0.y, -r7, c5.z, r0\n"
|
||||
"mad r0.z, -r7.y, c5, r0\n"
|
||||
"cmp r0.y, r0, c4.z, c4.x\n"
|
||||
"abs_pp r0.y, r0\n"
|
||||
"cmp_pp r8.w, -r0.y, c4.z, c4.x\n"
|
||||
"cmp r0.z, r0, c4, c4.x\n"
|
||||
"abs_pp r0.z, r0\n"
|
||||
"cmp_pp r9.w, -r0.z, c4.z, c4.x\n"
|
||||
"mul_pp r0.y, r7.z, r8.w\n"
|
||||
"mad r0.z, -r6.y, c6.x, r0.x\n"
|
||||
"cmp r10.x, -r0.y, r0, r0.z\n"
|
||||
"mad r0.w, -r6.z, c6.x, r9.x\n"
|
||||
"cmp r9.x, -r0.y, r9, r0.w\n"
|
||||
"mov r9.y, r10.x\n"
|
||||
"texld r3, r9, s0\n"
|
||||
"mul_pp r0.x, r7.z, r9.w\n"
|
||||
"mad r0.z, r6, c6.x, r8.x\n"
|
||||
"mad r0.y, r6, c6.x, r7.w\n"
|
||||
"cmp r3.x, -r0, r7.w, r0.y\n"
|
||||
"cmp r8.x, -r0, r8, r0.z\n"
|
||||
"mov r8.y, r3.x\n"
|
||||
"texld r0, r8, s0\n"
|
||||
"add_pp_sat r3.z, r8.w, r9.w\n"
|
||||
"mul_pp r0.x, r7.z, r3.z\n"
|
||||
"mul_pp r3.z, r0.x, r9.w\n"
|
||||
"cmp r0.y, -r3.z, r9.z, r0\n"
|
||||
"mul_pp r0.z, r0.x, r8.w\n"
|
||||
"cmp r0.w, -r0.z, r8.z, r3.y\n"
|
||||
"mad r3.w, -r6, c5.y, r0.y\n"
|
||||
"cmp r0.y, -r3.z, r0, r3.w\n"
|
||||
"mad r3.y, -r6.w, c5, r0.w\n"
|
||||
"cmp r0.z, -r0, r0.w, r3.y\n"
|
||||
"abs r3.y, r0\n"
|
||||
"abs r0.w, r0.z\n"
|
||||
"mad r3.y, -r7, c5.z, r3\n"
|
||||
"mad r0.w, -r7.y, c5.z, r0\n"
|
||||
"cmp r3.y, r3, c4.z, c4.x\n"
|
||||
"abs_pp r3.y, r3\n"
|
||||
"cmp r0.w, r0, c4.z, c4.x\n"
|
||||
"cmp_pp r3.z, -r3.y, c4, c4.x\n"
|
||||
"abs_pp r0.w, r0\n"
|
||||
"cmp_pp r3.y, -r0.w, c4.z, c4.x\n"
|
||||
"mul_pp r0.w, r0.x, r3.z\n"
|
||||
"mul_pp r0.x, r0, r3.y\n"
|
||||
"mad r3.w, r6.y, c6.y, r3.x\n"
|
||||
"cmp r3.x, -r0.w, r3, r3.w\n"
|
||||
"mad r3.z, r6, c6.y, r8.x\n"
|
||||
"cmp r0.w, -r0, r8.x, r3.z\n"
|
||||
"mad r3.y, -r6, c6, r10.x\n"
|
||||
"cmp r3.y, -r0.x, r10.x, r3\n"
|
||||
"add r3.x, -t0.y, r3\n"
|
||||
"add r0.w, -t0.x, r0\n"
|
||||
"cmp r0.w, -r5.z, r0, r3.x\n"
|
||||
"mad r3.x, -r6.z, c6.y, r9\n"
|
||||
"cmp r0.x, -r0, r9, r3\n"
|
||||
"add r3.x, t0.y, -r3.y\n"
|
||||
"add r0.x, t0, -r0\n"
|
||||
"cmp r0.x, -r5.z, r0, r3\n"
|
||||
"add r3.x, r0, -r0.w\n"
|
||||
"add r3.y, r0.x, r0.w\n"
|
||||
"cmp r3.x, r3, c4, c4.z\n"
|
||||
"abs_pp r3.x, r3\n"
|
||||
"min r0.x, r0, r0.w\n"
|
||||
"cmp_pp r3.x, -r3, c4.z, c4\n"
|
||||
"mul_pp r0.w, r4, r3.x\n"
|
||||
"rcp r3.y, r3.y\n"
|
||||
"mad r0.x, r0, -r3.y, c5.y\n"
|
||||
"cmp r3.y, r0, c4.x, c4.z\n"
|
||||
"mad r3.x, -r6.w, c5.y, r1.y\n"
|
||||
"cmp r3.x, r3, c4, c4.z\n"
|
||||
"cmp r0.y, r0.z, c4.x, c4.z\n"
|
||||
"add_pp r0.z, -r3.x, r3.y\n"
|
||||
"add_pp r0.y, r0, -r3.x\n"
|
||||
"abs_pp r0.y, r0\n"
|
||||
"abs_pp r0.z, r0\n"
|
||||
"cmp_pp r0.z, -r0, c4.x, c4\n"
|
||||
"cmp_pp r0.y, -r0, c4.x, c4.z\n"
|
||||
"cmp_pp r0.y, -r0.w, r0, r0.z\n"
|
||||
"abs_pp r0.y, r0\n"
|
||||
"cmp_pp r0.y, -r0, c4.z, c4.x\n"
|
||||
"mul_pp r0.y, r4.w, r0\n"
|
||||
"rcp r0.w, r4.y\n"
|
||||
"cmp r0.x, -r0.y, r0, c4\n"
|
||||
"add r3.y, r4.x, r5\n"
|
||||
"add r3.x, r5, r7\n"
|
||||
"mad r3.x, r3, c5, r3.y\n"
|
||||
"mad r0.z, r3.x, c6, -r1.y\n"
|
||||
"abs r0.z, r0\n"
|
||||
"mul_sat r0.z, r0, r0.w\n"
|
||||
"mul r0.w, r0.z, r0.z\n"
|
||||
"mad r0.z, r0, c7.x, c7.y\n"
|
||||
"mul r0.z, r0, r0.w\n"
|
||||
"mul r0.z, r0, r0\n"
|
||||
"mul r0.z, r0, c1.x\n"
|
||||
"max r0.x, r0, r0.z\n"
|
||||
"mad r0.y, r0.x, r6.x, t0\n"
|
||||
"mad r0.z, r0.x, r6.x, t0.x\n"
|
||||
"cmp r0.x, -r5.z, t0, r0.z\n"
|
||||
"cmp r0.y, -r5.w, t0, r0\n"
|
||||
"texld r0, r0, s0\n"
|
||||
"mov r0.w, r1.y\n"
|
||||
"cmp r1, r4.z, r2, r1\n"
|
||||
"cmp r0, -r4.w, r1, r0\n"
|
||||
"mov oC0, r0\n";
|
||||
|
||||
const char *a_ps_2_0_ps3 =
|
||||
"ps_2_0\n"
|
||||
// cgc version 3.1.0013, build date Apr 18 2012
|
||||
// command line args: -profile ps_2_0 -O3 -fastmath -fastprecision
|
||||
// source file: fxaa_pp.cg
|
||||
//vendor NVIDIA Corporation
|
||||
//version 3.1.0.13
|
||||
//profile ps_2_0
|
||||
//program fxaa_pp
|
||||
//semantic fxaa_pp.fxaaConsoleRcpFrameOpt
|
||||
//semantic fxaa_pp.fxaaConsoleRcpFrameOpt2
|
||||
//semantic fxaa_pp.nlTex0 : TEX0
|
||||
//var float2 pos : $vin.TEXCOORD0 : TEX0 : 0 : 1
|
||||
//var float4 fxaaConsolePosPos : $vin.TEXCOORD1 : TEX1 : 1 : 1
|
||||
//var float4 fxaaConsoleRcpFrameOpt : : c[0] : 2 : 1
|
||||
//var float4 fxaaConsoleRcpFrameOpt2 : : c[1] : 3 : 1
|
||||
//var sampler2D nlTex0 : TEX0 : texunit 0 : 4 : 1
|
||||
//var float4 oCol : $vout.COLOR : COL : 5 : 1
|
||||
//const c[2] = 0.001953125 0.125 2 -2
|
||||
//const c[3] = 0.5 0 1
|
||||
"dcl_2d s0\n"
|
||||
"def c2, 0.00195313, 0.12500000, 2.00000000, -2.00000000\n"
|
||||
"def c3, 0.50000000, 0.00000000, 1.00000000, 0\n"
|
||||
"dcl t1\n"
|
||||
"dcl t0.xy\n"
|
||||
"texld r5, t1, s0\n"
|
||||
"mov r1.y, t1.w\n"
|
||||
"mov r1.x, t1.z\n"
|
||||
"mov r2.xy, r1\n"
|
||||
"mov r0.y, t1.w\n"
|
||||
"mov r0.x, t1\n"
|
||||
"mov r1.y, t1\n"
|
||||
"mov r1.x, t1.z\n"
|
||||
"texld r1, r1, s0\n"
|
||||
"texld r0, r0, s0\n"
|
||||
"texld r6, r2, s0\n"
|
||||
"add r0.x, r1.w, c2\n"
|
||||
"add r2.x, -r0, r0.w\n"
|
||||
"add r1.x, r5.w, r2\n"
|
||||
"add r2.z, r1.x, -r6.w\n"
|
||||
"add r2.x, -r5.w, r2\n"
|
||||
"add r2.x, r6.w, r2\n"
|
||||
"mov r3.x, r2\n"
|
||||
"mov r3.y, r2.z\n"
|
||||
"mov r2.y, r2.z\n"
|
||||
"mov r1.y, r2.z\n"
|
||||
"mov r1.x, r2\n"
|
||||
"mul r1.xy, r3, r1\n"
|
||||
"add r1.x, r1, r1.y\n"
|
||||
"rsq r1.x, r1.x\n"
|
||||
"mul r4.xy, r1.x, r2\n"
|
||||
"abs r2.x, r4.y\n"
|
||||
"abs r1.x, r4\n"
|
||||
"min r1.x, r1, r2\n"
|
||||
"rcp r1.x, r1.x\n"
|
||||
"mul r1.xy, r1.x, r4\n"
|
||||
"mul r1.xy, r1, c2.y\n"
|
||||
"min r1.xy, r1, c2.z\n"
|
||||
"max r2.xy, r1, c2.w\n"
|
||||
"mov r1.y, c1.w\n"
|
||||
"mov r1.x, c1.z\n"
|
||||
"mad r3.xy, r2, r1, t0\n"
|
||||
"mov r1.y, c1.w\n"
|
||||
"mov r1.x, c1.z\n"
|
||||
"mad r5.xy, -r2, r1, t0\n"
|
||||
"mov r1.y, c0.w\n"
|
||||
"mov r1.x, c0.z\n"
|
||||
"mad r2.xy, -r4, r1, t0\n"
|
||||
"mov r1.y, c0.w\n"
|
||||
"mov r1.x, c0.z\n"
|
||||
"mad r1.xy, r4, r1, t0\n"
|
||||
"texld r4, r5, s0\n"
|
||||
"texld r3, r3, s0\n"
|
||||
"texld r1, r1, s0\n"
|
||||
"texld r2, r2, s0\n"
|
||||
"add r1, r2, r1\n"
|
||||
"mul r2, r1, c3.x\n"
|
||||
"add r1, r4, r3\n"
|
||||
"max r3.x, r0, r6.w\n"
|
||||
"mad r1, r1, c3.x, r2\n"
|
||||
"mul r4, r1, c3.x\n"
|
||||
"max r1.x, r0.w, r5.w\n"
|
||||
"max r1.x, r1, r3\n"
|
||||
"add r1.x, -r4.w, r1\n"
|
||||
"min r3.x, r0.w, r5.w\n"
|
||||
"min r0.x, r0, r6.w\n"
|
||||
"min r0.x, r3, r0\n"
|
||||
"add r0.x, r4.w, -r0\n"
|
||||
"cmp r1.x, r1, c3.y, c3.z\n"
|
||||
"cmp r0.x, r0, c3.y, c3.z\n"
|
||||
"add_pp_sat r0.x, r0, r1\n"
|
||||
"cmp r0, -r0.x, r4, r2\n"
|
||||
"mov oC0, r0\n";
|
||||
|
||||
const char *a_ps_2_0_earlyexit =
|
||||
"ps_2_x\n"
|
||||
// cgc version 3.1.0013, build date Apr 18 2012
|
||||
// command line args: -profile ps_2_x
|
||||
// source file: fxaa_fp.cg
|
||||
//vendor NVIDIA Corporation
|
||||
//version 3.1.0.13
|
||||
//profile ps_2_x
|
||||
//program fxaa_fp
|
||||
//semantic fxaa_fp.fxaaConsoleRcpFrameOpt
|
||||
//semantic fxaa_fp.fxaaConsoleRcpFrameOpt2
|
||||
//semantic fxaa_fp.nlTex0 : TEX0
|
||||
//var float2 pos : $vin.TEXCOORD0 : TEX0 : 0 : 1
|
||||
//var float4 fxaaConsolePosPos : $vin.TEXCOORD1 : TEX1 : 1 : 1
|
||||
//var float4 fxaaConsoleRcpFrameOpt : : c[0] : 2 : 1
|
||||
//var float4 fxaaConsoleRcpFrameOpt2 : : c[1] : 3 : 1
|
||||
//var sampler2D nlTex0 : TEX0 : texunit 0 : 4 : 1
|
||||
//var float4 oCol : $vout.COLOR : COL : 5 : 1
|
||||
//const c[2] = 0.001953125 0 0.125 2
|
||||
//const c[3] = -2 0.5 0 1
|
||||
//const c[4] = 8
|
||||
"dcl_2d s0\n"
|
||||
"def c2, 0.00195313, 0.00000000, 0.12500000, 2.00000000\n"
|
||||
"def c3, -2.00000000, 0.50000000, 0.00000000, 1.00000000\n"
|
||||
"def c4, 8.00000000, 0, 0, 0\n"
|
||||
"dcl t1\n"
|
||||
"dcl t0.xy\n"
|
||||
"mov r0.xy, t1.zyzw\n"
|
||||
"texld r0, r0, s0\n"
|
||||
"mov r0.xy, t1.xwzw\n"
|
||||
"texld r5, t1, s0\n"
|
||||
"texld r4, r0, s0\n"
|
||||
"add r4.x, r0.w, c2\n"
|
||||
"mov r0.xy, t1.zwzw\n"
|
||||
"texld r3, r0, s0\n"
|
||||
"add r0.w, r4, -r4.x\n"
|
||||
"add r0.x, r5.w, r0.w\n"
|
||||
"add r0.z, -r3.w, r0.x\n"
|
||||
"add r0.x, -r5.w, r0.w\n"
|
||||
"add r0.x, r3.w, r0\n"
|
||||
"mov r0.y, c2\n"
|
||||
"dp3 r0.y, r0, r0\n"
|
||||
"rsq r0.y, r0.y\n"
|
||||
"mul r0.zw, r0.y, r0.xyxz\n"
|
||||
"mad r1.xy, -r0.zwzw, c0.zwzw, t0\n"
|
||||
"texld r1, r1, s0\n"
|
||||
"abs r0.y, r0.w\n"
|
||||
"abs r0.x, r0.z\n"
|
||||
"min r0.x, r0, r0.y\n"
|
||||
"rcp r0.x, r0.x\n"
|
||||
"mul r0.xy, r0.x, r0.zwzw\n"
|
||||
"mul r0.xy, r0, c2.z\n"
|
||||
"min r2.xy, r0, c2.w\n"
|
||||
"mad r0.xy, r0.zwzw, c0.zwzw, t0\n"
|
||||
"texld r0, r0, s0\n"
|
||||
"add r0, r1, r0\n"
|
||||
"max r1.xy, r2, c3.x\n"
|
||||
"mul r2, r0, c3.y\n"
|
||||
"mad r0.xy, r1, c1.zwzw, t0\n"
|
||||
"mad r1.xy, -r1, c1.zwzw, t0\n"
|
||||
"texld r0, r0, s0\n"
|
||||
"texld r1, r1, s0\n"
|
||||
"add r0, r1, r0\n"
|
||||
"mad r0, r0, c3.y, r2\n"
|
||||
"mul r1, r0, c3.y\n"
|
||||
"min r0.y, r4.x, r3.w\n"
|
||||
"min r0.x, r5.w, r4.w\n"
|
||||
"min r3.y, r0.x, r0\n"
|
||||
"add r0.x, -r3.y, r1.w\n"
|
||||
"max r0.z, r4.x, r3.w\n"
|
||||
"max r0.y, r5.w, r4.w\n"
|
||||
"max r3.x, r0.y, r0.z\n"
|
||||
"cmp r3.z, r0.x, c3, c3.w\n"
|
||||
"add r3.w, r3.x, -r1\n"
|
||||
"cmp r3.w, r3, c3.z, c3\n"
|
||||
"add_pp_sat r3.z, r3, r3.w\n"
|
||||
"texld r0, t0, s0\n"
|
||||
"min r3.w, r0, r3.y\n"
|
||||
"max r3.y, r3.x, r0.w\n"
|
||||
"cmp r1, -r3.z, r1, r2\n"
|
||||
"add r3.y, r3, -r3.w\n"
|
||||
"mad r2.x, r3.y, c4, -r3\n"
|
||||
"cmp r0, r2.x, r1, r0\n"
|
||||
"mov oC0, r0\n";
|
@ -0,0 +1,162 @@
|
||||
/**
|
||||
* \file render_target_manager.cpp
|
||||
* \brief CRenderTargetManager
|
||||
* \date 2014-07-30 21:30GMT
|
||||
* \author Jan Boon (Kaetemi)
|
||||
* CRenderTargetManager
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2014 by authors
|
||||
*
|
||||
* This file is part of NL3D.
|
||||
* NL3D is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* NL3D is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General
|
||||
* Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with NL3D. If not, see
|
||||
* <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <nel/misc/types_nl.h>
|
||||
#include <nel/3d/render_target_manager.h>
|
||||
|
||||
// STL includes
|
||||
#include <sstream>
|
||||
|
||||
// NeL includes
|
||||
// #include <nel/misc/debug.h>
|
||||
#include <nel/3d/u_camera.h>
|
||||
#include <nel/3d/u_driver.h>
|
||||
#include <nel/3d/material.h>
|
||||
#include <nel/3d/texture_bloom.h>
|
||||
#include <nel/3d/texture_user.h>
|
||||
#include <nel/3d/driver_user.h>
|
||||
#include <nel/3d/u_texture.h>
|
||||
|
||||
// Project includes
|
||||
|
||||
using namespace std;
|
||||
// using namespace NLMISC;
|
||||
|
||||
namespace NL3D {
|
||||
|
||||
struct CRenderTargetDescInt
|
||||
{
|
||||
public:
|
||||
// Options
|
||||
uint Width;
|
||||
uint Height;
|
||||
bool Mode2D;
|
||||
UTexture::TUploadFormat Format;
|
||||
|
||||
// Data
|
||||
NL3D::CTextureUser *TextureUser;
|
||||
NLMISC::CSmartPtr<NL3D::ITexture> TextureInterface;
|
||||
bool InUse;
|
||||
bool Used;
|
||||
};
|
||||
|
||||
CRenderTargetManager::CRenderTargetManager() : m_Driver(NULL)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
CRenderTargetManager::~CRenderTargetManager()
|
||||
{
|
||||
// Call twice to reset counters and cleanup
|
||||
cleanup();
|
||||
cleanup();
|
||||
}
|
||||
|
||||
NL3D::CTextureUser *CRenderTargetManager::getRenderTarget(uint width, uint height, bool mode2D, UTexture::TUploadFormat format)
|
||||
{
|
||||
// Find or create a render target, short loop so no real optimization
|
||||
for (std::vector<CRenderTargetDescInt *>::iterator it(m_RenderTargets.begin()), end(m_RenderTargets.end()); it != end; ++it)
|
||||
{
|
||||
CRenderTargetDescInt *desc = *it;
|
||||
if (!desc->InUse && desc->Width == width && desc->Height == height && desc->Mode2D == mode2D && desc->Format == format)
|
||||
{
|
||||
desc->InUse = true;
|
||||
desc->Used = true;
|
||||
return desc->TextureUser;
|
||||
}
|
||||
}
|
||||
|
||||
nldebug("3D: Create new render target (%u x %u)", width, height);
|
||||
NL3D::IDriver *drvInternal = (static_cast<CDriverUser *>(m_Driver))->getDriver();
|
||||
CRenderTargetDescInt *desc = new CRenderTargetDescInt();
|
||||
CTextureBloom *tex = new CTextureBloom(); // LOL
|
||||
tex->mode2D(mode2D);
|
||||
desc->TextureInterface = tex;
|
||||
desc->TextureInterface->setRenderTarget(true);
|
||||
desc->TextureInterface->setReleasable(false);
|
||||
desc->TextureInterface->setUploadFormat((ITexture::TUploadFormat)(uint32)format);
|
||||
desc->TextureInterface->resize(width, height);
|
||||
desc->TextureInterface->setFilterMode(ITexture::Linear, ITexture::LinearMipMapOff);
|
||||
desc->TextureInterface->setWrapS(ITexture::Clamp);
|
||||
desc->TextureInterface->setWrapT(ITexture::Clamp);
|
||||
drvInternal->setupTexture(*desc->TextureInterface);
|
||||
desc->TextureUser = new CTextureUser(desc->TextureInterface);
|
||||
nlassert(!drvInternal->isTextureRectangle(desc->TextureInterface)); // Not allowed, we only support NPOT for render targets now.
|
||||
desc->Width = width;
|
||||
desc->Height = height;
|
||||
desc->Mode2D = mode2D;
|
||||
desc->Format = format;
|
||||
desc->Used = true;
|
||||
desc->InUse = true;
|
||||
m_RenderTargets.push_back(desc);
|
||||
return desc->TextureUser;
|
||||
}
|
||||
|
||||
void CRenderTargetManager::recycleRenderTarget(NL3D::CTextureUser *renderTarget)
|
||||
{
|
||||
for (std::vector<CRenderTargetDescInt *>::iterator it(m_RenderTargets.begin()), end(m_RenderTargets.end()); it != end; ++it)
|
||||
{
|
||||
CRenderTargetDescInt *desc = *it;
|
||||
if (desc->TextureUser == renderTarget)
|
||||
{
|
||||
desc->InUse = false;
|
||||
return;
|
||||
}
|
||||
}
|
||||
nlerror("3D: Render target not found");
|
||||
}
|
||||
|
||||
void CRenderTargetManager::cleanup()
|
||||
{
|
||||
for (sint i = 0; i < (sint)m_RenderTargets.size(); ++i)
|
||||
{
|
||||
CRenderTargetDescInt *desc = m_RenderTargets[i];
|
||||
nlassert(!desc->InUse); // Assert for debugging, to not allow textures being carried over between frames. Optional assert
|
||||
if (!desc->InUse)
|
||||
{
|
||||
if (!desc->Used)
|
||||
{
|
||||
// No longer in use
|
||||
nldebug("3D: Release render target (%u x %u)", desc->Width, desc->Height);
|
||||
delete desc->TextureUser;
|
||||
desc->TextureUser = NULL;
|
||||
desc->TextureInterface = NULL; // CSmartPtr
|
||||
m_RenderTargets.erase(m_RenderTargets.begin() + i);
|
||||
--i;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Flag for next round
|
||||
desc->Used = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} /* namespace NL3D */
|
||||
|
||||
/* end of file */
|
@ -0,0 +1,3 @@
|
||||
cgc -entry fxaa_pp fxaa_pp.cg -profile arbfp1 -O3 -fastmath -fastprecision -o fxaa_pp_arbfp1.txt
|
||||
cgc -entry fxaa_pp fxaa_pp.cg -profile ps_2_x -O3 -fastmath -fastprecision -o fxaa_pp_ps_2_0.txt
|
||||
cgc -entry fxaa_vp fxaa_vp.cg -profile arbvp1 -fastmath -fastprecision -o fxaa_vp_arbvp1.txt
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,91 @@
|
||||
|
||||
#define FXAA_PC 1
|
||||
#define FXAA_HLSL_3 1
|
||||
#define FXAA_QUALITY__PRESET 12
|
||||
#define FXAA_EARLY_EXIT 0
|
||||
#define FXAA_GREEN_AS_LUMA 1
|
||||
|
||||
#define h4tex2Dlod tex2Dlod
|
||||
#define half4 float4
|
||||
#define half3 float3
|
||||
#define half2 float2
|
||||
#define half float
|
||||
|
||||
#include "fxaa3_11.h"
|
||||
|
||||
void fxaa_pp(
|
||||
// Per fragment parameters
|
||||
float2 pos : TEXCOORD0,
|
||||
#if (FXAA_PS3 == 1)
|
||||
float4 fxaaConsolePosPos : TEXCOORD1,
|
||||
#endif
|
||||
|
||||
// Fragment program constants
|
||||
#if (FXAA_PC == 1)
|
||||
uniform float2 fxaaQualityRcpFrame,
|
||||
uniform float fxaaQualitySubpix,
|
||||
uniform float fxaaQualityEdgeThreshold,
|
||||
uniform float fxaaQualityEdgeThresholdMin,
|
||||
#else
|
||||
uniform float4 fxaaConsoleRcpFrameOpt,
|
||||
uniform float4 fxaaConsoleRcpFrameOpt2,
|
||||
#endif
|
||||
uniform sampler2D nlTex0 : TEX0,
|
||||
|
||||
// Output color
|
||||
out float4 oCol : COLOR
|
||||
)
|
||||
{
|
||||
#if (FXAA_PC == 1)
|
||||
oCol = FxaaPixelShader(
|
||||
pos,
|
||||
nlTex0,
|
||||
fxaaQualityRcpFrame,
|
||||
fxaaQualitySubpix,
|
||||
fxaaQualityEdgeThreshold,
|
||||
fxaaQualityEdgeThresholdMin
|
||||
);
|
||||
#else
|
||||
oCol = FxaaPixelShader(
|
||||
pos,
|
||||
fxaaConsolePosPos,
|
||||
nlTex0,
|
||||
fxaaConsoleRcpFrameOpt,
|
||||
fxaaConsoleRcpFrameOpt2
|
||||
);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
Have FXAA vertex shader run as a full screen triangle,
|
||||
and output "pos" and "fxaaConsolePosPos"
|
||||
such that inputs in the pixel shader provide,
|
||||
|
||||
// {xy} = center of pixel
|
||||
FxaaFloat2 pos,
|
||||
|
||||
// {xy__} = upper left of pixel
|
||||
// {__zw} = lower right of pixel
|
||||
FxaaFloat4 fxaaConsolePosPos,
|
||||
*/
|
||||
|
||||
// fxaaConsoleRcpFrameOpt:
|
||||
// Only used on FXAA Console.
|
||||
// This must be from a constant/uniform.
|
||||
// This effects sub-pixel AA quality and inversely sharpness.
|
||||
// Where N ranges between,
|
||||
// N = 0.50 (default)
|
||||
// N = 0.33 (sharper)
|
||||
// {x___} = -N/screenWidthInPixels
|
||||
// {_y__} = -N/screenHeightInPixels
|
||||
// {__z_} = N/screenWidthInPixels
|
||||
// {___w} = N/screenHeightInPixels
|
||||
|
||||
// fxaaConsoleRcpFrameOpt2:
|
||||
// Only used on FXAA Console.
|
||||
// Not used on 360, but used on PS3 and PC.
|
||||
// This must be from a constant/uniform.
|
||||
// {x___} = -2.0/screenWidthInPixels
|
||||
// {_y__} = -2.0/screenHeightInPixels
|
||||
// {__z_} = 2.0/screenWidthInPixels
|
||||
// {___w} = 2.0/screenHeightInPixels
|
@ -0,0 +1,300 @@
|
||||
!!ARBfp1.0
|
||||
OPTION ARB_precision_hint_fastest;
|
||||
# cgc version 3.1.0013, build date Apr 18 2012
|
||||
# command line args: -profile arbfp1 -O3 -fastmath -fastprecision
|
||||
# source file: fxaa_pp.cg
|
||||
#vendor NVIDIA Corporation
|
||||
#version 3.1.0.13
|
||||
#profile arbfp1
|
||||
#program fxaa_pp
|
||||
#semantic fxaa_pp.fxaaQualityRcpFrame
|
||||
#semantic fxaa_pp.fxaaQualitySubpix
|
||||
#semantic fxaa_pp.fxaaQualityEdgeThreshold
|
||||
#semantic fxaa_pp.fxaaQualityEdgeThresholdMin
|
||||
#semantic fxaa_pp.nlTex0 : TEX0
|
||||
#var float2 pos : $vin.TEXCOORD0 : TEX0 : 0 : 1
|
||||
#var float2 fxaaQualityRcpFrame : : c[0] : 1 : 1
|
||||
#var float fxaaQualitySubpix : : c[1] : 2 : 1
|
||||
#var float fxaaQualityEdgeThreshold : : c[2] : 3 : 1
|
||||
#var float fxaaQualityEdgeThresholdMin : : c[3] : 4 : 1
|
||||
#var sampler2D nlTex0 : TEX0 : texunit 0 : 5 : 1
|
||||
#var float4 oCol : $vout.COLOR : COL : 6 : 1
|
||||
#const c[4] = 0 -1 1 -2
|
||||
#const c[5] = 2 0.5 0.25 1.5
|
||||
#const c[6] = 4 12 0.083333336 3
|
||||
PARAM c[7] = { program.local[0..3],
|
||||
{ 0, -1, 1, -2 },
|
||||
{ 2, 0.5, 0.25, 1.5 },
|
||||
{ 4, 12, 0.083333336, 3 } };
|
||||
TEMP R0;
|
||||
TEMP R1;
|
||||
TEMP R2;
|
||||
TEMP R3;
|
||||
TEMP R4;
|
||||
TEMP R5;
|
||||
TEMP R6;
|
||||
TEMP R7;
|
||||
TEMP R8;
|
||||
TEMP R9;
|
||||
MOV R3.xyz, c[4];
|
||||
MAD R2.zw, R3.xyyz, c[0].xyxy, fragment.texcoord[0].xyxy;
|
||||
MAD R0.xy, R3, c[0], fragment.texcoord[0];
|
||||
MAD R1.xy, R3.zyzw, c[0], fragment.texcoord[0];
|
||||
TEX R5.y, R1, texture[0], 2D;
|
||||
MAD R1.xy, R3.zxzw, c[0], fragment.texcoord[0];
|
||||
ADD R0.zw, fragment.texcoord[0].xyxy, -c[0].xyxy;
|
||||
TEX R4.y, R0.zwzw, texture[0], 2D;
|
||||
TEX R6.y, R2.zwzw, texture[0], 2D;
|
||||
TEX R8, fragment.texcoord[0], texture[0], 2D;
|
||||
TEX R1.y, R1, texture[0], 2D;
|
||||
TEX R0.y, R0, texture[0], 2D;
|
||||
ADD R0.z, R4.y, R5.y;
|
||||
MAD R1.z, R0.y, c[4].w, R0;
|
||||
MAD R0.zw, R3.xyyx, c[0].xyxy, fragment.texcoord[0].xyxy;
|
||||
TEX R2.y, R0.zwzw, texture[0], 2D;
|
||||
ADD R0.x, R2.y, R1.y;
|
||||
ABS R0.w, R1.z;
|
||||
ADD R1.zw, fragment.texcoord[0].xyxy, c[0].xyxy;
|
||||
TEX R7.y, R1.zwzw, texture[0], 2D;
|
||||
MAD R0.z, R8.y, c[4].w, R0.x;
|
||||
ABS R0.z, R0;
|
||||
MAD R2.x, R0.z, c[5], R0.w;
|
||||
MAD R0.zw, R3.xyxz, c[0].xyxy, fragment.texcoord[0].xyxy;
|
||||
TEX R3.y, R0.zwzw, texture[0], 2D;
|
||||
ADD R0.z, R0.y, R3.y;
|
||||
ADD R1.x, R6.y, R7.y;
|
||||
MAD R0.w, R3.y, c[4], R1.x;
|
||||
MAD R1.x, R8.y, c[4].w, R0.z;
|
||||
ABS R0.w, R0;
|
||||
ADD R2.x, R0.w, R2;
|
||||
ADD R2.w, R4.y, R6.y;
|
||||
ADD R0.w, R5.y, R7.y;
|
||||
ABS R1.z, R1.x;
|
||||
MAD R1.x, R1.y, c[4].w, R0.w;
|
||||
ABS R1.w, R1.x;
|
||||
MAD R1.x, R2.y, c[4].w, R2.w;
|
||||
MAD R1.z, R1, c[5].x, R1.w;
|
||||
ABS R1.x, R1;
|
||||
ADD R1.x, R1, R1.z;
|
||||
SGE R4.x, R1, R2;
|
||||
MAX R1.x, R3.y, R8.y;
|
||||
MAX R1.z, R1.y, R1.x;
|
||||
MAX R1.x, R0.y, R2.y;
|
||||
MAX R1.x, R1, R1.z;
|
||||
MIN R1.z, R3.y, R8.y;
|
||||
MIN R1.w, R1.y, R1.z;
|
||||
MIN R1.z, R0.y, R2.y;
|
||||
MIN R1.z, R1, R1.w;
|
||||
MUL R2.x, R1, c[2];
|
||||
ADD R3.z, R1.x, -R1;
|
||||
ABS R3.w, R4.x;
|
||||
MAX R1.w, R2.x, c[3].x;
|
||||
ADD R2.z, R3, -R1.w;
|
||||
CMP R2.x, R2.z, c[4], c[4].z;
|
||||
CMP R1.x, -R3.w, c[4], c[4].z;
|
||||
MUL R3.w, R2.x, R1.x;
|
||||
CMP R1.z, -R3.w, R1.y, R3.y;
|
||||
ADD R1.y, -R8, R1.z;
|
||||
CMP R1.w, -R3, R2.y, R0.y;
|
||||
ADD R0.y, -R8, R1.w;
|
||||
MUL R4.x, R2, R4;
|
||||
CMP R3.y, -R3.w, c[0], R3.x;
|
||||
ABS R4.w, R1.y;
|
||||
ABS R4.z, R0.y;
|
||||
SGE R0.y, R4.z, R4.w;
|
||||
MUL R1.y, R2.x, R0;
|
||||
ABS R0.y, R0;
|
||||
CMP R4.y, -R0, c[4].x, c[4].z;
|
||||
ABS R0.y, R1.x;
|
||||
CMP R0.y, -R0, c[4].x, c[4].z;
|
||||
MUL R1.x, R2, R0.y;
|
||||
CMP R2.y, -R4.x, c[0], c[0].x;
|
||||
CMP R2.y, -R1, -R2, R2;
|
||||
MAD R1.y, R2, c[5], fragment.texcoord[0];
|
||||
CMP R5.z, -R4.x, R1.y, fragment.texcoord[0].y;
|
||||
ADD R5.y, R5.z, -R3;
|
||||
MAD R0.y, R2, c[5], fragment.texcoord[0].x;
|
||||
CMP R3.x, -R1, c[0], R3;
|
||||
CMP R6.x, -R3.w, R0.y, fragment.texcoord[0];
|
||||
ADD R5.w, R5.z, R3.y;
|
||||
ADD R1.x, R6, -R3;
|
||||
MOV R1.y, R5;
|
||||
TEX R0.y, R1, texture[0], 2D;
|
||||
MUL R1.y, R2.x, R4;
|
||||
ADD R0.x, R0.z, R0;
|
||||
ADD R0.w, R2, R0;
|
||||
MAD R0.z, R0.x, c[5].x, R0.w;
|
||||
ADD R1.w, R8.y, R1;
|
||||
ADD R1.z, R8.y, R1;
|
||||
CMP R4.y, -R1, R1.z, R1.w;
|
||||
ADD R1.z, R6.x, R3.x;
|
||||
MAD R5.x, -R4.y, c[5].y, R0.y;
|
||||
MOV R1.w, R5;
|
||||
TEX R0.y, R1.zwzw, texture[0], 2D;
|
||||
MAX R1.w, R4.z, R4;
|
||||
MAD R1.y, -R4, c[5], R0;
|
||||
MUL R4.z, R1.w, c[5];
|
||||
ABS R0.y, R1;
|
||||
SGE R1.w, R0.y, R4.z;
|
||||
ABS R6.y, R5.x;
|
||||
SGE R0.y, R6, R4.z;
|
||||
ABS R1.w, R1;
|
||||
CMP R6.y, -R1.w, c[4].x, c[4].z;
|
||||
ABS R0.y, R0;
|
||||
CMP R5.z, -R0.y, c[4].x, c[4];
|
||||
ADD_SAT R0.y, R5.z, R6;
|
||||
MUL R4.w, R2.x, R0.y;
|
||||
MUL R0.y, R2.x, R6;
|
||||
MAD R1.w, R3.y, c[5], R5;
|
||||
CMP R6.x, -R0.y, R1.w, R5.w;
|
||||
MAD R6.z, R3.x, c[5].w, R1;
|
||||
CMP R1.z, -R0.y, R6, R1;
|
||||
MOV R1.w, R6.x;
|
||||
TEX R0.y, R1.zwzw, texture[0], 2D;
|
||||
MUL R1.w, R4, R6.y;
|
||||
CMP R6.y, -R1.w, R0, R1;
|
||||
MUL R0.y, R2.x, R5.z;
|
||||
MAD R1.y, -R3, c[5].w, R5;
|
||||
CMP R5.w, -R0.y, R1.y, R5.y;
|
||||
MAD R6.z, -R3.x, c[5].w, R1.x;
|
||||
CMP R1.x, -R0.y, R6.z, R1;
|
||||
MOV R1.y, R5.w;
|
||||
TEX R0.y, R1, texture[0], 2D;
|
||||
MUL R5.y, R4.w, R5.z;
|
||||
CMP R0.y, -R5, R0, R5.x;
|
||||
MAD R5.x, -R4.y, c[5].y, R0.y;
|
||||
CMP R5.z, -R5.y, R5.x, R0.y;
|
||||
MAD R1.y, -R4, c[5], R6;
|
||||
CMP R1.y, -R1.w, R1, R6;
|
||||
ABS R1.w, R1.y;
|
||||
SGE R1.w, R1, R4.z;
|
||||
ABS R0.y, R5.z;
|
||||
SGE R0.y, R0, R4.z;
|
||||
ABS R1.w, R1;
|
||||
CMP R6.y, -R1.w, c[4].x, c[4].z;
|
||||
ABS R0.y, R0;
|
||||
CMP R5.y, -R0, c[4].x, c[4].z;
|
||||
ADD_SAT R0.y, R5, R6;
|
||||
MUL R5.x, R4.w, R0.y;
|
||||
MUL R0.y, R4.w, R6;
|
||||
MAD R1.w, R3.y, c[5].x, R6.x;
|
||||
CMP R6.x, -R0.y, R1.w, R6;
|
||||
MAD R6.z, R3.x, c[5].x, R1;
|
||||
CMP R1.z, -R0.y, R6, R1;
|
||||
MOV R1.w, R6.x;
|
||||
TEX R0.y, R1.zwzw, texture[0], 2D;
|
||||
MUL R1.w, R5.x, R6.y;
|
||||
CMP R6.y, -R1.w, R0, R1;
|
||||
MUL R0.y, R4.w, R5;
|
||||
MAD R1.y, -R3, c[5].x, R5.w;
|
||||
CMP R4.w, -R0.y, R1.y, R5;
|
||||
MAD R6.z, -R3.x, c[5].x, R1.x;
|
||||
CMP R1.x, -R0.y, R6.z, R1;
|
||||
MOV R1.y, R4.w;
|
||||
TEX R0.y, R1, texture[0], 2D;
|
||||
MUL R5.y, R5.x, R5;
|
||||
CMP R0.y, -R5, R0, R5.z;
|
||||
MAD R5.z, -R4.y, c[5].y, R0.y;
|
||||
CMP R5.w, -R5.y, R5.z, R0.y;
|
||||
MAD R1.y, -R4, c[5], R6;
|
||||
CMP R1.y, -R1.w, R1, R6;
|
||||
ABS R1.w, R1.y;
|
||||
SGE R1.w, R1, R4.z;
|
||||
ABS R1.w, R1;
|
||||
CMP R6.y, -R1.w, c[4].x, c[4].z;
|
||||
ABS R0.y, R5.w;
|
||||
SGE R0.y, R0, R4.z;
|
||||
ABS R0.y, R0;
|
||||
CMP R5.y, -R0, c[4].x, c[4].z;
|
||||
ADD_SAT R0.y, R5, R6;
|
||||
MUL R5.z, R5.x, R0.y;
|
||||
MUL R0.y, R5.x, R6;
|
||||
MAD R1.w, R3.y, c[6].x, R6.x;
|
||||
CMP R6.x, -R0.y, R1.w, R6;
|
||||
MAD R6.z, R3.x, c[6].x, R1;
|
||||
CMP R1.z, -R0.y, R6, R1;
|
||||
MOV R1.w, R6.x;
|
||||
TEX R0.y, R1.zwzw, texture[0], 2D;
|
||||
MUL R1.w, R5.z, R6.y;
|
||||
CMP R6.y, -R1.w, R0, R1;
|
||||
MUL R0.y, R5.x, R5;
|
||||
MAD R1.y, -R3, c[6].x, R4.w;
|
||||
CMP R4.w, -R0.y, R1.y, R4;
|
||||
MAD R5.x, -R3, c[6], R1;
|
||||
CMP R1.x, -R0.y, R5, R1;
|
||||
MOV R1.y, R4.w;
|
||||
TEX R0.y, R1, texture[0], 2D;
|
||||
MUL R1.y, R5.z, R5;
|
||||
CMP R5.x, -R1.y, R0.y, R5.w;
|
||||
MAD R5.y, -R4, c[5], R5.x;
|
||||
CMP R1.y, -R1, R5, R5.x;
|
||||
MAD R0.y, -R4, c[5], R6;
|
||||
CMP R0.y, -R1.w, R0, R6;
|
||||
ABS R5.x, R0.y;
|
||||
ABS R1.w, R1.y;
|
||||
SGE R1.w, R1, R4.z;
|
||||
SGE R5.x, R5, R4.z;
|
||||
ABS R4.z, R5.x;
|
||||
ABS R1.w, R1;
|
||||
CMP R4.z, -R4, c[4].x, c[4];
|
||||
CMP R1.w, -R1, c[4].x, c[4].z;
|
||||
MUL R4.z, R5, R4;
|
||||
MAD R5.y, R3.x, c[6], R1.z;
|
||||
CMP R5.y, -R4.z, R5, R1.z;
|
||||
MAD R5.x, R3.y, c[6].y, R6;
|
||||
CMP R1.z, -R4, R5.x, R6.x;
|
||||
MUL R1.w, R5.z, R1;
|
||||
ADD R4.z, -fragment.texcoord[0].x, R5.y;
|
||||
ADD R1.z, -fragment.texcoord[0].y, R1;
|
||||
CMP R1.z, -R3.w, R1, R4;
|
||||
MAD R4.z, -R3.x, c[6].y, R1.x;
|
||||
MAD R3.x, -R3.y, c[6].y, R4.w;
|
||||
CMP R3.y, -R1.w, R4.z, R1.x;
|
||||
CMP R1.x, -R1.w, R3, R4.w;
|
||||
ADD R1.w, fragment.texcoord[0].x, -R3.y;
|
||||
ADD R1.x, fragment.texcoord[0].y, -R1;
|
||||
CMP R1.x, -R3.w, R1, R1.w;
|
||||
SLT R1.w, R1.x, R1.z;
|
||||
ADD R3.x, R1, R1.z;
|
||||
ABS R1.w, R1;
|
||||
MIN R1.x, R1, R1.z;
|
||||
CMP R1.w, -R1, c[4].x, c[4].z;
|
||||
MUL R1.z, R2.x, R1.w;
|
||||
RCP R3.x, R3.x;
|
||||
MAD R1.x, R1, -R3, c[5].y;
|
||||
MUL R1.w, R4.y, c[5].y;
|
||||
SLT R3.x, R1.y, c[4];
|
||||
SLT R1.y, R8, R1.w;
|
||||
SLT R0.y, R0, c[4].x;
|
||||
ADD R0.y, R0, -R1;
|
||||
ADD R1.y, -R1, R3.x;
|
||||
ABS R0.y, R0;
|
||||
ABS R1.y, R1;
|
||||
CMP R0.y, -R0, c[4].z, c[4].x;
|
||||
CMP R1.y, -R1, c[4].z, c[4].x;
|
||||
CMP R0.x, -R1.z, R0.y, R1.y;
|
||||
MAD R0.y, R0.z, c[6].z, -R8;
|
||||
ABS R0.x, R0;
|
||||
CMP R0.x, -R0, c[4], c[4].z;
|
||||
MUL R0.x, R2, R0;
|
||||
CMP R0.x, -R0, c[4], R1;
|
||||
RCP R0.z, R3.z;
|
||||
ABS R0.y, R0;
|
||||
MUL_SAT R0.y, R0, R0.z;
|
||||
MUL R0.z, R0.y, c[4].w;
|
||||
ADD R0.z, R0, c[6].w;
|
||||
MUL R0.y, R0, R0;
|
||||
MUL R0.y, R0.z, R0;
|
||||
MUL R0.y, R0, R0;
|
||||
MUL R0.y, R0, c[1].x;
|
||||
MAX R0.x, R0, R0.y;
|
||||
MAD R0.y, R0.x, R2, fragment.texcoord[0];
|
||||
MAD R0.z, R0.x, R2.y, fragment.texcoord[0].x;
|
||||
CMP R0.x, -R3.w, R0.z, fragment.texcoord[0];
|
||||
CMP R0.y, -R4.x, R0, fragment.texcoord[0];
|
||||
TEX R0.xyz, R0, texture[0], 2D;
|
||||
CMP R1, R2.z, R8, R9;
|
||||
MOV R0.w, R8.y;
|
||||
CMP result.color, -R2.x, R0, R1;
|
||||
END
|
||||
# 260 instructions, 10 R-regs
|
@ -0,0 +1,306 @@
|
||||
ps_2_x
|
||||
// cgc version 3.1.0013, build date Apr 18 2012
|
||||
// command line args: -profile ps_2_x -O3 -fastmath -fastprecision
|
||||
// source file: fxaa_pp.cg
|
||||
//vendor NVIDIA Corporation
|
||||
//version 3.1.0.13
|
||||
//profile ps_2_x
|
||||
//program fxaa_pp
|
||||
//semantic fxaa_pp.fxaaQualityRcpFrame
|
||||
//semantic fxaa_pp.fxaaQualitySubpix
|
||||
//semantic fxaa_pp.fxaaQualityEdgeThreshold
|
||||
//semantic fxaa_pp.fxaaQualityEdgeThresholdMin
|
||||
//semantic fxaa_pp.nlTex0 : TEX0
|
||||
//var float2 pos : $vin.TEXCOORD0 : TEX0 : 0 : 1
|
||||
//var float2 fxaaQualityRcpFrame : : c[0] : 1 : 1
|
||||
//var float fxaaQualitySubpix : : c[1] : 2 : 1
|
||||
//var float fxaaQualityEdgeThreshold : : c[2] : 3 : 1
|
||||
//var float fxaaQualityEdgeThresholdMin : : c[3] : 4 : 1
|
||||
//var sampler2D nlTex0 : TEX0 : texunit 0 : 5 : 1
|
||||
//var float4 oCol : $vout.COLOR : COL : 6 : 1
|
||||
//const c[4] = 0 -1 1 -2
|
||||
//const c[5] = 2 0.5 0.25 1.5
|
||||
//const c[6] = 4 12 0.083333336
|
||||
//const c[7] = -2 3
|
||||
dcl_2d s0
|
||||
def c4, 0.00000000, -1.00000000, 1.00000000, -2.00000000
|
||||
def c5, 2.00000000, 0.50000000, 0.25000000, 1.50000000
|
||||
def c6, 4.00000000, 12.00000000, 0.08333334, 0
|
||||
def c7, -2.00000000, 3.00000000, 0, 0
|
||||
dcl t0.xy
|
||||
mov r0.zw, c0.xyxy
|
||||
mad r3.xy, c4.zxzw, r0.zwzw, t0
|
||||
texld r7, r3, s0
|
||||
texld r1, t0, s0
|
||||
mov r0.xy, c0
|
||||
mad r0.xy, c4.yxzw, r0, t0
|
||||
texld r8, r0, s0
|
||||
mov r0.xy, c0
|
||||
mad r0.xy, c4, r0, t0
|
||||
texld r9, r0, s0
|
||||
add r0.xy, t0, -c0
|
||||
texld r5, r0, s0
|
||||
mov r3.xy, c0
|
||||
mad r3.xy, c4.zyzw, r3, t0
|
||||
texld r3, r3, s0
|
||||
add r7.x, r8.y, r7.y
|
||||
mad r0.z, r1.y, c4.w, r7.x
|
||||
add r0.x, r5.y, r3.y
|
||||
mad r0.w, r9.y, c4, r0.x
|
||||
mov r0.xy, c0
|
||||
mad r0.xy, c4.xzzw, r0, t0
|
||||
texld r6, r0, s0
|
||||
add r5.x, r9.y, r6.y
|
||||
abs r0.z, r0
|
||||
abs r0.w, r0
|
||||
mad r3.x, r0.z, c5, r0.w
|
||||
mov r0.zw, c0.xyxy
|
||||
mad r4.xy, c4.yzzw, r0.zwzw, t0
|
||||
texld r4, r4, s0
|
||||
add r0.xy, t0, c0
|
||||
texld r0, r0, s0
|
||||
add r4.x, r5.y, r4.y
|
||||
add r5.y, r3, r0
|
||||
add r0.x, r4.y, r0.y
|
||||
mad r0.x, r6.y, c4.w, r0
|
||||
abs r0.x, r0
|
||||
add r0.w, r0.x, r3.x
|
||||
mad r0.x, r8.y, c4.w, r4
|
||||
mad r0.z, r7.y, c4.w, r5.y
|
||||
mad r0.y, r1, c4.w, r5.x
|
||||
abs r0.z, r0
|
||||
abs r0.y, r0
|
||||
mad r0.y, r0, c5.x, r0.z
|
||||
abs r0.x, r0
|
||||
add r0.x, r0, r0.y
|
||||
add r0.x, r0, -r0.w
|
||||
cmp r3.y, r0.x, c4.z, c4.x
|
||||
max r0.y, r6, r1
|
||||
max r0.z, r7.y, r0.y
|
||||
max r0.y, r9, r8
|
||||
max r0.y, r0, r0.z
|
||||
min r0.z, r6.y, r1.y
|
||||
min r0.w, r7.y, r0.z
|
||||
min r0.z, r9.y, r8.y
|
||||
min r0.z, r0, r0.w
|
||||
mul r3.x, r0.y, c2
|
||||
abs_pp r0.x, r3.y
|
||||
add r4.y, r0, -r0.z
|
||||
max r0.w, r3.x, c3.x
|
||||
add r4.z, r4.y, -r0.w
|
||||
cmp_pp r4.w, r4.z, c4.z, c4.x
|
||||
mul_pp r5.w, r4, r3.y
|
||||
cmp_pp r0.y, -r0.x, c4.z, c4.x
|
||||
mul_pp r5.z, r4.w, r0.y
|
||||
cmp_pp r3.x, -r0, c4, c4.z
|
||||
cmp r6.w, -r5.z, r6.y, r7.y
|
||||
cmp r7.w, -r5.z, r9.y, r8.y
|
||||
add r0.z, -r1.y, r6.w
|
||||
add r0.y, -r1, r7.w
|
||||
abs r9.z, r0
|
||||
abs r7.y, r0
|
||||
add r0.y, r7, -r9.z
|
||||
cmp r0.y, r0, c4.z, c4.x
|
||||
max r7.y, r7, r9.z
|
||||
mul_pp r0.z, r4.w, r0.y
|
||||
cmp r0.w, -r5, c0.x, c0.y
|
||||
cmp r6.x, -r0.z, r0.w, -r0.w
|
||||
mov r0.z, c0.y
|
||||
cmp r6.y, -r5.z, c4.x, r0.z
|
||||
mad r0.w, r6.x, c5.y, t0.y
|
||||
cmp r0.z, -r5.w, t0.y, r0.w
|
||||
add r8.z, r0, r6.y
|
||||
add r7.z, r0, -r6.y
|
||||
mov r9.y, r7.z
|
||||
mov r8.y, r8.z
|
||||
mad r0.w, r6.x, c5.y, t0.x
|
||||
mov r0.x, c0
|
||||
mul_pp r3.x, r4.w, r3
|
||||
cmp r6.z, -r3.x, c4.x, r0.x
|
||||
cmp r0.x, -r5.z, t0, r0.w
|
||||
add r9.x, r0, -r6.z
|
||||
texld r3, r9, s0
|
||||
add r8.x, r0, r6.z
|
||||
abs_pp r3.x, r0.y
|
||||
texld r0, r8, s0
|
||||
cmp_pp r0.x, -r3, c4.z, c4
|
||||
add r0.w, r1.y, r6
|
||||
add r0.z, r1.y, r7.w
|
||||
mul_pp r0.x, r4.w, r0
|
||||
cmp r6.w, -r0.x, r0.z, r0
|
||||
mad r7.w, -r6, c5.y, r0.y
|
||||
mad r8.w, -r6, c5.y, r3.y
|
||||
abs r0.y, r7.w
|
||||
abs r0.x, r8.w
|
||||
mad r0.x, -r7.y, c5.z, r0
|
||||
mad r0.y, -r7, c5.z, r0
|
||||
cmp r0.x, r0, c4.z, c4
|
||||
abs_pp r0.x, r0
|
||||
cmp_pp r9.z, -r0.x, c4, c4.x
|
||||
cmp r0.y, r0, c4.z, c4.x
|
||||
abs_pp r0.y, r0
|
||||
cmp_pp r9.w, -r0.y, c4.z, c4.x
|
||||
mul_pp r0.x, r4.w, r9.z
|
||||
mad r0.y, -r6, c5.w, r7.z
|
||||
cmp r7.z, -r0.x, r7, r0.y
|
||||
mad r0.z, -r6, c5.w, r9.x
|
||||
cmp r9.x, -r0, r9, r0.z
|
||||
mov r9.y, r7.z
|
||||
texld r3, r9, s0
|
||||
add_pp_sat r3.z, r9, r9.w
|
||||
mul_pp r0.x, r4.w, r9.w
|
||||
mad r0.y, r6, c5.w, r8.z
|
||||
cmp r3.x, -r0, r8.z, r0.y
|
||||
mad r0.z, r6, c5.w, r8.x
|
||||
mul_pp r8.z, r4.w, r3
|
||||
cmp r8.x, -r0, r8, r0.z
|
||||
mov r8.y, r3.x
|
||||
texld r0, r8, s0
|
||||
mul_pp r0.w, r8.z, r9
|
||||
cmp r3.z, -r0.w, r7.w, r0.y
|
||||
mul_pp r0.x, r8.z, r9.z
|
||||
cmp r0.y, -r0.x, r8.w, r3
|
||||
mad r0.z, -r6.w, c5.y, r0.y
|
||||
cmp r8.w, -r0.x, r0.y, r0.z
|
||||
mad r3.y, -r6.w, c5, r3.z
|
||||
cmp r9.w, -r0, r3.z, r3.y
|
||||
abs r0.y, r9.w
|
||||
abs r0.x, r8.w
|
||||
mad r0.y, -r7, c5.z, r0
|
||||
mad r0.x, -r7.y, c5.z, r0
|
||||
cmp r0.y, r0, c4.z, c4.x
|
||||
abs_pp r0.y, r0
|
||||
cmp_pp r10.x, -r0.y, c4.z, c4
|
||||
cmp r0.x, r0, c4.z, c4
|
||||
abs_pp r0.x, r0
|
||||
cmp_pp r9.z, -r0.x, c4, c4.x
|
||||
mul_pp r0.x, r8.z, r10
|
||||
mad r0.y, r6, c5.x, r3.x
|
||||
cmp r7.w, -r0.x, r3.x, r0.y
|
||||
mad r0.z, r6, c5.x, r8.x
|
||||
cmp r8.x, -r0, r8, r0.z
|
||||
mov r8.y, r7.w
|
||||
texld r0, r8, s0
|
||||
mul_pp r0.w, r8.z, r9.z
|
||||
mad r3.x, -r6.z, c5, r9
|
||||
mad r0.x, -r6.y, c5, r7.z
|
||||
cmp r0.x, -r0.w, r7.z, r0
|
||||
add_pp_sat r0.z, r9, r10.x
|
||||
mul_pp r7.z, r8, r0
|
||||
cmp r9.x, -r0.w, r9, r3
|
||||
mov r9.y, r0.x
|
||||
texld r3, r9, s0
|
||||
mul_pp r0.z, r7, r9
|
||||
cmp r0.w, -r0.z, r8, r3.y
|
||||
mul_pp r3.x, r7.z, r10
|
||||
cmp r3.y, -r3.x, r9.w, r0
|
||||
mad r0.y, -r6.w, c5, r0.w
|
||||
cmp r8.z, -r0, r0.w, r0.y
|
||||
mad r3.z, -r6.w, c5.y, r3.y
|
||||
cmp r9.z, -r3.x, r3.y, r3
|
||||
abs r0.y, r8.z
|
||||
abs r0.z, r9
|
||||
mad r0.y, -r7, c5.z, r0
|
||||
mad r0.z, -r7.y, c5, r0
|
||||
cmp r0.y, r0, c4.z, c4.x
|
||||
abs_pp r0.y, r0
|
||||
cmp_pp r8.w, -r0.y, c4.z, c4.x
|
||||
cmp r0.z, r0, c4, c4.x
|
||||
abs_pp r0.z, r0
|
||||
cmp_pp r9.w, -r0.z, c4.z, c4.x
|
||||
mul_pp r0.y, r7.z, r8.w
|
||||
mad r0.z, -r6.y, c6.x, r0.x
|
||||
cmp r10.x, -r0.y, r0, r0.z
|
||||
mad r0.w, -r6.z, c6.x, r9.x
|
||||
cmp r9.x, -r0.y, r9, r0.w
|
||||
mov r9.y, r10.x
|
||||
texld r3, r9, s0
|
||||
mul_pp r0.x, r7.z, r9.w
|
||||
mad r0.z, r6, c6.x, r8.x
|
||||
mad r0.y, r6, c6.x, r7.w
|
||||
cmp r3.x, -r0, r7.w, r0.y
|
||||
cmp r8.x, -r0, r8, r0.z
|
||||
mov r8.y, r3.x
|
||||
texld r0, r8, s0
|
||||
add_pp_sat r3.z, r8.w, r9.w
|
||||
mul_pp r0.x, r7.z, r3.z
|
||||
mul_pp r3.z, r0.x, r9.w
|
||||
cmp r0.y, -r3.z, r9.z, r0
|
||||
mul_pp r0.z, r0.x, r8.w
|
||||
cmp r0.w, -r0.z, r8.z, r3.y
|
||||
mad r3.w, -r6, c5.y, r0.y
|
||||
cmp r0.y, -r3.z, r0, r3.w
|
||||
mad r3.y, -r6.w, c5, r0.w
|
||||
cmp r0.z, -r0, r0.w, r3.y
|
||||
abs r3.y, r0
|
||||
abs r0.w, r0.z
|
||||
mad r3.y, -r7, c5.z, r3
|
||||
mad r0.w, -r7.y, c5.z, r0
|
||||
cmp r3.y, r3, c4.z, c4.x
|
||||
abs_pp r3.y, r3
|
||||
cmp r0.w, r0, c4.z, c4.x
|
||||
cmp_pp r3.z, -r3.y, c4, c4.x
|
||||
abs_pp r0.w, r0
|
||||
cmp_pp r3.y, -r0.w, c4.z, c4.x
|
||||
mul_pp r0.w, r0.x, r3.z
|
||||
mul_pp r0.x, r0, r3.y
|
||||
mad r3.w, r6.y, c6.y, r3.x
|
||||
cmp r3.x, -r0.w, r3, r3.w
|
||||
mad r3.z, r6, c6.y, r8.x
|
||||
cmp r0.w, -r0, r8.x, r3.z
|
||||
mad r3.y, -r6, c6, r10.x
|
||||
cmp r3.y, -r0.x, r10.x, r3
|
||||
add r3.x, -t0.y, r3
|
||||
add r0.w, -t0.x, r0
|
||||
cmp r0.w, -r5.z, r0, r3.x
|
||||
mad r3.x, -r6.z, c6.y, r9
|
||||
cmp r0.x, -r0, r9, r3
|
||||
add r3.x, t0.y, -r3.y
|
||||
add r0.x, t0, -r0
|
||||
cmp r0.x, -r5.z, r0, r3
|
||||
add r3.x, r0, -r0.w
|
||||
add r3.y, r0.x, r0.w
|
||||
cmp r3.x, r3, c4, c4.z
|
||||
abs_pp r3.x, r3
|
||||
min r0.x, r0, r0.w
|
||||
cmp_pp r3.x, -r3, c4.z, c4
|
||||
mul_pp r0.w, r4, r3.x
|
||||
rcp r3.y, r3.y
|
||||
mad r0.x, r0, -r3.y, c5.y
|
||||
cmp r3.y, r0, c4.x, c4.z
|
||||
mad r3.x, -r6.w, c5.y, r1.y
|
||||
cmp r3.x, r3, c4, c4.z
|
||||
cmp r0.y, r0.z, c4.x, c4.z
|
||||
add_pp r0.z, -r3.x, r3.y
|
||||
add_pp r0.y, r0, -r3.x
|
||||
abs_pp r0.y, r0
|
||||
abs_pp r0.z, r0
|
||||
cmp_pp r0.z, -r0, c4.x, c4
|
||||
cmp_pp r0.y, -r0, c4.x, c4.z
|
||||
cmp_pp r0.y, -r0.w, r0, r0.z
|
||||
abs_pp r0.y, r0
|
||||
cmp_pp r0.y, -r0, c4.z, c4.x
|
||||
mul_pp r0.y, r4.w, r0
|
||||
rcp r0.w, r4.y
|
||||
cmp r0.x, -r0.y, r0, c4
|
||||
add r3.y, r4.x, r5
|
||||
add r3.x, r5, r7
|
||||
mad r3.x, r3, c5, r3.y
|
||||
mad r0.z, r3.x, c6, -r1.y
|
||||
abs r0.z, r0
|
||||
mul_sat r0.z, r0, r0.w
|
||||
mul r0.w, r0.z, r0.z
|
||||
mad r0.z, r0, c7.x, c7.y
|
||||
mul r0.z, r0, r0.w
|
||||
mul r0.z, r0, r0
|
||||
mul r0.z, r0, c1.x
|
||||
max r0.x, r0, r0.z
|
||||
mad r0.y, r0.x, r6.x, t0
|
||||
mad r0.z, r0.x, r6.x, t0.x
|
||||
cmp r0.x, -r5.z, t0, r0.z
|
||||
cmp r0.y, -r5.w, t0, r0
|
||||
texld r0, r0, s0
|
||||
mov r0.w, r1.y
|
||||
cmp r1, r4.z, r2, r1
|
||||
cmp r0, -r4.w, r1, r0
|
||||
mov oC0, r0
|
@ -0,0 +1,20 @@
|
||||
|
||||
void fxaa_vp(
|
||||
// Per vertex parameters
|
||||
float3 position : POSITION,
|
||||
float2 texCoord0 : TEXCOORD0,
|
||||
|
||||
// Vertex program constants
|
||||
uniform float4x4 modelViewProjection,
|
||||
uniform float4 fxaaConsolePosPos,
|
||||
|
||||
// Output position
|
||||
out float4 oPosition : POSITION,
|
||||
out float2 oTexCoord0 : TEXCOORD0,
|
||||
out float4 oTexCoord1 : TEXCOORD1
|
||||
)
|
||||
{
|
||||
oPosition = mul(modelViewProjection, float4(position, 0.0));
|
||||
oTexCoord0 = texCoord0;
|
||||
oTexCoord1 = texCoord0.xyxy + fxaaConsolePosPos;
|
||||
}
|
@ -0,0 +1,31 @@
|
||||
!!ARBvp1.0
|
||||
# cgc version 3.1.0013, build date Apr 18 2012
|
||||
# command line args: -profile arbvp1 -fastmath -fastprecision
|
||||
# source file: fxaa_vp.cg
|
||||
#vendor NVIDIA Corporation
|
||||
#version 3.1.0.13
|
||||
#profile arbvp1
|
||||
#program fxaa_vp
|
||||
#semantic fxaa_vp.modelViewProjection
|
||||
#semantic fxaa_vp.fxaaConsolePosPos
|
||||
#var float3 position : $vin.POSITION : POSITION : 0 : 1
|
||||
#var float2 texCoord0 : $vin.TEXCOORD0 : TEXCOORD0 : 1 : 1
|
||||
#var float4x4 modelViewProjection : : c[1], 4 : 2 : 1
|
||||
#var float4 fxaaConsolePosPos : : c[5] : 3 : 1
|
||||
#var float4 oPosition : $vout.POSITION : HPOS : 4 : 1
|
||||
#var float2 oTexCoord0 : $vout.TEXCOORD0 : TEX0 : 5 : 1
|
||||
#var float4 oTexCoord1 : $vout.TEXCOORD1 : TEX1 : 6 : 1
|
||||
#const c[0] = 0
|
||||
PARAM c[6] = { { 0 },
|
||||
program.local[1..5] };
|
||||
TEMP R0;
|
||||
MOV R0.w, c[0].x;
|
||||
MOV R0.xyz, vertex.position;
|
||||
DP4 result.position.w, R0, c[4];
|
||||
DP4 result.position.z, R0, c[3];
|
||||
DP4 result.position.y, R0, c[2];
|
||||
DP4 result.position.x, R0, c[1];
|
||||
ADD result.texcoord[1], vertex.texcoord[0].xyxy, c[5];
|
||||
MOV result.texcoord[0].xy, vertex.texcoord[0];
|
||||
END
|
||||
# 8 instructions, 1 R-regs
|
@ -0,0 +1,4 @@
|
||||
Compiled shaders are embedded in the source.
|
||||
Must compile and re-embed manually.
|
||||
|
||||
FXAA is in public domain.
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue