summaryrefslogtreecommitdiff
path: root/public/panorama/iuirenderengine.h
diff options
context:
space:
mode:
Diffstat (limited to 'public/panorama/iuirenderengine.h')
-rw-r--r--public/panorama/iuirenderengine.h165
1 files changed, 165 insertions, 0 deletions
diff --git a/public/panorama/iuirenderengine.h b/public/panorama/iuirenderengine.h
new file mode 100644
index 0000000..741a900
--- /dev/null
+++ b/public/panorama/iuirenderengine.h
@@ -0,0 +1,165 @@
+//=========== Copyright Valve Corporation, All rights reserved. ===============//
+//
+// Purpose:
+//=============================================================================//
+
+#ifndef IUIRENDERENGINE_H
+#define IUIRENDERENGINE_H
+
+#ifdef _WIN32
+#pragma once
+#endif
+
+#include "panoramatypes.h"
+#include "tier1/refcount.h"
+#if defined( SOURCE2_PANORAMA )
+class IRenderContext;
+#include "rendermessages.pb.h"
+class IRenderContext;
+#else
+#include "../../panorama/renderer/rendermessages.pb.h"
+#endif
+
+class CMsgFillBrushCollection;
+
+namespace panorama
+{
+
+enum E2DTextureFormat
+{
+ k_EFormatRGBA8,
+ k_EFormatBGRA8,
+ k_EFormatBGR8, // 8 bits per channel, last 8 bits in the dword are ignored
+ k_EFormatA8,
+ k_EFormatYUV420,
+ k_EFormatR16G16B16A16,
+ k_EFormatDXT1,
+ k_EFormatDXT5,
+};
+
+
+enum EAlphaChannelType
+{
+ k_EAlphaChannelType_None,
+ k_EAlphaChannelType_Normal,
+ k_EAlphaChannelType_PreMultiplied,
+};
+
+
+//
+// Class to represent all textures
+//
+class IUITexture
+{
+public:
+
+ virtual ~IUITexture() { }
+
+ virtual uint32 GetTextureID() = 0;
+ virtual uint32 GetOriginalWidth() { return GetTextureWidth(); }
+ virtual uint32 GetOriginalHeight() { return GetTextureHeight(); }
+ virtual uint32 GetTextureWidth() = 0;
+ virtual uint32 GetTextureHeight() = 0;
+ virtual uint32 GetStride() = 0;
+ virtual E2DTextureFormat GetFormat() = 0;
+ virtual EAlphaChannelType GetAlphaChannelType() = 0;
+ virtual bool BIsReady() = 0;
+};
+
+
+//
+// Class to handle double buffered textures of various standard formats (RGBA8, BGRA8, alpha-premulitplied/or-not, etc)
+//
+class IUIDoubleBufferedTexture : public IUITexture
+{
+public:
+ virtual ~IUIDoubleBufferedTexture() {}
+
+ // Update the data for rendering next frame
+ virtual int32 UpdateTextureData( void *pTextureData ) = 0;
+};
+
+
+//
+// YUV420 textures are special, because they need 3 textures one for Y, U, and V, and then
+// they need special rendering rules in a pixel shader to scale/color convert.
+//
+class IUIDoubleBufferedYUV420Texture : public IUITexture
+{
+public:
+ virtual ~IUIDoubleBufferedYUV420Texture() {}
+
+ // Update the YUV420 data for rendering next frame
+ virtual bool BUpdateTextureData( void *pYBuffer, void *pUBuffer, void *pVBuffer, uint unStrideY, uint unStrideU, uint unStrideV ) = 0;
+};
+
+//
+// Render thread callback object interface
+//
+#if defined( SOURCE2_PANORAMA )
+class CRenderThreadCallback : public CRefCount
+{
+public:
+
+ // Callback function to override and perform direct rendering within
+ virtual void RenderThreadCallback(ISceneView *pSceneView, IRenderContext **pRenderContext, ISceneLayer *pSceneLayer, float x0, float y0, float x1, float y1) = 0;
+
+};
+#endif
+
+//-----------------------------------------------------------------------------
+// Purpose: Interface to do drawing onto windows. This is the full publically exposed
+// drawing interface that new panel types can use for drawing, the implementation has
+// more stuff available inside the framework.
+//-----------------------------------------------------------------------------
+class IUIRenderEngine
+{
+public:
+
+ // Draw a filled quad
+ virtual void DrawFilledRect( float x0, float y0, float x1, float y1, const CMsgFillBrushCollection &c, EAntialiasing antialiasing = k_EAntialisingEnabled ) = 0;
+
+ // Draw a textured quad
+ virtual void DrawTexturedRect( uint32 unTextureID, ETextureSampleMode eSampleMode, float x0, float y0, float x1, float y1, float u0, float v0, float u1, float v1 ) = 0;
+
+ // Draw text (utf-8 input)
+ virtual void DrawTextRegion( const char *pchText, const char *pchFontName, const CMsgFillBrushCollection &c, float flSize, float flLineHeight, EFontWeight weight, EFontStyle style, ETextAlign align, ETextDecoration decoration, bool bWrap, bool bEllipsis, int nLetterSpacing, float x0, float y0, float x1, float y1, ::google::protobuf::RepeatedPtrField< ::CMsgTextRangeFormat > *pmsgRangeFormats ) = 0;
+
+ // Draw text (wchar input)
+ virtual void DrawTextRegion( const wchar_t *pchText, const char *pchFontName, const CMsgFillBrushCollection &c, float flSize, float flLineHeight, EFontWeight weight, EFontStyle style, ETextAlign align, ETextDecoration decoration, bool bWrap, bool bEllipsis, int nLetterSpacing, float x0, float y0, float x1, float y1, ::google::protobuf::RepeatedPtrField< ::CMsgTextRangeFormat > *pmsgRangeFormats ) = 0;
+
+ // Draw one of the special syncronized textures
+ virtual void DrawSyncronizedTexturedRect( uint32 unTextureID, ETextureSampleMode eSampleMode, int32 unSerialize, float x0, float y0, float x1, float y1, float u0, float v0, float u1, float v1 ) = 0;
+
+ // Queue a texture delete, won't actually delete until the layout threads active frame next reaches rendering
+ virtual void QueueDeleteTexture( IUITexture *pTexture ) = 0;
+
+ // Called to create a texture, you call this directly on the main thread and the returned texture interface is thread safe,
+ // so you can access its id/size and delete it from the main thread as well. Drawing calls are not synchronized with texture creation,
+ // but the contract is you must create the texture before attempting to draw for it's id.
+ virtual bool BCreateTexture( IUITexture **pTextureOutput, void *pubTextureData, uint32 unWidth, uint32 unHeight, uint32 unStride, E2DTextureFormat eFormat, EAlphaChannelType eAlphaChannelType ) = 0;
+
+#if defined( SOURCE2_PANORAMA )
+ virtual bool BCreateTexture( IUITexture **pTextureOutput, const char *pResourceFile ) = 0;
+
+ // Tell the render thread to call the panel back on the specified method, which will then be able to do
+ // direct render system calls on the render thread
+ virtual void RequestRenderCallback( CRenderThreadCallback *pCallbackObj, float x0, float y0, float x1, float y1,
+ float flPaddingLeft, float flPaddingRight, float flPaddingTop, float flPaddingBottom, bool bNeedsRedrawEveryFrame ) = 0;
+#endif
+
+ // Called to create a double buffered texture, you call this directly on the main thread
+ // and the returned texture interface is thread safe, so you can update the texture data directly. The textures are
+ // double buffered, so it should be hard to block the render thread, but some locking does occur. Unlike normal texture
+ // drawing your draw calls are not synchronized with texture data updates, so you could end up skipping frames or such.
+ virtual bool BCreateDoubleBufferedTexture( IUIDoubleBufferedTexture **pDoubleBufferedOutput, uint32 unWidth, uint32 unHeight, uint32 unStride, E2DTextureFormat eFormat, EAlphaChannelType eAlphaChannelType, bool bSerializedUploads ) = 0;
+
+ // Called to create a double buffered YUV420 texture (for movie rendering), you call this directly on the main thread
+ // and the returned texture interface is thread safe, so you can update the texture data directly. The textures are
+ // double buffered, so it should be hard to block the render thread, but some locking does occur. Unlike normal texture
+ // drawing your draw calls are not synchronized with texture data updates, so you could end up skipping frames or such.
+ virtual bool BCreateDoubleBufferedYUV420Texture( IUIDoubleBufferedYUV420Texture **pDoubleBufferedYUV420Output, uint32 unWidth, uint32 unHeight ) = 0;
+};
+
+}
+#endif // IUIRENDERENGINE_H