ScummVM API documentation
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
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 
27 namespace Scumm {
28 
29 #define SPRDEF_DUMB 0
30 #define SPRDEF_SMART 1
31 #define SPRDEF_SIMPLE 2
32 
33 enum 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 
55 enum SpriteGroupFlags {
56  kSGFUseClipRect = 0x00000001
57 };
58 
59 enum 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 
67 enum SpriteGroupPropertySubOps {
68  SPRGRPPROP_XMUL = 0,
69  SPRGRPPROP_XDIV = 1,
70  SPRGRPPROP_YMUL = 2,
71  SPRGRPPROP_YDIV = 3,
72 };
73 
74 enum 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 
85 enum 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 
92 enum 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 
105 struct 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 
179 struct SpriteImageList {
180  int16 list[32];
181  int16 count;
182 };
183 
184 struct 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 
216 class ScummEngine_v90he;
217 
218 class Sprite : public Common::Serializable {
219 public:
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 buildActiveSpriteList();
240  void renderSprites(bool negativeOrPositiveRender);
241  void runSpriteEngines();
242 
243  int spriteFromPoint(int x, int y, int spriteGroupId, int d, int num, int *args);
244  int getSpriteClass(int spriteId, int num);
245  int checkSpriteClassAgaintClassSet(int sprite, int classCount, int *classCheckTable);
246  int getSpriteRenderToBackground(int spriteId);
247  int getSpriteVertFlip(int spriteId);
248  int getSpriteHorzFlip(int spriteId);
249  int getSpriteActiveFlag(int spriteId);
250  int getSpriteImageRemapFlag(int spriteId);
251  int getSpriteAutoAnimFlag(int spriteId);
252  int getSpriteUpdateType(int spriteId);
253  int getSpriteEraseType(int spriteId);
254  int getSpriteImage(int spriteId);
255  int getSpriteImageState(int spriteId);
256  int getSpriteGroup(int spriteId);
257  int getSpritePalette(int spriteId);
258  int getSpritePriority(int spriteId);
259  int getSpriteDisplayX(int spriteId);
260  int getSpriteDisplayY(int spriteId);
261  int getUserValue(int spriteId);
262  int getSpriteShadow(int spriteId);
263  int getSpriteImageStateCount(int spriteId);
264  int getSpriteScale(int spriteId);
265  int getSpriteAnimSpeed(int spriteId);
266  int getSourceImage(int spriteId);
267  int getMaskImage(int spriteId);
268  int getSpriteGeneralProperty(int spriteId, int type);
269  int getDestImageForSprite(const SpriteInfo *spritePtr);
270  int getSpriteAnimSpeedState(int sprite);
271  void getSpriteLogicalRect(int sprite, Common::Rect *rectPtr);
272  void getSpriteDrawRect(int sprite, Common::Rect *rectPtr);
273  void getSpriteImageDim(int spriteId, int32 &w, int32 &h);
274  void getSpritePosition(int spriteId, int32 &tx, int32 &ty);
275  void getSpriteRectPrim(const SpriteInfo *spritePtr, Common::Rect *rectPtr, bool includeGroupTransform, const Common::Point *spotPtr);
276  void getDelta(int spriteId, int32 &dx, int32 &dy);
277  void calcSpriteSpot(const SpriteInfo *spritePtr, bool includeGroupTransform, int32 &x, int32 &y);
278 
279  int getGroupPriority(int spriteGroupId);
280  int getGroupImage(int spriteGroupId);
281  int getGroupXMul(int spriteGroupId);
282  int getGroupXDiv(int spriteGroupId);
283  int getGroupYMul(int spriteGroupId);
284  int getGroupYDiv(int spriteGroupId);
285  void getGroupPoint(int spriteGroupId, int32 &tx, int32 &ty);
286  int getGroupGeneralProperty(int group, int property);
287 
288  void setSpritePalette(int spriteId, int value);
289  void setSourceImage(int spriteId, int value);
290  void setMaskImage(int spriteId, int value);
291  void newSprite(int spriteId);
292  void setSpriteImageState(int spriteId, int value);
293  void setSpritePosition(int spriteId, int value1, int value2);
294  void setSpriteGroup(int spriteId, int value);
295  void setDelta(int spriteId, int value1, int value2);
296  void setSpriteShadow(int spriteId, int value);
297  void setUserValue(int spriteId, int value1, int value2);
298  void setSpritePriority(int spriteId, int value);
299  void moveSprite(int spriteId, int value1, int value2);
300  void setSpriteScale(int spriteId, int value);
301  void setSpriteAngle(int spriteId, int value);
302  void setSpriteRenderToBackground(int spriteId, int value);
303  void setSpriteVertFlip(int spriteId, int value);
304  void setSpriteHorzFlip(int spriteId, int value);
305  void setSpriteActiveFlag(int spriteId, int value);
306  void setSpriteImageRemapFlag(int spriteId, int value);
307  void setSpriteAutoAnimFlag(int spriteId, int value);
308  void setSpriteUpdateType(int spriteId, int value);
309  void setSpriteEraseType(int spriteId, int value);
310  void setSpriteAnimSpeed(int spriteId, int value);
311  void setSpriteClass(int spriteId, int classId, int toggle);
312  void clearSpriteClasses(int spriteId);
313  void setSpriteZBuffer(int spriteId, int value);
314  void setSpriteAnimSpeedState(int spriteId, int animState);
315  void setSpriteGeneralProperty(int spriteId, int type, int value);
316  void setImageList(int sprite, int count, const int *list);
317 
318  void moveGroupMembers(int spriteGroupId, int value1, int value2);
319  void orInGroupMembersFlags(int spriteGroupId, int32 flags);
320  void setGroupMembersPriority(int spriteGroupId, int value);
321  void changeGroupMembersGroup(int spriteGroupId, int value);
322  void setGroupMembersUpdateType(int spriteGroupId, int value);
323  void performNewOnGroupMembers(int spriteGroupId);
324  void setGroupMembersAnimationSpeed(int spriteGroupId, int value);
325  void setGroupMembersAutoAnimFlag(int spriteGroupId, int value);
326  void setGroupMembersShadow(int spriteGroupId, int value);
327 
328  void moveGroup(int spriteGroupId, int value1, int value2);
329  void setGroupClipRect(int spriteGroupId, int x1, int y1, int x2, int y2);
330  void setGroupPriority(int spriteGroupId, int value);
331  void setGroupPoint(int spriteGroupId, int value1, int value2);
332  void setGroupImage(int spriteGroupId, int value);
333  void setGroupScaling(int spriteGroupId);
334  void setGroupXMul(int spriteGroupId, int value);
335  void setGroupXDiv(int spriteGroupId, int value);
336  void setGroupYMul(int spriteGroupId, int value);
337  void setGroupYDiv(int spriteGroupId, int value);
338 
339  int pixelPerfectSpriteCollisionCheck(int spriteA, int deltaAX, int deltaAY, int spriteB, int deltaBX, int deltaBY);
340 
341  void clearGroupClipRect(int spriteGroupId);
342  void clearGroupScaleInfo(int group);
343 
344  void resetImageLists();
345  SpriteImageList *getImageListPtr(int imageList);
346  int getFreeImageList(int imageCount);
347  void releaseImageList(int imageList);
348 
349  void initializeStuff(int numSprites, int numGroups, int numMaxSprites);
350  void newGroup(int spriteGroupId);
351  void resetSpriteSystem(bool refreshScreen);
352 
353  void setSpriteImage(int spriteId, int imageNum);
354 private:
355  ScummEngine_v90he *_vm;
356 };
357 
358 } // End of namespace Scumm
359 
360 #endif
int16 right
Definition: rect.h:146
Definition: rect.h:144
Definition: serializer.h:79
Graphics::Surface * scale(const Graphics::Surface &srcImage, int xSize, int ySize)
Definition: rect.h:45
int16 left
Definition: rect.h:145
Definition: serializer.h:308
int16 x
Definition: rect.h:46
int16 y
Definition: rect.h:47
Definition: actor.h:30