csgo-2018-source/engine/paint.h
2021-07-24 21:11:47 -07:00

144 lines
3.9 KiB
C++

//========= Copyright © Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
//==========================================================================//
#ifndef PAINT_H
#define PAINT_H
#ifdef _WIN32
#pragma once
#endif
#include "materialsystem/MaterialSystemUtil.h"
#include "materialsystem/ipaintmapdatamanager.h"
#include "bitvec.h"
#include "surfacehandle.h"
//forward declaration
struct model_t;
struct PaintRect_t
{
Rect_t rect;
Vector2D uvCenter;
float flCenterAlpha;
float flCircleRadius;
float flPaintCoatPercent;
BYTE colorIndex;
SurfaceHandle_t surfID;
};
enum PaintDirtyFlags_t
{
PAINTMAP_CLEAN = 0,
PAINTMAP_DIRTY_SUBRECT,
PAINTMAP_DIRTY_FULLRECT
};
class CPaintTextureData
{
public:
CPaintTextureData();
// Initializes, shuts down the material
bool Init( int width, int height, int lightmapPageID );
void Destroy();
// Returns the texcoord range
void GetTexCoordRange( float *pMaxU, float *pMaxV );
// Returns the size of the paint texture (stored in a subrect of the material itself)
void GetPaintSize( int *pWidth, int *pHeight );
void ClearTexture();
void GetPixels( const Rect_t& splatRect, CUtlVector<BYTE>& surfColors );
BYTE GetPixel( int x, int y ) const;
void SetPixel( int x, int y, BYTE color );
// Returns true if any data changed
bool Paint( const PaintRect_t& paintRect2 );
void PaintAllSurfaces( BYTE color );
void GetSurfacePaintData( SurfaceHandle_t surfID, CUtlVector< BYTE > &data ) const;
void SetSurfacePaintData( SurfaceHandle_t surfID, const CUtlVector< BYTE > &data );
BYTE* GetPaintmapData() { return m_backbuffer; }
PaintDirtyFlags_t GetDirtyFlag() const;
void MarkAsDirty( PaintDirtyFlags_t nDirtyFlag = PAINTMAP_DIRTY_FULLRECT );
void RemoveDirty();
void AddDirtyRect( const Rect_t& rect );
CUtlVectorFixedGrowable<Rect_t, 1024>* GetDirtyRectList();
private:
enum PaintChangeFlags_t
{
TEXEL_CHANGED = 0x1,
PAINT_POWER_CHANGED = 0x2,
};
void ClearBuffer( BYTE *pByte = NULL );
uint32 BlendLuxel( const PaintRect_t& paintRect, int x, int y, float flNewAlpha, float flMaxAlpha = 1.f );
uint32 AddSurroundingAlpha( const PaintRect_t& paintRect, int x, int y );
uint32 DrawLine( const PaintRect_t& paintRect, int x1, int x2, int y );
uint32 Draw2Lines( const PaintRect_t& paintRect, float x, float y );
uint32 Draw4Lines( const PaintRect_t& paintRect, float x, float y );
uint32 DrawCircle( const PaintRect_t& paintRect );
int m_nPaintWidth;
int m_nPaintHeight;
int m_lightmapPageID;
BYTE *m_backbuffer;
PaintDirtyFlags_t m_nDirtyFlag;
CUtlVectorFixedGrowable<Rect_t, 1024> m_dirtyRects; // preallocate 1024, seems to be a conservative count
};
class CPaintmapDataManager : public IPaintmapDataManager
{
public:
CPaintmapDataManager( void );
~CPaintmapDataManager( void );
void RemoveAllPaint( void );
void RemovePaint( const model_t *pModel );
void PaintAllSurfaces( BYTE color );
virtual void BeginPaintmapsDataAllocation( int iPaintmapCount );
virtual void AllocatePaintmapData( int iPaintmapID, int iCorrespondingLightMapWidth, int iCorrespondingLightMapHeight );
virtual void DestroyPaintmapsData( void );
virtual BYTE* GetPaintmapData( int paintmap );
virtual void GetPaintmapSize( int paintmap, int& width, int& height );
virtual void OnRestorePaintmaps();
void UpdatePaintmapTextures();
void GetPaintmapDataRLE( CUtlVector< uint32 > &data ) const;
void LoadPaintmapDataRLE( const CUtlVector< uint32 > &data );
CPaintTextureData *m_pPaintTextureDataArray;
int m_iPaintmaps;
bool m_bShouldRegister;
};
//global paint atlas
extern CPaintmapDataManager g_PaintManager;
// Returns true if any paint changed
bool ShootPaintSphere( const model_t *pModel, const Vector& vPosition, BYTE colorIndex, float flSphereRadius, float flPaintCoatPercent );
void TracePaintSphere( const model_t *pModel, const Vector& vPosition, const Vector& vContactNormal, float flSphereRadius, CUtlVector<BYTE>& surfColors );
void R_RedownloadAllPaintmaps();
#endif // PAINT_H