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
|
/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
#ifndef BLADERUNNER_SLICE_RENDERER_H
#define BLADERUNNER_SLICE_RENDERER_H
#include "bladerunner/color.h"
#include "bladerunner/vector.h"
#include "bladerunner/view.h"
#include "bladerunner/matrix.h"
#include "common/rect.h"
#include "graphics/surface.h"
namespace Common {
class MemoryReadStream;
}
namespace BladeRunner {
class ScreenEffects;
class BladeRunnerEngine;
class Lights;
class SetEffects;
class SliceRenderer {
BladeRunnerEngine *_vm;
int _animation;
int _frame;
Vector3 _position;
float _facing;
float _scale;
ScreenEffects *_screenEffects;
View *_view;
Lights *_lights;
SetEffects *_setEffects;
void *_sliceFramePtr;
// Animation frame data
Vector2 _frameScale;
float _frameBottomZ;
Vector2 _framePos;
float _frameSliceHeight;
uint32 _framePaletteIndex;
uint32 _frameSliceCount;
Matrix3x2 _mvpMatrix;
Vector3 _startScreenVector;
Vector3 _endScreenVector;
float _startSlice;
float _endSlice;
Common::Rect _screenRectangle;
int _m11lookup[256];
int _m12lookup[256];
int _m13;
int _m21lookup[256];
int _m22lookup[256];
int _m23;
bool _animationsShadowEnabled[997];
Vector3 _shadowPolygonDefault[12];
Vector3 _shadowPolygonCurrent[12];
Color _setEffectColor;
Color _lightsColor;
Graphics::PixelFormat _pixelFormat;
public:
SliceRenderer(BladeRunnerEngine *vm);
~SliceRenderer();
void setScreenEffects(ScreenEffects *aesc);
void setView(View *view);
void setLights(Lights *lights);
void setSetEffects(SetEffects *setEffects);
void setupFrameInWorld(int animationId, int animationFrame, Vector3 position, float facing, float scale = 1.0f);
void getScreenRectangle(Common::Rect *screenRectangle, int animationId, int animationFrame, Vector3 position, float facing, float scale);
void drawInWorld(int animationId, int animationFrame, Vector3 position, float facing, float scale, Graphics::Surface &surface, uint16 *zbuffer);
void drawOnScreen(int animationId, int animationFrame, int screenX, int screenY, float facing, float scale, Graphics::Surface &surface);
void preload(int animationId);
void disableShadows(int *animationsIdsList, int listSize);
private:
void calculateBoundingRect();
Matrix3x2 calculateFacingRotationMatrix();
void loadFrame(int animation, int frame);
void drawSlice(int slice, bool advanced, uint16 *frameLinePtr, uint16 *zbufLinePtr, int y);
void drawShadowInWorld(int transparency, Graphics::Surface &surface, uint16 *zbuffer);
void drawShadowPolygon(int transparency, Graphics::Surface &surface, uint16 *zbuffer);
};
class SliceRendererLights {
Lights *_lights;
Color _cacheColor[20];
float _cacheCounter[20];
float _cacheStart[20];
int _cacheRecalculation;
public:
Color _finalColor;
public:
SliceRendererLights(Lights *lights);
void calculateColorBase(Vector3 position1, Vector3 position2, float height);
void calculateColorSlice(Vector3 position);
};
} // End of namespace BladeRunner
#endif
|