aboutsummaryrefslogtreecommitdiff
path: root/engines/bladerunner/light.cpp
blob: d1d79b870b9b749934f6a9d2531f70a196ea18fa (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
#include "bladerunner/light.h"

namespace BladeRunner {

Light::Light()
{
}

Light::~Light()
{
}

void Light::read(Common::ReadStream* stream, int framesCount, int frame, int animated)
{
	_framesCount = framesCount;
	_animated = animated;

	int size = stream->readUint32LE();
	size = size - 32;

	stream->read(_name, 20);

	_animatedParameters = stream->readUint32LE();

	_animationData = new float[size / sizeof(float)];
	stream->read(_animationData, size);

	_m11ptr = _animationData;
	_m12ptr = _m11ptr + (_animatedParameters & 0x1 ? framesCount : 1);
	_m13ptr = _m12ptr + (_animatedParameters & 0x2 ? framesCount : 1);
	_m14ptr = _m13ptr + (_animatedParameters & 0x4 ? framesCount : 1);
	_m21ptr = _m14ptr + (_animatedParameters & 0x8 ? framesCount : 1);
	_m22ptr = _m21ptr + (_animatedParameters & 0x10 ? framesCount : 1);
	_m23ptr = _m22ptr + (_animatedParameters & 0x20 ? framesCount : 1);
	_m24ptr = _m23ptr + (_animatedParameters & 0x40 ? framesCount : 1);
	_m31ptr = _m24ptr + (_animatedParameters & 0x80 ? framesCount : 1);
	_m32ptr = _m31ptr + (_animatedParameters & 0x100 ? framesCount : 1);
	_m33ptr = _m32ptr + (_animatedParameters & 0x200 ? framesCount : 1);
	_m34ptr = _m33ptr + (_animatedParameters & 0x400 ? framesCount : 1);
	_colorRPtr = _m34ptr + (_animatedParameters & 0x800 ? framesCount : 1);
	_colorGPtr = _colorRPtr + (_animatedParameters & 0x1000 ? framesCount : 1);
	_colorBPtr = _colorGPtr + (_animatedParameters & 0x2000 ? framesCount : 1);
	_field16ptr = _colorGPtr + (_animatedParameters & 0x4000 ? framesCount : 1);
	_field17ptr = _field16ptr + (_animatedParameters & 0x8000 ? framesCount : 1);
	_field18ptr = _field17ptr + (_animatedParameters & 0x10000 ? framesCount : 1);
	_field19ptr = _field18ptr + (_animatedParameters & 0x20000 ? framesCount : 1);

	setupFrame(frame);
}

void Light::readVqa(Common::ReadStream* stream, int framesCount, int frame, int animated)
{
	_framesCount = framesCount;
	_animated = animated;

	_animatedParameters = stream->readUint32LE();

	int size = stream->readUint32LE();

	_animationData = new float[size / sizeof(float)];
	stream->read(_animationData, size);

	_m11ptr = _animationData;
	_m12ptr = _m11ptr + (_animatedParameters & 0x1 ? framesCount : 1);
	_m13ptr = _m12ptr + (_animatedParameters & 0x2 ? framesCount : 1);
	_m14ptr = _m13ptr + (_animatedParameters & 0x4 ? framesCount : 1);
	_m21ptr = _m14ptr + (_animatedParameters & 0x8 ? framesCount : 1);
	_m22ptr = _m21ptr + (_animatedParameters & 0x10 ? framesCount : 1);
	_m23ptr = _m22ptr + (_animatedParameters & 0x20 ? framesCount : 1);
	_m24ptr = _m23ptr + (_animatedParameters & 0x40 ? framesCount : 1);
	_m31ptr = _m24ptr + (_animatedParameters & 0x80 ? framesCount : 1);
	_m32ptr = _m31ptr + (_animatedParameters & 0x100 ? framesCount : 1);
	_m33ptr = _m32ptr + (_animatedParameters & 0x200 ? framesCount : 1);
	_m34ptr = _m33ptr + (_animatedParameters & 0x400 ? framesCount : 1);
	_colorRPtr = _m34ptr + (_animatedParameters & 0x800 ? framesCount : 1);
	_colorGPtr = _colorRPtr + (_animatedParameters & 0x1000 ? framesCount : 1);
	_colorBPtr = _colorGPtr + (_animatedParameters & 0x2000 ? framesCount : 1);
	_field16ptr = _colorGPtr + (_animatedParameters & 0x4000 ? framesCount : 1);
	_field17ptr = _field16ptr + (_animatedParameters & 0x8000 ? framesCount : 1);
	_field18ptr = _field17ptr + (_animatedParameters & 0x10000 ? framesCount : 1);
	_field19ptr = _field18ptr + (_animatedParameters & 0x20000 ? framesCount : 1);

	setupFrame(frame);
}

void Light::setupFrame(int frame)
{
	int offset = frame % _framesCount;
	_matrix._m[0][0] = (_animatedParameters & 0x1 ? _m11ptr[offset] : *_m11ptr);
	_matrix._m[0][1] = (_animatedParameters & 0x2 ? _m12ptr[offset] : *_m12ptr);
	_matrix._m[0][2] = (_animatedParameters & 0x4 ? _m13ptr[offset] : *_m13ptr);
	_matrix._m[0][3] = (_animatedParameters & 0x8 ? _m14ptr[offset] : *_m14ptr);
	_matrix._m[1][0] = (_animatedParameters & 0x10 ? _m21ptr[offset] : *_m21ptr);
	_matrix._m[1][1] = (_animatedParameters & 0x20 ? _m22ptr[offset] : *_m22ptr);
	_matrix._m[1][2] = (_animatedParameters & 0x40 ? _m23ptr[offset] : *_m23ptr);
	_matrix._m[1][3] = (_animatedParameters & 0x80 ? _m24ptr[offset] : *_m24ptr);
	_matrix._m[2][0] = (_animatedParameters & 0x100 ? _m31ptr[offset] : *_m31ptr);
	_matrix._m[2][1] = (_animatedParameters & 0x200 ? _m32ptr[offset] : *_m32ptr);
	_matrix._m[2][2] = (_animatedParameters & 0x400 ? _m33ptr[offset] : *_m33ptr);
	_matrix._m[2][3] = (_animatedParameters & 0x800 ? _m34ptr[offset] : *_m34ptr);
	_color.r = (_animatedParameters & 0x1000 ? _colorRPtr[offset] : *_colorRPtr);
	_color.g = (_animatedParameters & 0x2000 ? _colorGPtr[offset] : *_colorGPtr);
	_color.b = (_animatedParameters & 0x4000 ? _colorBPtr[offset] : *_colorBPtr);
	_field16 = (_animatedParameters & 0x8000 ? _field16ptr[offset] : *_field16ptr);
	_field17 = (_animatedParameters & 0x10000 ? _field17ptr[offset] : *_field17ptr);
	_field18 = (_animatedParameters & 0x20000 ? _field18ptr[offset] : *_field18ptr);
	_field19 = (_animatedParameters & 0x40000 ? _field19ptr[offset] : *_field19ptr);

}

float Light::attenuation(float min, float max, float distance)
{
	return 0.0;
}

} // End of namespace BladeRunner