summaryrefslogtreecommitdiff
path: root/indra/newview/llscenemonitor.h
blob: f43c455f2fd1159772806a2e9abad9b89e9ba093 (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
/** 
 * @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