Seite 1 von 1

3D-Sprites in Sprite Rendern

Verfasst: 04.03.2005 16:46
von Epyx
Hi,
Wie der Titel schon sagt würde ich gern ein paar 3D Sprites in ein normales Sprite rendern. Aber irgendwie scheint das auf normalen Weg nicht zu gehen, kennt jemand eine Methode es trotzdem zu machen ????

Verfasst: 04.03.2005 16:52
von Hroudtwolf
Du könntest das 3dSprite mit Grabsprite holen.

Verfasst: 04.03.2005 16:53
von Leo
Oder mit UseBuffer(#Sprite) auf das Sprite rendern.. müsste doch gehen oder?!

Verfasst: 04.03.2005 17:08
von Epyx
@Hroudt
Du könntest das 3dSprite mit Grabsprite holen.
Will ich nicht, ich arbeite mit mehreren Sprites die nur bestimmte Bereiche des Bildschirms wiedergeben, also sowas wie DualPlayfield.
Und da wäre es doch sehr umständlich die 3D Sprites auf dem Bildschirm zu rendern, zu Grabben dann ins Sprite kopieren wobei ich im Playfield-Sprite auch noch eine weitere Hintergrund Ebene habe.
Danach lasse ich erst alle Sprites (Playfields) auf den Screen darstellen.

Schön wäre es, wenn ich die 3D Sprites direkt in den Speicher der Sprites rendern lassen könnte.



@Leo
Oder mit UseBuffer(#Sprite) auf das Sprite rendern.. müsste doch gehen oder?!
Dachte ich auch, doch das tuts nicht,

Verfasst: 04.03.2005 17:31
von Stefan
Hallo Epyx
Ich hab mal 2 Prozeduren programmiert, mit denen das möglich ist: :D

Code: Alles auswählen

Structure DDPIXELFORMAT 
dwSize.l 
dwFlags.l 
dwFourCC.l 
dwRGBBitCount.l 
dwRBitMask.l 
dwGBitMask.l 
dwBBitMask.l 
dwRGBAlphaBitMask.l 
EndStructure 

Structure DDCOLORKEY 
dwColorSpaceLowValue.l 
dwColorSpaceHighValue.l 
EndStructure 

Structure DDSCAPS2 
dwCaps.l 
dwCaps2.l 
dwCaps3.l 
dwCaps4.l 
EndStructure 

Structure DDSURFACEDESC2 
dwSize.l 
dwFlags.l 
dwHeight.l 
dwWidth.l 
lPitch.l 
dwBackBufferCount.l 
dwRefreshRate.l 
dwAlphaBitDepth.l 
dwReserved.l 
lpSurface.l 
ddckCKDestOverlay.DDCOLORKEY 
ddckCKDestBlt.DDCOLORKEY 
ddckCKSrcOverlay.DDCOLORKEY 
ddckCKSrcBlt.DDCOLORKEY 
ddpfPixelFormat.DDPIXELFORMAT 
ddsCaps.DDSCAPS2 
dwTextureStage.l 
EndStructure 

Structure PB_Sprite 
Sprite.l 
Width.w 
Height.w 
Depth.w 
Mode.w 
FileName.l 
RealWidth.w 
RealHeight.w 
ClipX.w 
ClipY.w 
EndStructure 

#DDSD_WIDTH=4 
#DDSD_HEIGHT=2 
#DDSD_CAPS=1 
#DDSCAPS_3DDEVICE=8192 
#DDSCAPS_OFFSCREENPLAIN=64 

Global *D3DDevice.IDirect3DDevice7 
Global *BackBuffer.IDirectDrawSurface7 

Procedure CreateRenderSprite(Sprite,Width,Height) 
Result=CreateSprite(Sprite,Width,Height) 
If Result=0:ProcedureReturn 0:EndIf 
*PBSprite.PB_Sprite=IsSprite(Sprite) 
*DDS.IDirectDrawSurface7=*PBSprite\Sprite 
*DDS\GetDDInterface(@*DD.IDirectDraw7) 
*DDS\Release() 
DDSD.DDSURFACEDESC2 
DDSD\dwSize=SizeOf(DDSURFACEDESC2) 
DDSD\dwFlags=#DDSD_WIDTH|#DDSD_HEIGHT|#DDSD_CAPS 
DDSD\dwWidth=Width 
DDSD\dwHeight=Height 
DDSD\ddsCaps\dwCaps=#DDSCAPS_3DDEVICE|#DDSCAPS_OFFSCREENPLAIN 
Result=*DD\CreateSurface(DDSD,*PBSprite,0) 
If Result:ProcedureReturn 0:EndIf 
ProcedureReturn *PBSprite\Sprite 
EndProcedure 

Procedure SelectRenderSprite(Sprite) 
!extrn _PB_Direct3D_Device 
!MOV Eax,[_PB_Direct3D_Device] 
!MOV [p_D3DDevice],Eax 
!extrn _PB_DirectX_BackBuffer 
!MOV Eax,[_PB_DirectX_BackBuffer] 
!MOV [p_BackBuffer],Eax 
*D3DDevice\EndScene() 
Select Sprite 
Case -1 
*D3DDevice\SetRenderTarget(*BackBuffer,2) 
Default 
*D3DDevice\SetRenderTarget(PeekL(IsSprite(Sprite)),2) 
EndSelect 
*D3DDevice\BeginScene() 
EndProcedure 






;Example: 

InitSprite() 
InitSprite3D() 


InitKeyboard() 
InitMouse() 
OpenScreen(640,480,16,"Collision detection with 3D-Sprites") 

CreateRenderSprite(0,181,181) 
CreateRenderSprite(1,181,181) 

TransparentSpriteColor(0,255,0,255) 
TransparentSpriteColor(1,255,0,255) 

LoadSprite(5,"C:\PureBASIC2\Examples\Sources\Data\GeeBee2.bmp",#PB_Sprite_Texture) ;Pfad anpassen ! 
CreateSprite3D(5,5) 


Repeat 
ExamineKeyboard() 
ExamineMouse() 

ClearScreen(0,0,0) 

UseBuffer(0) 
ClearScreen(255,0,255);Clear Sprite 0 
UseBuffer(1) 
ClearScreen(255,0,255);Clear Sprite 1 
UseBuffer(-1) 


Start3D() 

SelectRenderSprite(0);Draw the 3D-Sprite on Sprite 0 
Angle1+2 
RotateSprite3D(5,Angle1,0) 
DisplaySprite3D(5,27,27) 


SelectRenderSprite(1);Draw the 3D-Sprite on Sprite 1 
Angle2-2 
RotateSprite3D(5,Angle2,0) 
DisplaySprite3D(5,27,27) 

SelectRenderSprite(-1);Draw on Backbuffer 
Stop3D() 


DisplayTransparentSprite(0,MouseX(),MouseY()) 
DisplayTransparentSprite(1,200,100) 

If SpritePixelCollision(0,MouseX(),MouseY(),1,200,100) 
StartDrawing(ScreenOutput()) 
FrontColor(255,255,0) 
DrawingMode(1) 
DrawingFont(GetStockObject_(#ANSI_FIXED_FONT)) 
DrawText("Collision !") 
StopDrawing() 
EndIf 

FlipBuffers() 

Until KeyboardPushed(#PB_Key_Escape) 
Gruß
Stefan

Verfasst: 05.03.2005 17:53
von Epyx
Juhu danke Stefan, klappt einwandfrei und ist sogar ne Pixel Kollision mit drin. Schon richig krass brauchbar der Source, auf jedenfall was fürs Code Archive!

Verfasst: 05.03.2005 22:03
von Andre
Epyx hat geschrieben:Juhu danke Stefan, klappt einwandfrei und ist sogar ne Pixel Kollision mit drin. Schon richig krass brauchbar der Source, auf jedenfall was fürs Code Archive!
Yup, schon abgespeichert :allright:

Verfasst: 03.07.2005 02:04
von Hellhound66
Wo ich das hier gerade durchlese, habe ich ein anderes Problem:
Ich möchte ein 3DSprite während der Laufzeit verändern. Damit meine ich nicht, den MESH zu verändern, sondern die Textur. Wie kann ich ein #PB_TEXTURE_SPRITE verändern, wenn schon ein MESH (3DSprite) zugewiesen wurde? Beim mir funktioniert das überhaupt nicht. Und über zig Backbuffer möchte ich das nicht erreichen..