summaryrefslogtreecommitdiff
path: root/indra/newview/llreflectionmap.h
blob: e97b28c855abec74451822def61898abec841afd (plain)
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
/**
 * @file llreflectionmap.h
 * @brief LLReflectionMap class declaration
 *
 * $LicenseInfo:firstyear=2022&license=viewerlgpl$
 * Second Life Viewer Source Code
 * Copyright (C) 2022, 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 "llcubemaparray.h"
#include "llmemory.h"

class LLSpatialGroup;
class LLViewerObject;

class alignas(16) LLReflectionMap : public LLRefCount
{
    LL_ALIGN_NEW
public:
    
    enum class ProbeType
    {
        ALL = 0,
        RADIANCE,
        IRRADIANCE,
        REFLECTION
    };
    
    // allocate an environment map of the given resolution 
    LLReflectionMap();

    ~LLReflectionMap();

    // update this environment map
    // resolution - size of cube map to generate
    void update(U32 resolution, U32 face, bool force_dynamic = false, F32 near_clip = -1.f);

    // for volume partition probes, try to place this probe in the best spot
    void autoAdjustOrigin();

    // return true if given Reflection Map's influence volume intersect's with this one's
    bool intersects(LLReflectionMap* other);

    // Get the ambiance value to use for this probe
    F32 getAmbiance();

    // Get the near clip plane distance to use for this probe
    F32 getNearClip();

    // Return true if this probe should include avatars in its reflection map
    bool getIsDynamic();

    // get the encoded bounding box of this probe's influence volume
    // will only return a box if this probe is associated with a VOVolume
    // with its reflection probe influence volume to to VOLUME_TYPE_BOX
    // return false if no bounding box (treat as sphere influence volume)
    bool getBox(LLMatrix4& box);

    // return true if this probe is active for rendering
    bool isActive();

    // perform occlusion query/readback
    void doOcclusion(const LLVector4a& eye);

    // return false if this probe isn't currently relevant (for example, disabled due to graphics preferences)
    bool isRelevant();

    // point at which environment map was last generated from (in agent space)
    LLVector4a mOrigin;
    
    // distance from main viewer camera
    F32 mDistance = -1.f;

    // Minimum and maximum depth in current render camera
    F32 mMinDepth = -1.f;
    F32 mMaxDepth = -1.f;

    // radius of this probe's affected area
    F32 mRadius = 16.f;

    // last time this probe was updated (or when its update timer got reset)
    F32 mLastUpdateTime = 0.f;

    // last time this probe was bound for rendering
    F32 mLastBindTime = 0.f;

    // cube map used to sample this environment map
    LLPointer<LLCubeMapArray> mCubeArray;
    S32 mCubeIndex = -1; // index into cube map array or -1 if not currently stored in cube map array
    
    // probe has had at least one full update and is ready to render
    bool mComplete = false;

    // fade in parameter for this probe
    F32 mFadeIn = 0.f;

    // index into array packed by LLReflectionMapManager::getReflectionMaps
    // WARNING -- only valid immediately after call to getReflectionMaps
    S32 mProbeIndex = -1;

    // set of any LLReflectionMaps that intersect this map (maintained by LLReflectionMapManager
    std::vector<LLReflectionMap*> mNeighbors;

    // spatial group this probe is tracking (if any)
    LLSpatialGroup* mGroup = nullptr;

    // viewer object this probe is tracking (if any)
    LLViewerObject* mViewerObject = nullptr;

    // what priority should this probe have (higher is higher priority)
    // currently only 0 or 1
    // 0 - automatic probe
    // 1 - manual probe
    U32 mPriority = 0;

    // occlusion culling state
    GLuint mOcclusionQuery = 0;
    bool mOccluded = false;
    U32 mOcclusionPendingFrames = 0;
    
    ProbeType mType;
};