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
|
/**
* @file llscenemonitor.h
* @brief monitor the process of scene loading
*
* $LicenseInfo:firstyear=2003&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2010, 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$
*/
#ifndef LL_LLSCENE_MONITOR_H
#define LL_LLSCENE_MONITOR_H
#include "llsingleton.h"
#include "llmath.h"
#include "llfloater.h"
#include "llcharacter.h"
#include "lltracerecording.h"
class LLCharacter;
class LLRenderTarget;
class LLViewerTexture;
class LLSceneMonitor : public LLSingleton<LLSceneMonitor>
{
LOG_CLASS(LLSceneMonitor);
public:
LLSceneMonitor();
~LLSceneMonitor();
void destroyClass();
void freezeAvatar(LLCharacter* avatarp);
void setDebugViewerVisible(bool visible);
void capture(); //capture the main frame buffer
void compare(); //compare the stored two buffers.
void fetchQueryResult();
void calcDiffAggregate();
void setDiffTolerance(F32 tol) {mDiffTolerance = tol;}
const LLRenderTarget* getDiffTarget() const {return mDiff;}
F32 getDiffTolerance() const {return mDiffTolerance;}
F32 getDiffResult() const { return mDiffResult;}
F32 getDiffPixelRatio() const { return mDiffPixelRatio;}
bool isEnabled()const {return mEnabled;}
bool needsUpdate() const;
LLTrace::ExtendablePeriodicRecording* getRecording() const {return mRecording;}
void dumpToFile(std::string file_name);
bool hasResults() const { return mRecording->getAcceptedRecording().getDuration() != 0;}
private:
void freezeScene();
void unfreezeScene();
void reset();
LLRenderTarget& getCaptureTarget();
void generateDitheringTexture(S32 width, S32 height);
void addMonitorResult();
private:
bool mEnabled;
bool mDebugViewerVisible;
enum EDiffState
{
WAITING_FOR_NEXT_DIFF,
NEED_DIFF,
EXECUTE_DIFF,
WAIT_ON_RESULT,
VIEWER_QUITTING
} mDiffState;
LLRenderTarget* mFrames[2];
LLRenderTarget* mDiff;
GLuint mQueryObject; //used for glQuery
F32 mDiffResult; //aggregate results of mDiff.
F32 mDiffTolerance; //pixels are filtered out when R+G+B < mDiffTolerance
F32 mDiffPixelRatio; //ratio of pixels used for comparison against the original mDiff size along one dimension
LLPointer<LLViewerTexture> mDitheringTexture;
S32 mDitherMatrixWidth;
F32 mDitherScale;
F32 mDitherScaleS;
F32 mDitherScaleT;
std::vector<LLAnimPauseRequest> mAvatarPauseHandles;
LLTrace::ExtendablePeriodicRecording* mRecording;
//---------------------------------------
typedef struct _monitor_result
{
F32 mTimeStamp;
F32 mDiff;
} ll_monitor_result_t;
std::vector<ll_monitor_result_t> mMonitorResults;
};
class LLSceneMonitorView : public LLFloater
{
public:
LLSceneMonitorView(const LLRect& rect);
virtual void draw();
virtual void onVisibilityChange(BOOL visible);
protected:
virtual void onClickCloseBtn();
};
extern LLSceneMonitorView* gSceneMonitorView;
#endif
|