Rotated Sprite Bug PB561 tested x64 /x86 - all OS

Post bugreports for the Windows version here
JHPJHP
Addict
Addict
Posts: 2129
Joined: Sat Oct 09, 2010 3:47 am
Contact:

Re: Rotated Sprite Bug PB561 tested x64 /x86 - all OS

Post by JHPJHP »

Hi,

I received a post from davido letting me know of a similar problem with Death Star Vs Asteroids.

There was an easy fix, ClipSprite before DisplaySprite after RotateSprite.

Tested using the code provided by Demivec:

Code: Select all

...
If show & #showZeroRotation
  RotateSprite(sprite_ID, 0, #PB_Relative)
  show & (%111111111111111111111111 - #showRotation - #showZeroRotation) ;disable #showRotation also
EndIf
ClipSprite(sprite_ID, 0, 0, 600, 100)
...
If show & #showRotation
  RotateSprite(sprite_ID, 1, #PB_Relative)
EndIf
ClipSprite(sprite_ID, 0, 0, 600, 100)
...
walbus
Addict
Addict
Posts: 929
Joined: Sat Mar 02, 2013 9:17 am

Re: Rotated Sprite Bug PB561 tested x64 /x86 - all OS

Post by walbus »

Yep, this is a nice idea !

It looks, on Linux and Mac you see rotated sprites with a negative output coordinate absolutely not, so, i think, this works only on Windows
Make a try with openGL, then on Windows you get the same as on Linux and Mac

Also, at the same, it is available, i think, using offsets for rotated outputs

But, primary, a fix is absolutely needed
2D sprite rotation and output is a fundamental feature, not only for gaming
JHPJHP
Addict
Addict
Posts: 2129
Joined: Sat Oct 09, 2010 3:47 am
Contact:

Re: Rotated Sprite Bug PB561 tested x64 /x86 - all OS

Post by JHPJHP »

Hi walbus,

I tested my previously mentioned solution in Windows 10, macOS Sierra 10.12.6, and Linux Ubuntu 17.04...

Using the code provided by Demivec, all three tests would jump off their rotation axis before ClipSprite was added. After it was added, the rotation worked perfectly; this also fixed the OSX rotation problem I had with my program.
User avatar
Mijikai
Addict
Addict
Posts: 1360
Joined: Sun Sep 11, 2016 2:17 pm

Re: Rotated Sprite Bug PB561 tested x64 /x86 - all OS

Post by Mijikai »

It only works with rectangular sprites...
JHPJHP
Addict
Addict
Posts: 2129
Joined: Sat Oct 09, 2010 3:47 am
Contact:

Re: Rotated Sprite Bug PB561 tested x64 /x86 - all OS

Post by JHPJHP »

Hi Mijikai,

Do you have script I can test against my configuration?

Using ClipSprite fixed an off-axis rotation issue I had with a round (Death Star) sprite in OSX, but the same issue did not occur in Windows.
walbus
Addict
Addict
Posts: 929
Joined: Sat Mar 02, 2013 9:17 am

Re: Rotated Sprite Bug PB561 tested x64 /x86 - all OS

Post by walbus »

@JHPJHP, Mijikai

Hi, yep, this is very interesting
User avatar
J. Baker
Addict
Addict
Posts: 2178
Joined: Sun Apr 27, 2003 8:12 am
Location: USA
Contact:

Re: Rotated Sprite Bug PB561 tested x64 /x86 - all OS

Post by J. Baker »

Not a bug. Sprite rotation is based on a power of 2 sprite. When create a 600x100 sprite, your graphics card is seeing a 1024x1024 sprite. 600's next power of 2 is 1024. So an odd shaped rotated sprite is going to give weird placement/rotation until you readdress its rotation point. Or as I prefer, just use power of 2 sprites. ;)
www.posemotion.com

PureBasic Tools for OS X: PureMonitor, plist Tool, Data Maker & App Chef

Mac: 10.13.6 / 1.4GHz Core 2 Duo / 2GB DDR3 / Nvidia 320M
PC: Win 7 / AMD 64 4000+ / 3GB DDR / Nvidia 720GT


Even the vine knows it surroundings but the man with eyes does not.
User avatar
J. Baker
Addict
Addict
Posts: 2178
Joined: Sun Apr 27, 2003 8:12 am
Location: USA
Contact:

Re: Rotated Sprite Bug PB561 tested x64 /x86 - all OS

Post by J. Baker »

To add to my post I just posted.

In reality, all sprites are power of 2 sprites. That's the only way graphics cards can handle this. So if a game engine or "game maker" shows you otherwise, it's because it has been coded that way but behind the scenes. It (graphics card) is still using power of 2. Non-power of 2 sprites are a waste to processor and memory resources due to the extra code and buffering to the next power of 2. So, just use power of 2 sprites if you want your app/game to be at its peak optimization. Well, at least for sprites. I can not account for your coding habits. :lol: :wink:
www.posemotion.com

PureBasic Tools for OS X: PureMonitor, plist Tool, Data Maker & App Chef

Mac: 10.13.6 / 1.4GHz Core 2 Duo / 2GB DDR3 / Nvidia 320M
PC: Win 7 / AMD 64 4000+ / 3GB DDR / Nvidia 720GT


Even the vine knows it surroundings but the man with eyes does not.
User avatar
Mijikai
Addict
Addict
Posts: 1360
Joined: Sun Sep 11, 2016 2:17 pm

Re: Rotated Sprite Bug PB561 tested x64 /x86 - all OS

Post by Mijikai »

J. Baker wrote:Not a bug. Sprite rotation is based on a power of 2 sprite. When create a 600x100 sprite, your graphics card is seeing a 1024x1024 sprite. 600's next power of 2 is 1024. So an odd shaped rotated sprite is going to give weird placement/rotation until you readdress its rotation point. Or as I prefer, just use power of 2 sprites. ;)

Well the function should work as expected!
There are only 2 solutions:
1. rewrite the function
2. change the docs

Such bugs and are annoying...
Easy but very fast 2D game support through dedicated libraries (DirectX, SDL, ...)
Im actually trying to develop a game - but i already encountered 2 srs bugs...

I think it would be healthy for the dev team to only concentrate on one system (SDL)...
Last edited by Mijikai on Sat Oct 14, 2017 8:46 pm, edited 1 time in total.
walbus
Addict
Addict
Posts: 929
Joined: Sat Mar 02, 2013 9:17 am

Re: Rotated Sprite Bug PB561 tested x64 /x86 - all OS

Post by walbus »

@J. Baker very interesting, thanks for your hints
I am not a gamer, all mostly i use not PB sprites, i must try this with little and larger PB sprites, but primary, i I follow your remarks

So, it is easy, with the new BF routine, i can rotate PB sprites with screen output without any size limits and issues
With a little clever handling, i think, this is a very good solution for many things :lol: :wink:

It gets really funny quickly when it is for all OS' s :shock:
User avatar
Mijikai
Addict
Addict
Posts: 1360
Joined: Sun Sep 11, 2016 2:17 pm

Re: Rotated Sprite Bug PB561 tested x64 /x86 - all OS

Post by Mijikai »

JHPJHP wrote:Hi Mijikai,

Do you have script I can test against my configuration?
...
Im not sure if this is helpful but heres some snipped:

Code: Select all

UsePNGImageDecoder()

Procedure.i Screen(Width.i,Height.i,Title.s)
  Protected Event.i, Style.i = #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered
  If OpenWindow(0,0,0,Width,Height,Title,Style) & InitSprite()
    If OpenWindowedScreen(WindowID(0),0,0,Width,Height,#True,0,0) 
      WindowBounds(0,Width,Height,#PB_Ignore,#PB_Ignore)
      SetFrameRate(60);<- THIS FUNCTION IS ALSO BUGGED - DONT USE IN REAL APP!
      FA = CatchSprite(#PB_Any,?DAT_FA,#PB_Sprite_AlphaBlending) 
      If FA
        Repeat
          Repeat
            Event = WindowEvent()
            Select Event 
              Case #PB_Event_CloseWindow
                End
            EndSelect
          Until Event = #Null
          ClearScreen(0)
          RotateSprite(FA,0.5,#PB_Relative)
          DisplayTransparentSprite(FA,400,150)
          DisplayTransparentSprite(FA,400,150,200,#Red)
          ClipSprite(FA,0,10,18,18)
          DisplayTransparentSprite(FA,400,350)
          DisplayTransparentSprite(FA,400,350,200,#Yellow)
          ClipSprite(FA,#PB_Default,#PB_Default,#PB_Default,#PB_Default)
          FlipBuffers()
        ForEver
      EndIf
    EndIf
  EndIf
EndProcedure

Screen(800,600,#Null$)

DataSection
  DAT_FA:
  ;{ File: fa0.png - Size: 4177 Bytes
  !dw 05089h, 0474Eh, 00A0Dh, 00A1Ah, 00000h, 00D00h, 04849h, 05244h, 00000h, 01200h, 00000h, 04A00h, 00208h, 00000h, 03900h, 09371h, 0009Ah, 00000h, 07406h, 04E52h, 00053h, 000FFh, 000FFh, 037FFh, 01B58h, 0007Dh, 00000h, 07009h, 05948h, 00073h, 00E00h, 000C4h, 00E00h, 001C4h, 02B95h, 01B0Eh, 00000h, 0F10Fh, 04449h, 05441h
  !dw 0C748h, 0E601h, 0190Fh, 000F0h, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0C0FFh, 00020h, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FF00h, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh
  !dw 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 080FFh, 00000h, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 001FFh, 0FFFFh, 000FFh, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h
  !dw 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00002h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00181h, 00001h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00100h, 0FFFFh, 000FFh, 00000h, 00000h, 00000h, 00000h
  !dw 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00002h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00181h, 00001h, 00000h, 00000h, 00000h
  !dw 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00100h, 0FFFFh, 000FFh, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00002h, 00000h, 00000h, 00000h
  !dw 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00200h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h
  !dw 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00002h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 021C1h, 00001h, 00000h, 00000h, 00000h, 00101h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 0FFFFh
  !dw 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 00080h, 0FF00h, 0FFFFh, 020C0h, 0FF00h, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 00002h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h
  !dw 00000h, 07F00h, 0FFFFh, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 080FFh, 00000h, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh
  !dw 0FFFFh, 0FF01h, 0FFFFh, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00200h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h
  !dw 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00181h, 00001h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 0FF00h, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 00080h, 0FF00h, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh
  !dw 0FFFFh, 0FFFFh, 0FFFFh, 002FFh, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 04000h, 00020h, 00000h, 0C100h, 00121h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 0FF01h, 0FFFFh, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h
  !dw 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00100h, 00001h, 0FFFFh, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00200h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00181h, 00001h, 00000h, 00181h, 00001h, 00000h
  !dw 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 0FF01h, 0FFFFh, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00181h, 04001h, 00020h, 00000h, 00000h, 00000h, 0E0C0h, 07F00h, 0FFFFh, 00000h, 00000h, 00000h, 00000h, 00200h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h
  !dw 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 0E03Fh, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 0FF01h, 0FFFFh, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 08100h, 00101h, 00000h, 00000h
  !dw 00000h, 00000h, 07F00h, 0FFFFh, 00000h, 00000h, 00000h, 00000h, 00200h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 08100h, 00101h, 00000h, 00000h, 00000h, 02040h, 07F00h, 00000h, 00181h, 00001h, 00000h, 00000h, 00000h, 00000h, 00002h, 00000h, 00000h, 00000h
  !dw 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 0FF7Fh, 000FFh, 00000h, 02020h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00100h, 0FFFFh, 000FFh, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 08100h, 00101h, 00000h
  !dw 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 0FF7Fh, 000FFh, 00000h, 00002h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 08100h, 00101h, 00000h, 04000h, 00020h, 00000h, 00000h, 00000h, 00000h, 07F00h, 00000h, 00000h, 00000h, 00000h, 00000h, 00200h, 00000h
  !dw 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 08100h, 00101h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 020C1h, 07F00h, 0FFFFh, 00000h, 00000h, 00000h, 0FF01h, 0FFFFh, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00181h, 04001h, 00020h
  !dw 00000h, 0C000h, 000E0h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 07F00h, 0FFFFh, 00000h, 00200h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00181h, 00001h, 00000h, 00000h, 03F00h, 000E0h, 00000h, 00000h, 00000h, 00000h, 04000h, 00020h, 02040h, 04000h, 00020h, 00181h, 00001h
  !dw 00000h, 0FF00h, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh, 020C0h, 0FF00h, 00000h, 020C0h, 0FF00h, 00000h, 000FFh, 0E000h, 00020h, 020C0h, 08000h, 00000h, 00080h, 0FF00h, 00000h, 000FFh, 08000h, 00000h, 0FFFFh, 001FFh, 0FFFFh, 000FFh, 00000h, 00000h, 00000h, 00000h, 00000h, 08100h, 00101h, 02040h, 03F00h
  !dw 000E0h, 00000h, 00000h, 00000h, 00000h, 0C100h, 00020h, 00000h, 0C000h, 000E0h, 02020h, 00000h, 00000h, 0DF5Fh, 000FFh, 00000h, 0FF01h, 0FFFFh, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00181h, 00001h, 00000h, 00000h, 04000h, 00020h, 020E0h, 00000h, 00000h, 0E020h, 00000h, 00000h, 000E0h, 02000h, 00000h, 00020h
  !dw 0A000h, 000E0h, 0FF7Fh, 002FFh, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 04020h, 00000h, 00000h, 02000h, 04000h, 00020h, 00000h, 0C000h, 00000h, 000C0h, 0E000h, 000E0h, 00000h, 0E000h, 00000h, 00000h, 00000h, 00000h, 00002h, 00000h, 00000h, 00000h, 00000h, 00000h, 0C100h, 00121h, 02020h
  !dw 00000h, 00000h, 04020h, 02000h, 00020h, 04000h, 04040h, 00020h, 02020h, 00000h, 00000h, 020E0h, 0E000h, 00000h, 00000h, 07F00h, 0FFFFh, 00000h, 00200h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00020h, 04000h, 00020h, 04000h, 00040h, 04020h, 02000h, 04000h, 00020h, 02020h, 00000h, 00000h
  !dw 00020h, 03F00h, 0FFDFh, 00000h, 00000h, 00000h, 00002h, 00000h, 00000h, 00000h, 00000h, 021C1h, 00001h, 00000h, 02020h, 02000h, 00020h, 02000h, 00000h, 04020h, 02000h, 000C0h, 04020h, 02000h, 04000h, 00020h, 00020h, 00000h, 00000h, 021C1h, 00001h, 00000h, 00000h, 00200h, 00000h, 00000h, 00000h, 021C1h, 0C001h, 000E0h
  !dw 0E0C0h, 00000h, 00000h, 02000h, 00000h, 04000h, 02000h, 000C0h, 00000h, 02000h, 00040h, 04000h, 00000h, 00000h, 000E0h, 0E0C0h, 00000h, 00000h, 00181h, 00001h, 00000h, 00002h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 02020h, 00000h, 00000h, 04000h, 00000h, 00000h, 00000h, 00000h, 0C020h, 020E0h, 00000h
  !dw 00000h, 02000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00200h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 0C000h, 00000h, 020E0h, 00040h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 020C0h, 00000h, 000E0h, 00000h, 00000h, 00000h, 00000h, 08100h, 00101h, 00002h, 00000h, 00000h, 00000h
  !dw 00000h, 00000h, 00000h, 00000h, 02000h, 02000h, 00020h, 00000h, 00000h, 000E0h, 00000h, 00000h, 000E0h, 0E0E0h, 000C0h, 00000h, 04000h, 02000h, 00060h, 020E0h, 00000h, 00000h, 00000h, 00200h, 00000h, 00000h, 00000h, 0E0C0h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 0E0E0h, 00000h, 000E0h, 00000h
  !dw 00000h, 00000h, 00000h, 02000h, 00020h, 02000h, 02000h, 00000h, 00000h, 02000h, 00020h, 00002h, 00000h, 00000h, 00000h, 00000h, 04040h, 00000h, 00000h, 00000h, 00000h, 00000h, 0E0E0h, 02000h, 00020h, 00000h, 00000h, 00000h, 00000h, 00000h, 000E0h, 0E020h, 02000h, 04020h, 00000h, 00000h, 00000h, 00000h, 00200h, 00000h
  !dw 00000h, 00000h, 00000h, 00000h, 00000h, 06060h, 00000h, 000E0h, 0E0E0h, 02000h, 00020h, 0E0E0h, 0E000h, 000E0h, 00000h, 00000h, 000E0h, 0E0E0h, 00000h, 04060h, 0C000h, 0E0C0h, 00000h, 00000h, 05F00h, 0FFDFh, 00004h, 00000h, 00000h, 02000h, 00020h, 0E0A0h, 06000h, 00020h, 0E0E0h, 00000h, 0C0E0h, 0E0E0h, 00000h, 00000h
  !dw 00000h, 00000h, 04000h, 0E0E0h, 04000h, 00020h, 0C000h, 000C0h, 000E0h, 0C0E0h, 00000h, 00000h, 00000h, 00100h, 0FFFFh, 000FFh, 00000h, 00000h, 0A100h, 00121h, 000C0h, 02000h, 00000h, 04020h, 0C000h, 08000h, 0E0E0h, 060C0h, 0C020h, 02000h, 02000h, 000E0h, 0C000h, 0C000h, 000E0h, 00000h, 00000h, 00000h, 0FF7Fh, 000FFh
  !dw 00000h, 00004h, 00000h, 00000h, 00000h, 00000h, 0DF5Fh, 000FFh, 00121h, 000E0h, 0E000h, 000E0h, 02000h, 00000h, 00000h, 000C0h, 02080h, 00000h, 0C020h, 00080h, 00000h, 00000h, 07F00h, 0FFFFh, 00000h, 00000h, 00000h, 00000h, 00100h, 0FFFFh, 000FFh, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00181h, 0C001h
  !dw 04040h, 02020h, 00000h, 00000h, 0E0E0h, 04000h, 0C0C0h, 0FF7Fh, 000FFh, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00002h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 07F00h, 0FFFFh, 00020h, 00000h, 000E0h, 00020h, 00000h, 00000h, 0FF7Fh, 000FFh, 00000h, 00000h, 00000h, 00000h, 00000h
  !dw 00000h, 00000h, 00000h, 00200h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 0C000h, 000E0h, 00000h, 00000h, 02020h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00002h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h
  !dw 00000h, 00000h, 00000h, 02040h, 0C000h, 000E0h, 00000h, 000E0h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00200h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 0C000h, 000E0h, 00000h, 000E0h, 00000h, 000C0h, 00000h, 00000h, 00000h, 00000h
  !dw 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00002h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00020h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00200h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h
  !dw 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00002h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 000E0h, 02000h, 00000h, 00000h, 0E000h, 00000h, 00000h, 00000h
  !dw 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00200h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 0E000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00002h, 00000h, 00000h, 00000h
  !dw 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00020h, 0E000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00200h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 0E000h, 00000h, 0E000h, 00000h, 0C000h, 0E000h
  !dw 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00002h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 000E0h, 00000h, 00020h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00200h, 00000h
  !dw 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 000E0h, 02000h, 02000h, 00000h, 0E000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00002h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 02000h, 00000h, 000E0h
  !dw 00000h, 00000h, 00020h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00200h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 0E000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h
  !dw 00000h, 00002h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 0E000h, 00000h, 00000h, 00000h, 00000h, 00020h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00200h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h
  !dw 00000h, 02000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00002h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 000E0h, 000E0h, 00000h, 000E0h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h
  !dw 00000h, 00000h, 00000h, 00200h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00002h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h
  !dw 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00200h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h
  !dw 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00002h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00200h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h
  !dw 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 000E0h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00002h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 02000h, 00000h, 00000h, 00000h, 00000h
  !dw 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00200h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00002h, 00000h, 00000h, 00000h
  !dw 00000h, 00000h, 00000h, 00000h, 00000h, 06100h, 00141h, 00000h, 00000h, 00020h, 00000h, 00000h, 00000h, 04161h, 00001h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00100h, 0FFFFh, 000FFh, 00000h, 00000h, 00000h, 00000h, 00000h, 06100h, 00141h, 00000h, 00040h, 0C000h, 00000h, 02040h, 00000h, 02000h
  !dw 0E000h, 000E0h, 00000h, 09FC0h, 0FFBFh, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 0FF01h, 0FFFFh, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 02141h, 00001h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 0DFBFh, 000FFh, 00000h, 00000h, 00000h, 00000h, 00000h, 09200h, 01ABAh
  !dw 0CD9Eh, 00CC9h, 00054h, 00000h, 04900h, 04E45h, 0AE44h, 06042h, 00082h
  ;}
EndDataSection
User avatar
J. Baker
Addict
Addict
Posts: 2178
Joined: Sun Apr 27, 2003 8:12 am
Location: USA
Contact:

Re: Rotated Sprite Bug PB561 tested x64 /x86 - all OS

Post by J. Baker »

Maybe this code can help you with what you want. I have not tried it with your 600x100 sprite but I'm sure the code can be adjusted. ;)

Code: Select all

;PureBasic 4.53 LTS

InitSprite()

Procedure RadialSprite(Sprite, X, Y, Offset, Angle, Spin = #False)
  
  Static Degree = 0
  
  Degree + Angle

  If Degree = 360
    Degree = 0
  EndIf
  
  If Spin = #True
    RotateSprite(Sprite, Degree, 0)
  EndIf
  
  DisplaySprite(Sprite, X + Cos(Radian(Degree)) * Offset, Y + Sin(Radian(Degree)) * Offset)
  
EndProcedure

OpenWindow(0, 0, 0, 800, 600, "Rotate Sprite Offset", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, 800, 600, 0, 0, 0)

CreateSprite(1, 256, 256)
StartDrawing(SpriteOutput(1))
  Box(0,0,128,128,$FF0000)
  Box(128,0,128,128,$00FF00)
  Box(0,128,128,128,$0000FF)
  Box(128,128,128,128,$00FFFF)
StopDrawing()
  
CopySprite(1, 2)

Repeat

Event = WindowEvent()

ClearScreen(0)
  
  RadialSprite(1, 384, 160, 150, 2)
  
  ZoomSprite(2, 64, 64)
  RadialSprite(2, 160, 160, 20, 4, #True)
  
FlipBuffers()

Until Event = #PB_Event_CloseWindow
www.posemotion.com

PureBasic Tools for OS X: PureMonitor, plist Tool, Data Maker & App Chef

Mac: 10.13.6 / 1.4GHz Core 2 Duo / 2GB DDR3 / Nvidia 320M
PC: Win 7 / AMD 64 4000+ / 3GB DDR / Nvidia 720GT


Even the vine knows it surroundings but the man with eyes does not.
walbus
Addict
Addict
Posts: 929
Joined: Sat Mar 02, 2013 9:17 am

Re: Rotated Sprite Bug PB561 tested x64 /x86 - all OS

Post by walbus »

Try this very little code,
Its so simple, cool and absolutely worry free

This code create a tilled background and a centric rotating 700x100 masked PB sprite :o

Code: Select all

; Compactness demo - Rotate large sprite on a windowed screen

XIncludeFile("./BucketFill_advanced.pbi")

CompilerIf #PB_Compiler_Debugger : MessageRequester("Debugger", "Please deactivate firstly the debugger !") : End : CompilerEndIf

Macro output_sprites
  degree=(degree+1)%359+1
  If IsSprite(sprite_BF) : FreeSprite(sprite_BF) : EndIf
  sprite_BF=Create_PB_Sprite_simple_BF(sprite_0,-2, 0, degree, 2, 700, 100)
  DisplaySprite(background_sprite, 0, 0)
  DisplayTransparentSprite(sprite_BF, 25, -50)
EndMacro

win_ID=OpenWindow(#PB_Any, 0, 0, 768, 600, "Rotate large sprite on windowed screen", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(win_ID), 0, 0, 768, 600)

sprite_0=CreateSprite(#PB_Any, 256, 256)
StartDrawing(SpriteOutput(sprite_0))
Box(0,0,128,128,$FF0000) : Box(128,0,128,128,$00FF00) : Box(0,128,128,128,$0000FF) : Box(128,128,128,128,$00FFFF)
StopDrawing()
background_sprite=CreateSprite(#PB_Any, 768, 600) : ErrorCheck_BF(BF(-2, background_sprite, sprite_0)) ; Create a tilled background

Repeat
  ClearScreen(0) : output_sprites : FlipBuffers()
Until WindowEvent()=#PB_Event_CloseWindow
JHPJHP
Addict
Addict
Posts: 2129
Joined: Sat Oct 09, 2010 3:47 am
Contact:

Re: Rotated Sprite Bug PB561 tested x64 /x86 - all OS

Post by JHPJHP »

Hi Mijikai,

Thank you for the code sample.
JHPJHP wrote:ClipSprite before DisplaySprite after RotateSprite
Try the following:
- UnClipping the Sprite not needed: ClipSprite(FA,#PB_Default,#PB_Default,#PB_Default,#PB_Default)

Code: Select all

...
RotateSprite(FA,0.5,#PB_Relative)
ClipSprite(FA,0,0,400,150)                       ; Added ClipSprite HERE
DisplayTransparentSprite(FA,400,150)
ClipSprite(FA,0,0,400,150)                       ; Added ClipSprite HERE
DisplayTransparentSprite(FA,400,150,200,#Red)
ClipSprite(FA,0,10,18,18)
DisplayTransparentSprite(FA,400,350)
DisplayTransparentSprite(FA,400,350,200,#Yellow)
...
walbus
Addict
Addict
Posts: 929
Joined: Sat Mar 02, 2013 9:17 am

Re: Rotated Sprite Bug PB561 tested x64 /x86 - all OS

Post by walbus »

Now, this morning, i have a little free time and tested what J.Baker wrote above

Primary, its sure, the graphic card make and can influence ever the output and can make a lot problems

But, however, the graphic card should making a worry free output, without limits, we are not in the year 1990

Handling strange output problems is also definitely not the part from a PB coder

Worry free 2D sprite handling and output is absolutely important and a buggy output a absolutely no go

Now, it looks, the ClipSprite function can fix the rotating output problem

But unfortunately, not ever !

Also, on my machine, i see on openGL a flickering with the workaround, not ever, but often

The absolutely out for the workaround is a other :

Make a negative y offset for the sprite output and the sprite is complete invisible, ever !

But, na egative x offset works, so it is sure, it's a buffer problem

Primary for sprites is, you can parking and moving sprites outside the visible screen !

It looks, i can not use a cpipping based workaround for the negative y output bug

So, i say, the rotating output is definitely buggy on PB

Unfortunately, above Fig written about a other, old, similar bug....
Post Reply