1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
/**
* @file llterrainpaintmap.h
* @brief Utilities for managing terrain paint maps
*
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2024, Linden Research, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#pragma once
#include "llviewerprecompiledheaders.h"
class LLViewerRegion;
class LLViewerTexture;
class LLTerrainPaintQueue;
class LLTerrainPaintMap
{
public:
// Convert a region's heightmap and composition into a paint map texture which
// approximates how the terrain would be rendered with the heightmap.
// In effect, this allows converting terrain of type TERRAIN_PAINT_TYPE_HEIGHTMAP_WITH_NOISE
// to type TERRAIN_PAINT_TYPE_PBR_PAINTMAP.
// Returns true if successful
static bool bakeHeightNoiseIntoPBRPaintMapRGB(const LLViewerRegion& region, LLViewerTexture& tex);
static void applyPaintQueueRGB(LLViewerTexture& tex, LLTerrainPaintQueue& queue);
static LLTerrainPaintQueue convertPaintQueueRGBAToRGB(LLViewerTexture& tex, LLTerrainPaintQueue& queue_in);
};
// Enqueued paint operations, in texture coordinates.
// mData is always RGB or RGBA (determined by mComponents), with each U8
// storing one color with a max value of (1 >> mBitDepth) - 1
struct LLTerrainPaint
{
using ptr_t = std::shared_ptr<LLTerrainPaint>;
U16 mStartX;
U16 mStartY;
U16 mWidthX;
U16 mWidthY;
U8 mBitDepth;
U8 mComponents;
const static U8 RGB = 3;
const static U8 RGBA = 4;
std::vector<U8> mData;
};
class LLTerrainPaintQueue
{
public:
// components determines what type of LLTerrainPaint is allowed. Must be 3 (RGB) or 4 (RGBA)
LLTerrainPaintQueue(U8 components);
LLTerrainPaintQueue(const LLTerrainPaintQueue& other);
LLTerrainPaintQueue& operator=(const LLTerrainPaintQueue& other);
bool enqueue(LLTerrainPaint::ptr_t& paint, bool dry_run = false);
bool enqueue(LLTerrainPaintQueue& paint_queue);
size_t size() const;
bool empty() const;
void clear();
const std::vector<LLTerrainPaint::ptr_t>& get() const { return mList; }
U8 getComponents() const { return mComponents; }
// Convert mBitDepth for the LLTerrainPaint in the queue at index
// If mBitDepth is already equal to target_bit_depth, no conversion takes
// place.
// It is currently the responsibility of the paint queue to convert
// incoming bits to the right bit depth for the paintmap (this could
// change in the future).
void convertBitDepths(size_t index, U8 target_bit_depth);
private:
U8 mComponents;
std::vector<LLTerrainPaint::ptr_t> mList;
};
|