Seite 1 von 2

PB_DX9Sprite - Textur-Kachelung - Sprite3D-Färbung

Verfasst: 21.07.2010 21:45
von STARGÅTE
Tachchen,

weil es gerade wieder "hoch kam", würde ich euch bitte mal folgenden Code zu testen.

Quelle: ClipSprite3D for DirectX7 / DirectX9 (x86/x64) (Fluid Byte)

Voraussetzung: DirectX 9 , PB 4.50
Was soll passieren: Ein kleines Sprite3D (32x32), oben links zu sehen, soll mittels ClipSprite3D gekachelt werden und mit RotateSprite3D und ZoomSprite3D behandelt werden wie ein großen Sprite3D,
dabei soll die Kachelung auch innerhalb des anzeigebereiches, sich bewegen.

Code: Alles auswählen

InitSprite()
InitSprite3D()

; DirectX9
Structure D3DTLVERTEX
  x.f:y.f:z.f
  rhw.f:Color.l
  tu.f:tv.f
EndStructure  

Structure PB_DX9Sprite3D
  TexRes.i                    ; TexRes
  Vertice.D3DTLVERTEX[4]      ; The 4 vertices for the rectangle sprite
  TmpVertice.D3DTLVERTEX[4]   ; The 4 vertices for the rectangle sprite
  Width.l                     ; width set with ZoomSprite3D()
  Height.l                    ; height set with ZoomSprite3D()
  RealWidth.l
  RealHeight.l
  Angle.f
  Transformed.l
EndStructure


Procedure ClipSprite3D(Sprite3D, x, y, Width, Height)
  Protected *Sprite3D.PB_DX9Sprite3D = IsSprite3D(Sprite3D)
  With *Sprite3D
    \Vertice[0]\tu = x / \RealWidth
    \Vertice[0]\tv = y / \RealHeight 
    \Vertice[1]\tu = (x + Width) / \RealWidth 
    \Vertice[1]\tv = y / \RealHeight
    \Vertice[2]\tu = x / \RealWidth 
    \Vertice[2]\tv = (y + Height) / \RealHeight 
    \Vertice[3]\tu = (x + Width) / \RealWidth 
    \Vertice[3]\tv = (y + Height) / \RealHeight 
  EndWith
EndProcedure

