ScummVM API documentation
sprite_he.h
1/* ScummVM - Graphic Adventure Engine
2 *
3 * ScummVM is the legal property of its developers, whose names
4 * are too numerous to list here. Please refer to the COPYRIGHT
5 * file distributed with this source distribution.
6 *
7 * This program is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
19 *
20 */
21
22#if !defined(SCUMM_HE_SPRITE_HE_H) && defined(ENABLE_HE)
23#define SCUMM_HE_SPRITE_HE_H
24
25#include "common/serializer.h"
26
27namespace Scumm {
28
29#define SPRDEF_DUMB 0
30#define SPRDEF_SMART 1
31#define SPRDEF_SIMPLE 2
32
33enum SpriteFlags {
34 kSFErase = 0x00000001,
35 kSFRender = 0x00000002,
36 kSFScaleSpecified = 0x00000010,
37 kSFAngleSpecified = 0x00000020,
38 kSFBackgroundRender = 0x00001000,
39 kSFVFlip = 0x00002000,
40 kSFHFlip = 0x00004000,
41 kSFActive = 0x00008000,
42 kSFUseImageRemap = 0x00080000,
43 kSFAutoAnimate = 0x00200000,
44 kSFSmartRender = 0x00400000,
45 kSFDontAnimImageList = 0x01000000,
46 kSFDontCombineErase = 0x02000000,
47 kSFIgnoreRender = 0x20000000,
48 kSFIgnoreErase = 0x40000000,
49
50 // Defaults
51 kSFDefaultFlagInactive = (kSFErase | kSFDontCombineErase),
52 kSFDefaultFlagActive = (kSFActive | kSFAutoAnimate | kSFSmartRender | kSFDontCombineErase)
53};
54
55enum SpriteGroupFlags {
56 kSGFUseClipRect = 0x00000001
57};
58
59enum SpritePropertySubOps {
60 SPRPROP_HFLIP = 0,
61 SPRPROP_VFLIP = 1,
62 SPRPROP_ACTIVE = 2,
63 SPRPROP_BACKGROUND_RENDER = 3,
64 SPRPROP_USE_IMAGE_REMAP_TABLE = 4,
65};
66
67enum SpriteGroupPropertySubOps {
68 SPRGRPPROP_XMUL = 0,
69 SPRGRPPROP_XDIV = 1,
70 SPRGRPPROP_YMUL = 2,
71 SPRGRPPROP_YDIV = 3,
72};
73
74enum SpriteGroupSubOps {
75 SPRGRPOP_MOVE = 1,
76 SPRGRPOP_ORDER = 2,
77 SPRGRPOP_NEW_GROUP = 3,
78 SPRGRPOP_UPDATE_TYPE = 4,
79 SPRGRPOP_NEW = 5,
80 SPRGRPOP_ANIMATION_SPEED = 6,
81 SPRGRPOP_ANIMATION_TYPE = 7,
82 SPRGRPOP_SHADOW = 8,
83};
84
85enum SpriteProperties {
86 SPRPROP_SPECIAL_RENDER_FLAGS = 123,
87 SPRPROP_SPECIAL_BLEND_FLAGS = 124,
88 SPRPROP_CONDITION_BITS = 125,
89 SPRPROP_ANIMATION_SUB_STATE = 126
90};
91
92enum PolygonOverlapSubOps {
93 OVERLAP_POINT_TO_RECT = 1,
94 OVERLAP_POINT_TO_CIRCLE = 2,
95 OVERLAP_RECT_TO_RECT = 3,
96 OVERLAP_CIRCLE_TO_CIRCLE = 4,
97 OVERLAP_POINT_N_SIDED_POLYGON = 5,
98 OVERLAP_SPRITE_TO_SPRITE = 6,
99 OVERLAP_SPRITE_TO_RECT = 7,
100 OVERLAP_DRAW_POS_SPRITE_TO_SPRITE = 8,
101 OVERLAP_DRAW_POS_SPRITE_TO_RECT = 9,
102 OVERLAP_SPRITE_TO_SPRITE_PIXEL_PERFECT = 10,
103};
104
105struct SpriteInfo {
106 int32 id;
107 int32 combinedPriority;
108 int32 flags;
109 int32 image;
110 int32 state;
111 int32 group;
112 int32 palette;
113 int32 priority;
114 Common::Rect lastRect;
115 int32 deltaPosX;
116 int32 deltaPosY;
117 Common::Point lastSpot;
118 int32 posX;
119 int32 posY;
120 int32 userValue;
121 int32 lastState;
122 int32 lastImage;
123 int32 imageList;
124 int32 shadow;
125 int32 maxStates;
126 int32 angle;
127 int32 scale;
128 int32 animState;
129 int32 lastAngle;
130 int32 lastScale;
131 int32 lastRenderFlags;
132 int32 animIndex;
133 int32 animSpeed;
134 int32 sourceImage;
135 int32 maskImage;
136 int32 zbufferImage;
137 int32 classFlags;
138 int32 specialRenderFlags;
139 int32 conditionBits;
140
141 void reset() {
142 id = 0;
143 combinedPriority = 0;
144 flags = 0;
145 image = 0;
146 state = 0;
147 group = 0;
148 palette = 0;
149 priority = 0;
150 lastRect.top = lastRect.left = lastRect.bottom = lastRect.right = 0;
151 deltaPosX = 0;
152 deltaPosY = 0;
153 lastSpot.x = lastSpot.y = 0;
154 posX = 0;
155 posY = 0;
156 userValue = 0;
157 lastState = 0;
158 lastImage = 0;
159 imageList = 0;
160 shadow = 0;
161 maxStates = 0;
162 angle = 0;
163 scale = 0;
164 animState = 0;
165 lastAngle = 0;
166 lastScale = 0;
167 lastRenderFlags = 0;
168 animIndex = 0;
169 animSpeed = 0;
170 sourceImage = 0;
171 maskImage = 0;
172 zbufferImage = 0;
173 classFlags = 0;
174 specialRenderFlags = 0;
175 conditionBits = 0;
176 }
177};
178
179struct SpriteImageList {
180 int16 list[32];
181 int16 count;
182};
183
184struct SpriteGroup {
185 Common::Rect clipRect;
186 int32 priority;
187 int32 flags;
188 int32 posX;
189 int32 posY;
190 int32 image;
191 int32 isScaled;
192 float xScale;
193 float yScale;
194 int32 xMul;
195 int32 xDiv;
196 int32 yMul;
197 int32 yDiv;
198
199 void reset() {
200 clipRect.top = clipRect.left = clipRect.bottom = clipRect.right = 0;
201 priority = 0;
202 flags = 0;
203 posX = 0;
204 posY = 0;
205 image = 0;
206 isScaled = 0;
207 xScale = 0.0F;
208 yScale = 0.0F;
209 xMul = 0;
210 xDiv = 0;
211 yMul = 0;
212 yDiv = 0;
213 }
214};
215
216class ScummEngine_v90he;
217
218class Sprite : public Common::Serializable {
219public:
220 Sprite(ScummEngine_v90he *vm);
221 ~Sprite() override;
222
223 SpriteInfo *_spriteTable;
224 SpriteGroup *_groupTable;
225 SpriteInfo **_activeSprites;
226 SpriteImageList *_imageLists;
227 int16 *_imageListStack;
228
229 int32 _imageListStackIndex = 0;
230 int32 _activeSpriteCount = 0;
231 int32 _maxSpriteGroups = 0;
232 int32 _maxSprites = 0;
233 int32 _maxImageLists = 0;
234
235 void saveLoadWithSerializer(Common::Serializer &s) override;
236 void eraseSprites();
237 bool doesRectIntersectUpdateAreas(const Common::Rect *rectPtr);
238 void checkForForcedRedraws(bool checkOnlyPositivePriority);
239 void qsortSpriteArray(SpriteInfo **base, uint num);
240 void shortsortSpriteArray(SpriteInfo **lo, SpriteInfo **hi);
241 void buildActiveSpriteList();
242 void renderSprites(bool negativeOrPositiveRender);
243 void runSpriteEngines();
244
245 int spriteFromPoint(int x, int y, int spriteGroupId, int d, int num, int *args);
246 int getSpriteClass(int spriteId, int num);
247 int checkSpriteClassAgaintClassSet(int sprite, int classCount, int *classCheckTable);
248 int getSpriteRenderToBackground(int spriteId);
249 int getSpriteVertFlip(int spriteId);
250 int getSpriteHorzFlip(int spriteId);
251 int getSpriteActiveFlag(int spriteId);
252 int getSpriteImageRemapFlag(int spriteId);
253 int getSpriteAutoAnimFlag(int spriteId);
254 int getSpriteUpdateType(int spriteId);
255 int getSpriteEraseType(int spriteId);
256 int getSpriteImage(int spriteId);
257 int getSpriteImageState(int spriteId);
258 int getSpriteGroup(int spriteId);
259 int getSpritePalette(int spriteId);
260 int getSpritePriority(int spriteId);
261 int getSpriteDisplayX(int spriteId);
262 int getSpriteDisplayY(int spriteId);
263 int getUserValue(int spriteId);
264 int getSpriteShadow(int spriteId);
265 int getSpriteImageStateCount(int spriteId);
266 int getSpriteScale(int spriteId);
267 int getSpriteAnimSpeed(int spriteId);
268 int getSourceImage(int spriteId);
269 int getMaskImage(int spriteId);
270 int getSpriteGeneralProperty(int spriteId, int type);
271 int getDestImageForSprite(const SpriteInfo *spritePtr);
272 int getSpriteAnimSpeedState(int sprite);
273 void getSpriteLogicalRect(int sprite, Common::Rect *rectPtr);
274 void getSpriteDrawRect(int sprite, Common::Rect *rectPtr);
275 void getSpriteImageDim(int spriteId, int32 &w, int32 &h);
276 void getSpritePosition(int spriteId, int32 &tx, int32 &ty);
277 void getSpriteRectPrim(const SpriteInfo *spritePtr, Common::Rect *rectPtr, bool includeGroupTransform, const Common::Point *spotPtr);
278 void getDelta(int spriteId, int32 &dx, int32 &dy);
279 void calcSpriteSpot(const SpriteInfo *spritePtr, bool includeGroupTransform, int32 &x, int32 &y);
280
281 int getGroupPriority(int spriteGroupId);
282 int getGroupImage(int spriteGroupId);
283 int getGroupXMul(int spriteGroupId);
284 int getGroupXDiv(int spriteGroupId);
285 int getGroupYMul(int spriteGroupId);
286 int getGroupYDiv(int spriteGroupId);
287 void getGroupPoint(int spriteGroupId, int32 &tx, int32 &ty);
288 int getGroupGeneralProperty(int group, int property);
289
290 void setSpritePalette(int spriteId, int value);
291 void setSourceImage(int spriteId, int value);
292 void setMaskImage(int spriteId, int value);
293 void newSprite(int spriteId);
294 void setSpriteImageState(int spriteId, int value);
295 void setSpritePosition(int spriteId, int value1, int value2);
296 void setSpriteGroup(int spriteId, int value);
297 void setDelta(int spriteId, int value1, int value2);
298 void setSpriteShadow(int spriteId, int value);
299 void setUserValue(int spriteId, int value1, int value2);
300 void setSpritePriority(int spriteId, int value);
301 void moveSprite(int spriteId, int value1, int value2);
302 void setSpriteScale(int spriteId, int value);
303 void setSpriteAngle(int spriteId, int value);
304 void setSpriteRenderToBackground(int spriteId, int value);
305 void setSpriteVertFlip(int spriteId, int value);
306 void setSpriteHorzFlip(int spriteId, int value);
307 void setSpriteActiveFlag(int spriteId, int value);
308 void setSpriteImageRemapFlag(int spriteId, int value);
309 void setSpriteAutoAnimFlag(int spriteId, int value);
310 void setSpriteUpdateType(int spriteId, int value);
311 void setSpriteEraseType(int spriteId, int value);
312 void setSpriteAnimSpeed(int spriteId, int value);
313 void setSpriteClass(int spriteId, int classId, int toggle);
314 void clearSpriteClasses(int spriteId);
315 void setSpriteZBuffer(int spriteId, int value);
316 void setSpriteAnimSpeedState(int spriteId, int animState);
317 void setSpriteGeneralProperty(int spriteId, int type, int value);
318 void setImageList(int sprite, int count, const int *list);
319
320 void moveGroupMembers(int spriteGroupId, int value1, int value2);
321 void orInGroupMembersFlags(int spriteGroupId, int32 flags);
322 void setGroupMembersPriority(int spriteGroupId, int value);
323 void changeGroupMembersGroup(int spriteGroupId, int value);
324 void setGroupMembersUpdateType(int spriteGroupId, int value);
325 void performNewOnGroupMembers(int spriteGroupId);
326 void setGroupMembersAnimationSpeed(int spriteGroupId, int value);
327 void setGroupMembersAutoAnimFlag(int spriteGroupId, int value);
328 void setGroupMembersShadow(int spriteGroupId, int value);
329
330 void moveGroup(int spriteGroupId, int value1, int value2);
331 void setGroupClipRect(int spriteGroupId, int x1, int y1, int x2, int y2);
332 void setGroupPriority(int spriteGroupId, int value);
333 void setGroupPoint(int spriteGroupId, int value1, int value2);
334 void setGroupImage(int spriteGroupId, int value);
335 void setGroupScaling(int spriteGroupId);
336 void setGroupXMul(int spriteGroupId, int value);
337 void setGroupXDiv(int spriteGroupId, int value);
338 void setGroupYMul(int spriteGroupId, int value);
339 void setGroupYDiv(int spriteGroupId, int value);
340
341 int pixelPerfectSpriteCollisionCheck(int spriteA, int deltaAX, int deltaAY, int spriteB, int deltaBX, int deltaBY);
342
343 void clearGroupClipRect(int spriteGroupId);
344 void clearGroupScaleInfo(int group);
345
346 void resetImageLists();
347 SpriteImageList *getImageListPtr(int imageList);
348 int getFreeImageList(int imageCount);
349 void releaseImageList(int imageList);
350
351 void initializeStuff(int numSprites, int numGroups, int numMaxSprites);
352 void newGroup(int spriteGroupId);
353 void resetSpriteSystem(bool refreshScreen);
354
355 void setSpriteImage(int spriteId, int imageNum);
356private:
357 ScummEngine_v90he *_vm;
358};
359
360} // End of namespace Scumm
361
362#endif
Definition: serializer.h:352
Definition: serializer.h:80
Definition: actor.h:30
T y
Definition: rect.h:49
T x
Definition: rect.h:48
Definition: rect.h:144
T right
Definition: rect.h:171
T left
Definition: rect.h:170
Definition: rect.h:536