You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
o3de/Code/CryEngine/RenderDll/RenderDll_precompiled.h

444 lines
15 KiB
C++

/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
// Original file Copyright Crytek GMBH or its affiliates, used under license.
#pragma once
//on mac the precompiled header is auto included in every .c and .cpp file, no include line necessary.
//.c files don't like the cpp things in here
#ifdef __cplusplus
#include <RenderDll/Common/RendererDefs.h>
#include <Cry_Math.h>
#include <Cry_Geo.h>
#include <StlUtils.h>
#include <RenderDll/Common/DevBuffer.h>
#include <RenderDll/XRenderD3D9/DeviceManager/DeviceManager.h>
#include <VertexFormats.h>
#include <RenderDll/Common/CommonRender.h>
#include <IRenderAuxGeom.h>
#include <RenderDll/Common/Shaders/ShaderComponents.h>
#include <RenderDll/Common/Shaders/Shader.h>
#include <RenderDll/Common/Shaders/CShader.h>
#include <RenderDll/Common/RenderMesh.h>
#include <RenderDll/Common/RenderPipeline.h>
#include <RenderDll/Common/RenderThread.h>
#include <RenderDll/Common/Renderer.h>
#include <RenderDll/Common/Textures/Texture.h>
#include <RenderDll/Common/Shaders/Parser.h>
#include <RenderDll/Common/FrameProfiler.h>
#include <RenderDll/Common/Shadow_Renderer.h>
#include <RenderDll/Common/DeferredRenderUtils.h>
#include <RenderDll/Common/ShadowUtils.h>
#include <RenderDll/Common/WaterUtils.h>
#include <RenderDll/Common/OcclQuery.h>
#include <RenderDll/Common/PostProcess/PostProcess.h>
// All handled render elements (except common ones included in "RendElement.h")
#include <RenderDll/Common/RendElements/CREBeam.h>
#include <RenderDll/Common/RendElements/CREClientPoly.h>
#include <RenderDll/Common/RendElements/CRELensOptics.h>
#include <RenderDll/Common/RendElements/CREHDRProcess.h>
#include <RenderDll/Common/RendElements/CRECloud.h>
#include <RenderDll/Common/RendElements/CREDeferredShading.h>
#include <RenderDll/Common/RendElements/CREMeshImpl.h>
#if !defined(NULL_RENDERER)
#include <RenderDll/XRenderD3D9/DeviceManager/ConstantBufferCache.h>
#include <RenderDll/XRenderD3D9/DeviceManager/DeviceWrapper12.h>
#endif
#include <CryCommon/FrameProfiler.h>
#include <AzCore/Debug/EventTrace.h>
#if defined(AZ_RESTRICTED_PLATFORM)
#undef AZ_RESTRICTED_SECTION
#define STDAFX_H_SECTION_1 1
#define STDAFX_H_SECTION_2 2
#define STDAFX_H_SECTION_3 3
#endif
/*-----------------------------------------------------------------------------
Vector transformations.
-----------------------------------------------------------------------------*/
_inline void TransformVector(Vec3& out, const Vec3& in, const Matrix44A& m)
{
out.x = in.x * m(0, 0) + in.y * m(1, 0) + in.z * m(2, 0);
out.y = in.x * m(0, 1) + in.y * m(1, 1) + in.z * m(2, 1);
out.z = in.x * m(0, 2) + in.y * m(1, 2) + in.z * m(2, 2);
}
_inline void TransformPosition(Vec3& out, const Vec3& in, const Matrix44A& m)
{
TransformVector (out, in, m);
out += m.GetRow(3);
}
inline Plane TransformPlaneByUsingAdjointT(const Matrix44A& M, const Matrix44A& TA, const Plane plSrc)
{
Vec3 newNorm;
TransformVector (newNorm, plSrc.n, TA);
newNorm.Normalize();
if (M.Determinant() < 0.f)
{
newNorm *= -1;
}
Plane plane;
Vec3 p;
TransformPosition (p, plSrc.n * plSrc.d, M);
plane.Set(newNorm, p | newNorm);
return plane;
}
inline Matrix44 TransposeAdjoint(const Matrix44A& M)
{
Matrix44 ta;
ta(0, 0) = M(1, 1) * M(2, 2) - M(2, 1) * M(1, 2);
ta(1, 0) = M(2, 1) * M(0, 2) - M(0, 1) * M(2, 2);
ta(2, 0) = M(0, 1) * M(1, 2) - M(1, 1) * M(0, 2);
ta(0, 1) = M(1, 2) * M(2, 0) - M(2, 2) * M(1, 0);
ta(1, 1) = M(2, 2) * M(0, 0) - M(0, 2) * M(2, 0);
ta(2, 1) = M(0, 2) * M(1, 0) - M(1, 2) * M(0, 0);
ta(0, 2) = M(1, 0) * M(2, 1) - M(2, 0) * M(1, 1);
ta(1, 2) = M(2, 0) * M(0, 1) - M(0, 0) * M(2, 1);
ta(2, 2) = M(0, 0) * M(1, 1) - M(1, 0) * M(0, 1);
ta(0, 3) = 0.f;
ta(1, 3) = 0.f;
ta(2, 3) = 0.f;
return ta;
}
inline Plane TransformPlane(const Matrix44A& M, const Plane& plSrc)
{
Matrix44 tmpTA = TransposeAdjoint(M);
return TransformPlaneByUsingAdjointT(M, tmpTA, plSrc);
}
// Homogeneous plane transform.
inline Plane TransformPlane2(const Matrix34A& m, const Plane& src)
{
Plane plDst;
float v0 = src.n.x, v1 = src.n.y, v2 = src.n.z, v3 = src.d;
plDst.n.x = v0 * m(0, 0) + v1 * m(1, 0) + v2 * m(2, 0);
plDst.n.y = v0 * m(0, 1) + v1 * m(1, 1) + v2 * m(2, 1);
plDst.n.z = v0 * m(0, 2) + v1 * m(1, 2) + v2 * m(2, 2);
plDst.d = v0 * m(0, 3) + v1 * m(1, 3) + v2 * m(2, 3) + v3;
return plDst;
}
// Homogeneous plane transform.
inline Plane TransformPlane2(const Matrix44A& m, const Plane& src)
{
Plane plDst;
float v0 = src.n.x, v1 = src.n.y, v2 = src.n.z, v3 = src.d;
plDst.n.x = v0 * m(0, 0) + v1 * m(0, 1) + v2 * m(0, 2) + v3 * m(0, 3);
plDst.n.y = v0 * m(1, 0) + v1 * m(1, 1) + v2 * m(1, 2) + v3 * m(1, 3);
plDst.n.z = v0 * m(2, 0) + v1 * m(2, 1) + v2 * m(2, 2) + v3 * m(2, 3);
plDst.d = v0 * m(3, 0) + v1 * m(3, 1) + v2 * m(3, 2) + v3 * m(3, 3);
return plDst;
}
inline Plane TransformPlane2_NoTrans(const Matrix44A& m, const Plane& src)
{
Plane plDst;
TransformVector(plDst.n, src.n, m);
plDst.d = src.d;
return plDst;
}
inline Plane TransformPlane2Transposed(const Matrix44A& m, const Plane& src)
{
Plane plDst;
float v0 = src.n.x, v1 = src.n.y, v2 = src.n.z, v3 = src.d;
plDst.n.x = v0 * m(0, 0) + v1 * m(1, 0) + v2 * m(2, 0) + v3 * m(3, 0);
plDst.n.y = v0 * m(0, 1) + v1 * m(1, 1) + v2 * m(2, 1) + v3 * m(3, 1);
plDst.n.z = v0 * m(0, 2) + v1 * m(2, 1) + v2 * m(2, 2) + v3 * m(3, 2);
plDst.d = v0 * m(0, 3) + v1 * m(1, 3) + v2 * m(2, 3) + v3 * m(3, 3);
return plDst;
}
//===============================================================================================
#define MAX_PATH_LENGTH 512
#if defined(LINUX) || defined(APPLE)
#define AZ_RESTRICTED_SECTION_IMPLEMENTED
#elif defined(AZ_RESTRICTED_PLATFORM)
#define AZ_RESTRICTED_SECTION STDAFX_H_SECTION_1
#include AZ_RESTRICTED_FILE(RenderDll_precompiled_h)
#endif
#if defined(AZ_RESTRICTED_SECTION_IMPLEMENTED)
#undef AZ_RESTRICTED_SECTION_IMPLEMENTED
#else //than it does already exist
inline int vsnprintf(char* buf, int size, const char* format, va_list& args)
{
int res = azvsnprintf(buf, size, format, args);
assert(res >= 0 && res < size); // just to know if there was problems in past
buf[size - 1] = 0;
return res;
}
#endif
#if defined(LINUX) || defined(APPLE)
#define AZ_RESTRICTED_SECTION_IMPLEMENTED
#elif defined(AZ_RESTRICTED_PLATFORM)
#define AZ_RESTRICTED_SECTION STDAFX_H_SECTION_2
#include AZ_RESTRICTED_FILE(RenderDll_precompiled_h)
#endif
#if defined(AZ_RESTRICTED_SECTION_IMPLEMENTED)
#undef AZ_RESTRICTED_SECTION_IMPLEMENTED
#else //than it does already exist
inline int snprintf(char* buf, int size, const char* format, ...)
{
va_list arglist;
va_start(arglist, format);
int res = azvsnprintf(buf, size, format, arglist);
va_end(arglist);
return res;
}
#endif
//////////////////////////////////////////////////////////////////////////
// Report warning to validator.
//////////////////////////////////////////////////////////////////////////
inline void Warning(const char* format, ...) PRINTF_PARAMS(1, 2);
inline void Warning(const char* format, ...)
{
va_list args;
va_start(args, format);
if (iSystem)
{
iSystem->WarningV(VALIDATOR_MODULE_RENDERER, VALIDATOR_WARNING, 0, NULL, format, args);
}
va_end(args);
}
//////////////////////////////////////////////////////////////////////////
// Report warning to validator.
//////////////////////////////////////////////////////////////////////////
inline void LogWarning(const char* format, ...) PRINTF_PARAMS(1, 2);
inline void LogWarning(const char* format, ...)
{
va_list args;
va_start(args, format);
if (iSystem)
{
iSystem->WarningV(VALIDATOR_MODULE_RENDERER, VALIDATOR_WARNING, 0, NULL, format, args);
}
va_end(args);
}
inline void LogWarningEngineOnly(const char* format, ...) PRINTF_PARAMS(1, 2);
inline void LogWarningEngineOnly(const char* format, ...)
{
va_list args;
va_start(args, format);
if (iSystem)
{
iSystem->WarningV(VALIDATOR_MODULE_RENDERER, VALIDATOR_WARNING, VALIDATOR_FLAG_IGNORE_IN_EDITOR, NULL, format, args);
}
va_end(args);
}
//////////////////////////////////////////////////////////////////////////
// Report warning to validator.
//////////////////////////////////////////////////////////////////////////
inline void FileWarning(const char* filename, const char* format, ...) PRINTF_PARAMS(2, 3);
inline void FileWarning(const char* filename, const char* format, ...)
{
va_list args;
va_start(args, format);
if (iSystem)
{
iSystem->WarningV(VALIDATOR_MODULE_RENDERER, VALIDATOR_WARNING, VALIDATOR_FLAG_FILE, filename, format, args);
}
va_end(args);
}
//////////////////////////////////////////////////////////////////////////
// Report warning to validator.
//////////////////////////////////////////////////////////////////////////
inline void TextureWarning(const char* filename, const char* format, ...) PRINTF_PARAMS(2, 3);
inline void TextureWarning(const char* filename, const char* format, ...)
{
va_list args;
va_start(args, format);
if (iSystem)
{
iSystem->WarningV(VALIDATOR_MODULE_RENDERER, VALIDATOR_WARNING, (VALIDATOR_FLAG_FILE | VALIDATOR_FLAG_TEXTURE), filename, format, args);
}
va_end(args);
}
inline void TextureError(const char* filename, const char* format, ...)
{
va_list args;
va_start(args, format);
if (iSystem)
{
iSystem->WarningV(VALIDATOR_MODULE_RENDERER, VALIDATOR_ERROR, (VALIDATOR_FLAG_FILE | VALIDATOR_FLAG_TEXTURE), filename, format, args);
}
va_end(args);
}
_inline void _SetVar(const char* szVarName, int nVal)
{
ICVar* var = iConsole->GetCVar(szVarName);
if (var)
{
var->Set(nVal);
}
else
{
assert(0);
}
}
// Get the sub-string starting at the last . in the string, or NULL if the string contains no dot
// Note: The returned pointer refers to a location inside the provided string, no allocation is performed
const char* fpGetExtension (const char* in);
// Remove extension from string, including the .
// If the string has no extension, the whole string will be copied into the buffer
// Note: The out buffer must have space to store a copy of the in-string and a null-terminator
void fpStripExtension (const char* in, char* out, size_t bytes);
template<size_t bytes>
void fpStripExtension (const char* in, char (&out)[bytes]) { fpStripExtension(in, out, bytes); }
// Adds an extension to the path, if an extension is already present the function does nothing
// The extension should include the .
// Note: The path buffer must have enough unused space to store a copy of the extension string
void fpAddExtension (char* path, const char* extension, size_t bytes);
template<size_t bytes>
void fpAddExtension (char (&path)[bytes], const char* extension) { fpAddExtension(path, extension, bytes); }
// Converts DOS slashes to UNIX slashes
// Note: The dst buffer must have space to store a copy of src and a null-terminator
void fpConvertDOSToUnixName (char* dst, const char* src, size_t bytes);
template<size_t bytes>
void fpConvertDOSToUnixName (char (&dst)[bytes], const char* src) { fpConvertDOSToUnixName(dst, src, bytes); }
// Converts UNIX slashes to DOS slashes
// Note: the dst buffer must have space to store a copy of src and a null-terminator
void fpConvertUnixToDosName (char* dst, const char* src, size_t bytes);
template<size_t bytes>
void fpConvertUnixToDosName (char (&dst)[bytes], const char* src) { fpConvertUnixToDosName(dst, src, bytes); }
// Combines the path and name strings, inserting a UNIX slash as required, and stores the result into the dst buffer
// path may be NULL, in which case name will be copied into the dst buffer, and the UNIX slash is NOT inserted
// Note: the dst buffer must have space to store: a copy of name, a copy of path (if not null), a UNIX slash (if path doesn't end with one) and a null-terminator
void fpUsePath (const char* name, const char* path, char* dst, size_t bytes);
template<size_t bytes>
void fpUsePath (const char* name, const char* path, char (&dst)[bytes]) { fpUsePath(name, path, dst, bytes); }
//=========================================================================================
//
// Normal timing.
//
#define ticks(Timer) {Timer -= CryGetTicks(); }
#define unticks(Timer) {Timer += CryGetTicks() + 34; }
//=============================================================================
// the int 3 call for 32-bit version for .l-generated files.
#ifdef WIN64
#define LEX_DBG_BREAK
#else
#define LEX_DBG_BREAK DEBUG_BREAK
#endif
#include <RenderDll/Common/Defs.h>
#define FUNCTION_PROFILER_RENDERER FUNCTION_PROFILER_FAST(iSystem, PROFILE_RENDERER, g_bProfilerEnabled)
#define SCOPED_RENDERER_ALLOCATION_NAME_HINT(str)
#define SHADER_ASYNC_COMPILATION
#if !defined(_RELEASE)
//# define DETAILED_PROFILING_MARKERS
#endif
#if defined(DETAILED_PROFILING_MARKERS)
# define DETAILED_PROFILE_MARKER(x) DETAILED_PROFILE_MARKER((x))
#else
# define DETAILED_PROFILE_MARKER(x) (void)0
#endif
#define RAIN_OCC_MAP_SIZE 256
#if defined(AZ_RESTRICTED_PLATFORM)
#define AZ_RESTRICTED_SECTION STDAFX_H_SECTION_3
#include AZ_RESTRICTED_FILE(RenderDll_precompiled_h)
#endif
#if defined(WIN32)
#include <float.h>
struct ScopedSetFloatExceptionMask
{
ScopedSetFloatExceptionMask(unsigned int disable = _EM_INEXACT | _EM_UNDERFLOW | _EM_OVERFLOW | _EM_DENORMAL | _EM_INVALID)
{
_clearfp();
_controlfp_s(&oldMask, 0, 0);
unsigned temp;
_controlfp_s(&temp, disable, _MCW_EM);
}
~ScopedSetFloatExceptionMask()
{
_clearfp();
unsigned temp;
_controlfp_s(&temp, oldMask, _MCW_EM);
}
unsigned oldMask;
};
#define SCOPED_ENABLE_FLOAT_EXCEPTIONS ScopedSetFloatExceptionMask scopedSetFloatExceptionMask(0)
#define SCOPED_DISABLE_FLOAT_EXCEPTIONS ScopedSetFloatExceptionMask scopedSetFloatExceptionMask
#endif // defined(_MSC_VER)
#include <RenderDll/XRenderD3D9/DeviceManager/DeviceManagerInline.h>
#endif //__cplusplus
/*-----------------------------------------------------------------------------
The End.
-----------------------------------------------------------------------------*/