OpenWindow(0, 0, 0, 800, 600, "SCREEN", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, 800, 600, 0, 0, 0)

  Sprite3DQuality(1)
  
  CreateSprite(1, 32, 32, #PB_Sprite_Texture)
  StartDrawing(SpriteOutput(1))
    Box(0,0,16,16,$FFFF00)
    Box(16,16,16,16,$00FFFF)
  StopDrawing()
  CreateSprite3D(1, 1)


Repeat

  ClearScreen(0)
   
  Start3D()
  
  ClipSprite3D(1, 0, 0, 32, 32)
  RotateSprite3D(1, 0, #PB_Absolute)
  ZoomSprite3D(1, 32, 32)
  DisplaySprite3D(1, 128, 64)

  Time.f = ElapsedMilliseconds()/1000

  ClipSprite3D(1, Mod(Time*50,256), Mod(Time*70,256), 256, 256)
  RotateSprite3D(1, Time*25, #PB_Absolute)
  ZoomSprite3D(1, 256, 256)
  DisplaySprite3D(1, 128, 128)

  Stop3D()

  FlipBuffers()

Until WindowEvent() =  #PB_Event_CloseWindow 
Bild

Wenn dieser Code wirklich nahezu überall läuft, würde ich von nun an diese Art der Kachelung nutzen, statt dem "normalen" For-Schleifen.

Re: ClipSprite3D - Textur-Kachelung - Bitte auf Funktion tes

Verfasst: 21.07.2010 22:03
von Kevin
bei mir funktioniert alles

[OT]wie bist du an die struckturen gekommen D3DTLVERTEX/PB_DX9Sprite3D? [/OT]

Re: ClipSprite3D - Textur-Kachelung - Bitte auf Funktion tes

Verfasst: 21.07.2010 22:04
von STARGÅTE
Sry hab den "Ur-Autor" dieser Funktion vergessen:
ClipSprite3D for DirectX7 / DirectX9 (x86/x64) Fluid Byte
Ich habe einfach nur die Sicherheitsabfragen entfernt :lol:

Re: ClipSprite3D - Textur-Kachelung - Bitte auf Funktion tes

Verfasst: 21.07.2010 22:08
von Kevin
wow danke an dich und nautürlich auch Fluid Byte :D

Re: ClipSprite3D - Textur-Kachelung - Bitte auf Funktion tes

Verfasst: 21.07.2010 22:49
von Fluid Byte
Naja, ich hab' diese Funktion auf DirectX 9 aktualisiert, 64-bit-kompatibel gemacht und diversen Overhead entfernt.
Dennoch ist der "Ur-Author" Stefan Moebius, nicht ich. Ohne seine damalige Arbeit am DirectX 9 Subsystem wäre all dies nicht umzusetzen gewesen.
Der Quelltext dafür ist immer noch online und ist nahezu identisch mit der Implementation die wir heute in PureBasic haben.

Ich kann nur jedem empfehlen sich die Files zu schnappen solange es noch online ist: http://www.purebasic.fr/english/viewtop ... 27&t=22184

@STARGÅTE:
Ich habs zuerst für 64-Bit getestet ...

Geiler LSD-Trip! 8)

Ja, mit 32-Bit funktioniert es wie es soll.

Re: ClipSprite3D - Textur-Kachelung - Bitte auf Funktion tes

Verfasst: 21.07.2010 23:20
von Mok
Im Grunde sollten wir alle André, freak und Fred danken, weil ohne sie gäbs das alles garnicht :mrgreen:

Re: ClipSprite3D - Textur-Kachelung - Bitte auf Funktion tes

Verfasst: 22.07.2010 07:50
von Christian+
Ich habe es mal auf Windows 7 64 Bit getestet mit Pure Basic 32 Bit läuft es super mit Pure Basic 64 Bit nicht da sieht es dann ziemlich seltsam aus.

Edit:
@STARGÅTE du hast einen kleinen Fehler in der Structure PB_DX9Sprite3D gemacht die Variable TexRes.l muss TexRes.i sein dann läuft es auch unter 64 Bit.

Code: Alles auswählen

Structure PB_DX9Sprite3D
  TexRes.i                    ; TexRes
  Vertice.D3DTLVERTEX[4]      ; The 4 vertices for the rectangle sprite
  TmpVertice.D3DTLVERTEX[4]   ; The 4 vertices for the rectangle sprite
  Width.l                     ; width set with ZoomSprite3D()
  Height.l                    ; height set with ZoomSprite3D()
  RealWidth.l
  RealHeight.l
  Angle.f
  Transformed.l
EndStructure

Re: ClipSprite3D - Textur-Kachelung - Bitte auf Funktion tes

Verfasst: 22.07.2010 08:27
von Christian H
Bei mir funktioniert es auch.
Gruß Christian

Systeminformationen
AMD Sempron(tm) 2200+ (1499 MHz)
Betriebssystem: Microsoft Windows XP
DirectX-Version: 9.0c
Informationen über die Grafikkarte
GeForce FX 5200
ForceWare-Version: 175.16
Speicher: 128 MB
Video-BIOS-Version: 4.34.20.18.00
Bus: AGP 8X

Re: ClipSprite3D - Textur-Kachelung - Bitte auf Funktion tes

Verfasst: 22.07.2010 10:01
von STARGÅTE
jo habs geändert, ich hatte noch n ältere version des codes ...

Re: ClipSprite3D - Textur-Kachelung - Bitte auf Funktion tes

Verfasst: 01.08.2010 01:02
von STARGÅTE
Nun spiele ich gerade mit \Color rum, und möchte nun wieder mal wissen, ob bei euch das Sprite3D gefärbt wird:

Code: Alles auswählen

InitSprite()
InitSprite3D()

; DirectX9
Structure D3DTLVERTEX
  x.f:y.f:z.f
  rhw.f:Color.l
  tu.f:tv.f
EndStructure  

Structure PB_DX9Sprite3D
  TexRes.i                    ; TexRes
  Vertice.D3DTLVERTEX[4]      ; The 4 vertices for the rectangle sprite
  TmpVertice.D3DTLVERTEX[4]   ; The 4 vertices for the rectangle sprite
  Width.l                     ; width set with ZoomSprite3D()
  Height.l                    ; height set with ZoomSprite3D()
  RealWidth.l
  RealHeight.l
  Angle.f
  Transformed.l
EndStructure

Procedure ClipSprite3D(Sprite3D, x, y, Width, Height)
  Protected *Sprite3D.PB_DX9Sprite3D = IsSprite3D(Sprite3D)
  With *Sprite3D
    \Vertice[0]\tu = x / \RealWidth
    \Vertice[0]\tv = y / \RealHeight 
    \Vertice[1]\tu = (x + Width) / \RealWidth 
    \Vertice[1]\tv = y / \RealHeight
    \Vertice[2]\tu = x / \RealWidth 
    \Vertice[2]\tv = (y + Height) / \RealHeight 
    \Vertice[3]\tu = (x + Width) / \RealWidth 
    \Vertice[3]\tv = (y + Height) / \RealHeight 
  EndWith
EndProcedure


Procedure Sprite3DColor(Sprite3D, Color0, Color1, Color2, Color3)
  Protected *Sprite3D.PB_DX9Sprite3D = IsSprite3D(Sprite3D)
  With *Sprite3D
    \Vertice[0]\Color = Color0
    \Vertice[1]\Color = Color1
    \Vertice[2]\Color = Color2
    \Vertice[3]\Color = Color3
  EndWith
EndProcedure


OpenWindow(0, 0, 0, 800, 600, "SCREEN", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, 800, 600, 0, 0, 0)
 
  Sprite3DQuality(1)
  
  CreateSprite(1, 32, 32, #PB_Sprite_Texture)
  StartDrawing(SpriteOutput(1))
    Box(0,0,8,8,$FFFFFF)
    Box(24,0,8,8,$FFFFFF)
    Box(0,24,8,8,$FFFFFF)
    Box(24,24,8,8,$FFFFFF)
    Box(8,8,16,16,$808080)
  StopDrawing()
  CreateSprite3D(1, 1)
  Sprite3DColor(1, $FF0000, $00FF00, $0000FF, $FFFFFF)
 
Repeat

  ClearScreen(0)
   
  Start3D()
  
  ClipSprite3D(1, 0, 0, 32, 32)
  RotateSprite3D(1, 0, #PB_Absolute)
  ZoomSprite3D(1, 32, 32)
  DisplaySprite3D(1, 128, 64)
 
  Time.f = ElapsedMilliseconds()/1000
 
  ClipSprite3D(1, Time*50, Time*70, 256, 256)
  RotateSprite3D(1, Time*25, #PB_Absolute)
  ZoomSprite3D(1, 256, 256)
  DisplaySprite3D(1, 128, 128)
 
  Stop3D()
 
  FlipBuffers()

Until WindowEvent() =  #PB_Event_CloseWindow
Bild

Echt praktisch.

Wieso nur bin ich erst jetzt darauf gestoßen :lol:

Das erspart mir (wenns denn überall unterstützt wird) n menge Arbeit in den Punkten:
- einfärben von Grau-Stufen-Bildern
- Licht-Effekten