File: SunLighting.cpp

package info (click to toggle)
spring 103.0%2Bdfsg2-1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 43,720 kB
  • ctags: 63,685
  • sloc: cpp: 368,283; ansic: 33,988; python: 12,417; java: 12,203; awk: 5,879; sh: 1,846; xml: 655; perl: 405; php: 211; objc: 194; makefile: 77; sed: 2
file content (127 lines) | stat: -rw-r--r-- 3,165 bytes parent folder | download
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
/* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */

#include <cassert>

#include "SunLighting.h"

#include "Map/MapInfo.h"
#include "System/EventHandler.h"
#include "System/Sync/HsiehHash.h"

/**
 * @brief sunLightingInst
 *
 * Global instance of CSunLighting
 */
CSunLighting sunLightingInst;

CSunLighting::CSunLighting() {
	colors[0] = &groundAmbientColor;
	colors[1] = &groundDiffuseColor;
	colors[2] = &groundSpecularColor;

	colors[3] = &unitAmbientColor;
	colors[4] = &unitDiffuseColor;
	colors[5] = &unitSpecularColor;
}

// need an explicit copy-ctor because of colors[]
CSunLighting::CSunLighting(const CSunLighting& sl) {
	colors[0] = &groundAmbientColor;
	colors[1] = &groundDiffuseColor;
	colors[2] = &groundSpecularColor;

	colors[3] = &unitAmbientColor;
	colors[4] = &unitDiffuseColor;
	colors[5] = &unitSpecularColor;

	Copy(sl);
}

CSunLighting& CSunLighting::operator = (const CSunLighting& sl) {
	Copy(sl);
	return (*this);
}


void CSunLighting::Init() {
	assert(mapInfo != nullptr);
	assert(IsGlobalInstance());

	const CMapInfo::light_t& light = mapInfo->light;

	groundAmbientColor   = light.groundAmbientColor;
	groundDiffuseColor   = light.groundDiffuseColor;
	groundSpecularColor  = light.groundSpecularColor;

	unitAmbientColor     = light.unitAmbientColor;
	unitDiffuseColor     = light.unitDiffuseColor;
	unitSpecularColor    = light.unitSpecularColor;

	specularExponent     = light.specularExponent;
}

void CSunLighting::Copy(const CSunLighting& sl) {
	assert(   colors[0] == &   groundAmbientColor);
	assert(sl.colors[0] == &sl.groundAmbientColor);

	if (sl == (*this))
		return;

	for (unsigned int n = 0; n < sizeof(colors) / sizeof(colors[0]); n++)
		*colors[n] = *sl.colors[n];

	specularExponent = sl.specularExponent;

	if (!IsGlobalInstance())
		return;

	// send event only if at least one value was changed for the global instance
	eventHandler.SunChanged();
}


bool CSunLighting::SetValue(unsigned int keyHash, const float4 value) {
	static const unsigned int keyHashes[] = {
		HsiehHash("groundAmbientColor",  sizeof("groundAmbientColor" ) - 1, 0),
		HsiehHash("groundDiffuseColor",  sizeof("groundDiffuseColor" ) - 1, 0),
		HsiehHash("groundSpecularColor", sizeof("groundSpecularColor") - 1, 0),

		HsiehHash("unitAmbientColor",  sizeof("unitAmbientColor" ) - 1, 0),
		HsiehHash("unitDiffuseColor",  sizeof("unitDiffuseColor" ) - 1, 0),
		HsiehHash("unitSpecularColor", sizeof("unitSpecularColor") - 1, 0),

		HsiehHash("specularExponent", sizeof("specularExponent") - 1, 0),
	};

	// special case
	if (keyHash == keyHashes[6]) {
		specularExponent = value.x;
		return true;
	}

	for (unsigned int n = 0; n < sizeof(colors) / sizeof(colors[0]); n++) {
		if (keyHash == keyHashes[n]) {
			*(colors[n]) = value;
			return true;
		}
	}

	return false;
}


bool CSunLighting::operator == (const CSunLighting& sl) const {
	for (unsigned int n = 0; n < sizeof(colors) / sizeof(colors[0]); n++) {
		if (colors[n] != sl.colors[n]) {
			return false;
		}
	}

	return (specularExponent == sl.specularExponent);
}

bool CSunLighting::IsGlobalInstance() const {
	return (this == &sunLightingInst);
}