PB_DX9Sprite - Textur-Kachelung - Sprite3D-Färbung

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

PB_DX9Sprite - Textur-Kachelung - Sprite3D-Färbung

Beitrag 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.
Zuletzt geändert von STARGÅTE am 01.08.2010 01:03, insgesamt 3-mal geändert.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Kevin
Beiträge: 236
Registriert: 11.06.2007 12:55

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

Beitrag von Kevin »

bei mir funktioniert alles

[OT]wie bist du an die struckturen gekommen D3DTLVERTEX/PB_DX9Sprite3D? [/OT]
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

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

Beitrag 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:
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Kevin
Beiträge: 236
Registriert: 11.06.2007 12:55

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

Beitrag von Kevin »

wow danke an dich und nautürlich auch Fluid Byte :D
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

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

Beitrag 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.
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

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

Beitrag von Mok »

Im Grunde sollten wir alle André, freak und Fred danken, weil ohne sie gäbs das alles garnicht :mrgreen:
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Christian+
Beiträge: 213
Registriert: 13.07.2008 10:05
Computerausstattung: Windows 8.1 Pro
AMD Phenom II X4 955 @ 3.2 GHz
4GB RAM
NVIDIA GeForce GTX 660

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

Beitrag 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
Windows 8.1 Pro 64Bit | AMD Phenom II X4 955 @ 3.2 GHz | 4GB RAM | NVIDIA GeForce GTX 660
Christian H
Beiträge: 134
Registriert: 18.10.2005 10:22
Wohnort: Welschbillig

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

Beitrag 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
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

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

Beitrag von STARGÅTE »

jo habs geändert, ich hatte noch n ältere version des codes ...
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

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

Beitrag 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
Zuletzt geändert von STARGÅTE am 01.08.2010 09:55, insgesamt 1-mal geändert.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Antworten