@@ -42,6 +42,7 @@ void MOSprite::Clear() {
42
42
m_SettleMaterialDisabled = false ;
43
43
m_pEntryWound = 0 ;
44
44
m_pExitWound = 0 ;
45
+ m_SpriteModified = false ;
45
46
}
46
47
47
48
int MOSprite::Create () {
@@ -235,6 +236,12 @@ void MOSprite::Destroy(bool notInherited) {
235
236
// delete m_pEntryWound; Not doing this anymore since we're not owning
236
237
// delete m_pExitWound;
237
238
239
+ if (m_SpriteModified) {
240
+ for (BITMAP* sprite : m_aSprite) {
241
+ destroy_bitmap (sprite);
242
+ }
243
+ }
244
+
238
245
if (!notInherited)
239
246
MovableObject::Destroy ();
240
247
Clear ();
@@ -351,13 +358,36 @@ Vector MOSprite::UnRotateOffset(const Vector& offset) const {
351
358
return rotOff;
352
359
}
353
360
354
- std::vector<Vector>* MOSprite::GetAllPixelPositions (const Vector& origin, float angle, bool hflipped, bool includeTransparency, unsigned int whichFrame) {
361
+ void MOSprite::SetPixelIndex (int x, int y, unsigned int whichFrame, int colorIndex, int ignoreIndex, bool invert) {
362
+ if (!m_SpriteModified) {
363
+ std::vector<BITMAP*> spriteList;
364
+
365
+ for (BITMAP* sprite: m_aSprite) {
366
+ BITMAP* spriteCopy = create_bitmap_ex (8 , sprite->w , sprite->h );
367
+ rectfill (spriteCopy, 0 , 0 , spriteCopy->w - 1 , spriteCopy->h - 1 , 0 );
368
+ draw_sprite (spriteCopy, sprite, 0 , 0 );
369
+ spriteList.push_back (spriteCopy);
370
+ }
371
+
372
+ m_aSprite = spriteList;
373
+ m_SpriteModified = true ;
374
+ }
375
+
376
+ BITMAP* targetSprite = m_aSprite[CLAMP (m_FrameCount - 1 , 0 , whichFrame)];
377
+ if (ignoreIndex < 0 || (getpixel (targetSprite, x, y) == ignoreIndex) != invert) {
378
+ putpixel (targetSprite, x, y, colorIndex);
379
+ }
380
+ }
381
+
382
+ std::vector<Vector>* MOSprite::GetAllPixelPositions (const Vector& origin, float angle, bool hflipped, unsigned int whichFrame, int ignoreIndex, bool invert) {
355
383
std::vector<Vector>* posList = new std::vector<Vector>();
356
384
CLAMP (m_FrameCount - 1 , 0 , whichFrame);
357
385
BITMAP* sprite = m_aSprite[whichFrame];
358
- BITMAP* temp = create_bitmap_ex (8 , m_SpriteDiameter * m_Scale , m_SpriteDiameter * m_Scale );
386
+ BITMAP* temp = create_bitmap_ex (8 , m_SpriteDiameter, m_SpriteDiameter);
359
387
rectfill (temp, 0 , 0 , temp->w - 1 , temp->h - 1 , 0 );
360
- Vector offset = Vector (temp->w / 2 + m_SpriteOffset.m_X , temp->h / 2 + m_SpriteOffset.m_Y );
388
+ Vector tempCentre = Vector (temp->w / 2 , temp->h / 2 );
389
+ Vector spriteCentre = Vector (sprite->w / 2 , sprite->h / 2 );
390
+ Vector offset = (tempCentre + (m_SpriteOffset + spriteCentre).GetXFlipped (m_HFlipped).RadRotate (m_Rotation.GetRadAngle ()) - spriteCentre);
361
391
362
392
if (!hflipped) {
363
393
rotate_scaled_sprite (temp, sprite, offset.m_X , offset.m_Y , ftofix (GetAllegroAngle (-m_Rotation.GetDegAngle ())), ftofix (m_Scale));
@@ -368,15 +398,14 @@ std::vector<Vector>* MOSprite::GetAllPixelPositions(const Vector& origin, float
368
398
for (int y = 0 ; y < temp->h ; y++) {
369
399
for (int x = 0 ; x < temp->w ; x++) {
370
400
int pixelIndex = getpixel (temp, x, y);
371
- if (includeTransparency || pixelIndex > 0 ) {
372
- Vector pixelPos = (Vector (x - temp-> w / 2 , y - temp-> h / 2 ) ) + origin;
373
- posList->push_back (pixelPos. GetRounded () );
401
+ if (pixelIndex >= 0 && (pixelIndex != ignoreIndex) != invert ) {
402
+ Vector pixelPos = (Vector (x, y) - tempCentre ) + origin;
403
+ posList->push_back (pixelPos);
374
404
}
375
405
}
376
406
}
377
407
378
408
destroy_bitmap (temp);
379
- temp = NULL ;
380
409
return posList;
381
410
}
382
411
0 commit comments