Code archives/3D Graphics - Misc/3D, 2D Images

This code has been declared by its author to be Public Domain code.

Download source code

3D, 2D Images by LedgerARC2009
Unlike some 3D Imaging systems, this one can still use pixels for drawing, handling etc. The main point is that you can make images with transparency, fast rotation and scaling, easily.
I am currently working on getting a loadanimeimage3D() function going.
The system works a bunch slower than normal 2D commands, but you can make Images transparent, which is really the main bonus. Try not to have more than 150 images loaded, and no more than 20 images drawn at once. If any one has any pointers, I'd happily update the code.
I wrote the code in Protean, so the commenting might look a little weird in B3D, but it works very nicely in Protean.
;////////////////////////////////////////////////////////////////////////////////
;THIS SHOWS THE FUNCTIONALITY AND SPEED
;///////////////////////////////////////////////////////////////////////////////

Graphics3D 1024,768,0,2
SetBuffer BackBuffer()

Global Camera = CreateCamera()
SetDefault3DImagingCamera(Camera)

Local Image3D
Local HandleX
Local HandleY
Local DrawX
Local DrawY
Local SizeX
Local SizeY
Local Count
Local FrameRate
Local FrameTime
Local UpdateFrameRate
Local UpdateFrameRateDelay = 500
Local ImageUse = 1

FR3DAlwaysRefreshImages = True

AutoMidHandle3D(False)
Image3D = LoadImage3D("image1.png")
HandleX = ImageWidth3D(Image3D)/2
HandleY = ImageHeight3D(Image3D)/2
HandleImage3D(Image3D,HandleX,HandleY)

Dim Image2D(5)
For i = 1 To 5
	Image2D(i) = LoadImage("Image"+i+".png")
Next

While Not KeyDown(1)
	
	DrawX = MouseX()
	DrawY = MouseY()
	
	DrawImage3D(Image3D,DrawX,DrawY)
	
	If MouseDown(1)
		ScaleImage3D(Image3D,1.01,1.01)
	EndIf
	If MouseDown(2)
		ScaleImage3D(Image3D,.99,.99)
	EndIf
	If KeyHit(28)
		FlushKeys()
		Locate 0,GraphicsHeight()-FontHeight()*2
		SizeX = Input("Enter image width in pixels ")
		Locate 0,GraphicsHeight()-FontHeight()
		FlushKeys()
		SizeY = Input("Entity image height in pixels ")
		FlushKeys()
		ResizeImage3D(Image3D,SizeX,SizeY)
	EndIf
	If KeyDown(200)
		SetImageAlpha3D(Image3D,ImageAlpha3D#(Image3D)+.01)
	EndIf
	If KeyDown(208)
		SetImageAlpha3D(Image3D,ImageAlpha3D#(Image3D)-.01)
	EndIf
	If KeyHit(57)
		ScaleImage3D(Image3D,-1,-1)
	EndIf
	If KeyDown(203)
		RotateImage3D(Image3D,ImageRotation3D#(Image3D)+1)
	EndIf
	If KeyDown(205)
		RotateImage3D(Image3D,ImageRotation3D#(Image3D)-1)
	EndIf
	If KeyHit(16)
		HandleImage3D(Image3D,0,0)
	EndIf
	If KeyDown(17)
		HandleImage3D(Image3D,ImageXHandle3D(Image3D),ImageYHandle3D(Image3D)+1)
	EndIf
	If KeyHit(18)
		MidHandle3D(Image3D)
	EndIf
	If KeyDown(30)
		HandleImage3D(Image3D,ImageXHandle3D(Image3D)+1,ImageYHandle3D(Image3D))
	EndIf
	If KeyDown(31)
		HandleImage3D(Image3D,ImageXHandle3D(Image3D),ImageYHandle3D(Image3D)-1)
	EndIf
	If KeyDown(32)
		HandleImage3D(Image3D,ImageXHandle3D(Image3D)-1,ImageYHandle3D(Image3D))
	EndIf
	If KeyDown(46)
		Image3D = CopyImage3D(Image3D)
	EndIf
	If KeyDown(47)
		Free.FR3DImage = First FR3DImage
		If Free.FR3DImage <> Last FR3DImage
			FreeImage3D(Free\Img3D)
		EndIf
	EndIf
	If KeyDown(45)
		TileImage3D(Image3D)
	EndIf
	If KeyHit(44)
		FreeImage3D(Image3D,True,True)
		ImageUse = ImageUse + 1
		If ImageUse > 5 Then ImageUse = 1
		Image3D = Make2D3D(Image2D(ImageUse))
	EndIf
	
	RenderWorld()
	Update3DImages()
	
	For LoopCount.FR3DImage = Each FR3DImage
		Count = Count + 1
	Next
	
	Text ImageXCorner3D(Image3D,DrawX,1),ImageYCorner3D(Image3D,DrawY,1),"<---"+ImageXCorner3D(Image3D,DrawX,1)+" * "+ImageYCorner3D(Image3D,DrawY,1)+" Pixels",False,True
	Text ImageXCorner3D(Image3D,DrawX,2),ImageYCorner3D(Image3D,DrawY,2),"<---"+ImageXCorner3D(Image3D,DrawX,2)+" * "+ImageYCorner3D(Image3D,DrawY,2)+" Pixels",False,True
	Text ImageXCorner3D(Image3D,DrawX,3),ImageYCorner3D(Image3D,DrawY,3),"<---"+ImageXCorner3D(Image3D,DrawX,3)+" * "+ImageYCorner3D(Image3D,DrawY,3)+" Pixels",False,True
	Text ImageXCorner3D(Image3D,DrawX,4),ImageYCorner3D(Image3D,DrawY,4),"<---"+ImageXCorner3D(Image3D,DrawX,4)+" * "+ImageYCorner3D(Image3D,DrawY,4)+" Pixels",False,True
	
	Text ImageXCorner3D(Image3D,DrawX,0),ImageYCorner3D(Image3D,DrawY,0),"Image Width = "+ImageWidth3D(Image3D),True,False
	Text ImageXCorner3D(Image3D,DrawX,0),ImageYCorner3D(Image3D,DrawY,0)+FontHeight()*-3,"Number of images loaded = "+Count,True,False
	Text ImageXCorner3D(Image3D,DrawX,0),ImageYCorner3D(Image3D,DrawY,0)+FontHeight()*-2,"Image X Handle = "+ImageXHandle3D(Image3D),True,False
	Text ImageXCorner3D(Image3D,DrawX,0),ImageYCorner3D(Image3D,DrawY,0)+FontHeight()*-1,"Image Y Handle = "+ImageYHandle3D(Image3D),True,False
	Text ImageXCorner3D(Image3D,DrawX,0),ImageYCorner3D(Image3D,DrawY,0)+FontHeight(),"Image Height = "+ImageHeight3D(Image3D),True,False
	Text ImageXCorner3D(Image3D,DrawX,0),ImageYCorner3D(Image3D,DrawY,0)+FontHeight()*2,"Image Alpha# = "+ImageAlpha3D(Image3D),True,False
	Text ImageXCorner3D(Image3D,DrawX,0),ImageYCorner3D(Image3D,DrawY,0)+FontHeight()*3,"Image Rotation = "+ImageRotation3D(Image3D),True,False
	
	Text 0,0,"Click Left mouse button to scale up"
	Text 0,FontHeight(),"Click Right mouse button to scale down"
	Text 0,FontHeight()*2,"Press Enter to enter specific scale amount"
	Text 0,FontHeight()*3,"Press 'Up' to increase image alpha"
	Text 0,FontHeight()*4,"Press 'Down' to decrease image alpha"
	Text 0,FontHeight()*5,"Press Spacebar to flip image"
	Text 0,FontHeight()*6,"Press 'Left' to rotate left"
	Text 0,FontHeight()*7,"Press 'Right' to rotate right"
	Text 0,FontHeight()*8,"Use W,A,S,D to change image X and Y handles"
	Text 0,FontHeight()*9,"Use E for middle handle, and Q for 0,0 handle"
	Text 0,FontHeight()*10,"Hold C to duplicate image"
	Text 0,FontHeight()*11,"Hold V to free images"
	Text 0,FontHeight()*12,"Hold X to tile image"
	Text 0,FontHeight()*13,"Press Z to change image with Make2D3D() (slow)"
	
	If UpdateFrameRate < MilliSecs()
		UpdateFrameRate = MilliSecs() + UpdateFrameRateDelay
		FrameRate = MilliSecs() - FrameTime
		FrameRate = 1000/FrameRate
	EndIf
	FrameTime = MilliSecs()
	Text GraphicsWidth()/2,0,"FPS = "+FrameRate	
	
	Flip
	
	Count = 0
	SizeX = 0
	SizeY = 0
	
Wend
End





























































;////////////////////////////////////////////////////////////////////////////////////////
;THIS IS THE INCLUDE CODE
;////////////////////////////////////////////////////////////////////////////////////////
Global FR3DImageID ;The ID# of FR3DImage type
Global FR3DImagingCamera ;The Default 3D imaging camera
Global FR3DAutoMidHandle = False ;auto middle handle, use AutoMidHandle3D to switch
Global FR3DAlwaysRefreshImages = True ;Switch to false if you want to not hide the images every time Update3DImages() is called

Type FR3DImage
	
	Field Camera
	Field ID
	Field Img3D
	Field ZPos#
	Field ImgW#
	Field ImgH#
	Field ImgXHandle#
	Field ImgYHandle#
	Field Tex
	Field Temporary
	Field TemporaryReset
	Field Flags
	Field Alpha#
	Field Frames
	Field Rotate#
	
End Type

;;; <summary>Creates a 3D image</summary>
;;; <param name="TempPath">The full path/filename</param>
;;; <param name="TempFlag">The flag that the 3D image uses</param>
;;; <param name="TempZPos">Z buffer position for the 3D image to be drawn</param>
;;; <param name="Temp3DImagingCamera">The camera the 3D image is attached to</param>
;;; <remarks></remarks>
;;; <returns>The 3D image as a sprite</returns>
;;; <subsystem>Blitz.Images.3D</subsystem>
;;; <example></example>
Function LoadImage3D(TempPath$,TempFlags=1,TempZPos#=2,Temp3DImagingCamera=0)
	
	Local TempImage3D
	Local TempTex
	Local TempImage
	Local TempWidth# = GraphicsWidth()
	Local TempScale# = TempZPos#/TempWidth#
	If Temp3DImagingCamera = 0 Then Temp3DImagingCamera = FR3DImagingCamera
	
	TempImage = LoadImage(TempPath$)
	TempTex = LoadTexture(TempPath$,TempFlags)
	TempImage3D = CreateSprite(Temp3DImagingCamera)
	PositionEntity TempImage3D,0,0,TempZPos#
	EntityTexture(TempImage3D,TempTex)
	ScaleSprite TempImage3D,ImageWidth(TempImage)*TempScale#,ImageHeight(TempImage)*TempScale#
	
	;Setup the Image3D Type
	NewFR3DImage.FR3DImage = New FR3DImage
	NewFR3DImage\Camera = Temp3DImagingCamera
	NewFR3DImage\ID = FRNewFR3DImageID()
	NewFR3DImage\Img3D = TempImage3D
	NewFR3DImage\ZPos# = TempZPos#
	NewFR3DImage\ImgW# = ImageWidth(TempImage)
	NewFR3DImage\ImgH# = ImageHeight(TempImage)
	If FR3DAutoMidHandle = False
		HandleSprite(TempImage3D,-1,1)
		NewFR3DImage\ImgXHandle# = -1
		NewFR3DImage\ImgYHandle# = 1
	Else
		HandleSprite(TempImage3D,0,0)
		NewFR3DImage\ImgXHandle# = 0
		NewFR3DImage\ImgYHandle# = 0
	EndIf
	NewFR3DImage\Tex = TempTex
	NewFR3DImage\Temporary = False
	NewFR3DImage\TemporaryReset = 0
	NewFR3DImage\Flags = TempFlags
	NewFR3DImage\Alpha# = 1
	NewFR3DImage\Frames = 1
	NewFR3DImage\Rotate# = 0
	
	FreeImage TempImage
	HideEntity TempImage3D
	
	Return TempImage3D
	
End Function

;;; <summary>Sets the 3D imaging camera</summary>
;;; <param name="TempCamera">The camera used for 3D images</param>
;;; <remarks></remarks>
;;; <returns></returns>
;;; <subsystem>Blitz.Images.3D</subsystem>
;;; <example></example>
Function SetDefault3DImagingCamera(TempCamera)
	
	FR3DImagingCamera = TempCamera
	
End Function

;;; <summary>Shows a 3D image with 2D corodinates</summary>
;;; <param name="TempImage">The handle of a 3D image</param>
;;; <param name="TempX">X position on-screen to draw the image</param>
;;; <param name="TempY">Y position on-screen to draw the image</param>
;;; <remarks></remarks>
;;; <returns></returns>
;;; <subsystem>Blitz.Images.3D</subsystem>
;;; <example></example>
Function DrawImage3D(TempImage,TempX#,TempY#,TempFrame=0)
	
	Local TempWidth# = GraphicsWidth()
	Local TempHeight# = GraphicsHeight()
	Local TempX0# = (TempWidth#/2)/(TempWidth#*.25)
	Local TempY0# = (TempHeight#/2)/(TempWidth#*.25)
	Local Temp3DX# = TempX#/(TempWidth#*.25)
	Local Temp3DY# = TempY#/(TempWidth#*.25)
	
	For Find.FR3DImage = Each FR3DImage
		
		If Find\Img3D = TempImage
			
			ShowEntity(Find\Img3D)
			EntityTexture(Find\Img3D,Find\Tex,TempFrame)
			PositionEntity Find\Img3D,-TempX0#+Temp3DX#,TempY0#-Temp3DY#,Find\ZPos#
			
		EndIf
		
	Next
	
End Function

;;; <summary>Increases the image ID by 1 and returns it</summary>
;;; <remarks></remarks>
;;; <returns>FR3DImageID</returns>
;;; <subsystem>Blitz.Images.3D</subsystem>
;;; <example></example>
Function FRNewFR3DImageID()
	
	FR3DImageID = FR3DImageID + 1
	Return FR3DImageID
	
End Function

;;; <summary>Sets the handle for the 3D image in pixels</summary>
;;; <param name="TempImage">The handle of a 3D image</param>
;;; <param name="TempX">X position of handle in pixels</param>
;;; <param name="TempY">Y position of handle in pixels</param>
;;; <remarks></remarks>
;;; <returns></returns>
;;; <subsystem>Blitz.Images.3D</subsystem>
;;; <example></example>
Function HandleImage3D(TempImage,TempX#,TempY#)
	
	For Find.FR3DImage = Each FR3DImage
		
		If Find\Img3D = TempImage
			
			Local TempX3D# = TempX#/(Find\ImgW#/2)
			Local TempY3D# = TempY#/(Find\ImgH#/2)
			TempX3D# = TempX3D# - 1
			TempY3D# = -TempY3D# + 1
			HandleSprite Find\Img3D,TempX3D#,TempY3D#
			Find\ImgXHandle = TempX3D#
			Find\ImgYHandle = TempY3D#
			
		EndIf
		
	Next
	
End Function

;;; <summary>Sets the handle of the 3D image to the middle</summary>
;;; <param name="TempImage">The handle of a 3D image</param>
;;; <remarks></remarks>
;;; <returns></returns>
;;; <subsystem>Blitz.Images.3D</subsystem>
;;; <example></example>
Function MidHandle3D(TempImage)
	
	For Find.FR3DImage = Each FR3DImage
		
		If Find\Img3D = TempImage
			
			HandleSprite Find\Img3D,0,0
			Find\ImgXHandle# = 0
			Find\ImgYHandle# = 0
			
		EndIf
		
	Next
	
End Function

;;; <summary>Returns the X handle position of the image in pixels</summary>
;;; <param name="TempImage">The handle of a 3D image</param>
;;; <remarks></remarks>
;;; <returns>The X handle of an image in pixels</returns>
;;; <subsystem>Blitz.Images.3D</subsystem>
;;; <example></example>
Function ImageXHandle3D#(TempImage)
	
	For Find.FR3DImage = Each FR3DImage
		
		If Find\Img3D = TempImage
			
			Return (Find\ImgXHandle#+1)*(Find\ImgW#/2)
			
			Return 
			
		EndIf
		
	Next
	
End Function

;;; <summary>Returns the Y handle position of the image in pixels</summary>
;;; <param name="TempImage">The handle of a 3D image</param>
;;; <remarks></remarks>
;;; <returns>The Y handle of an image in pixels</returns>
;;; <subsystem>Blitz.Images.3D</subsystem>
;;; <example></example>
Function ImageYHandle3D#(TempImage)
	
	For Find.FR3DImage = Each FR3DImage
		
		If Find\Img3D = TempImage
			
			Return (-Find\ImgYHandle#+1)*(Find\ImgH#/2)
			
		EndIf
		
	Next
	
End Function

;;; <summary>Turns auto middle handle of 3D images on/off</summary>
;;; <param name="Enable">True or false for on or off</param>
;;; <remarks></remarks>
;;; <returns></returns>
;;; <subsystem>Blitz.Images.3D</subsystem>
;;; <example></example>
Function AutoMidHandle3D(Enable)
	
	If Enable <> False Then
		FR3DAutoMidHandle = True
	Else
		FR3DAutoMidHandle = False
	EndIf
	
End Function

;;; <summary>Updates all the 3D images</summary>
;;; <remarks></remarks>
;;; <returns></returns>
;;; <subsystem>Blitz.Images.3D</subsystem>
;;; <example></example>
Function Update3DImages()
	
	For Find.FR3DImage = Each FR3DImage
		
		If FR3DAlwaysRefreshImages = True
			
			HideEntity Find\Img3D
			
		EndIf
		
		If Find\Temporary = True
			
			FreeImage3D(Find\Img3D,Find\TemporaryReset,False)
			
		EndIf
		
	Next
	
End Function

;;; <summary>Set the alpha value for a 3D image</summary>
;;; <param name="TempImage">The handle of a 3D image</param>
;;; <param name="TempAlpha">a number between 1 and 0 1=solid, 0=invisible</param>
;;; <remarks></remarks>
;;; <returns></returns>
;;; <subsystem>Blitz.Images.3D</subsystem>
;;; <example></example>
Function SetImageAlpha3D(TempImage,TempAlpha#)
	
	If TempAlpha# > 1 Then TempAlpha# = 1
	If TempAlpha# < 0 Then TempAlpha# = 0
	
	For Find.FR3DImage = Each FR3DImage
		
		If Find\Img3D = TempImage
			
			EntityAlpha(Find\Img3D,TempAlpha#)
			Find\Alpha# = TempAlpha#
			
		EndIf
		
	Next
	
End Function

;;; <summary>Returns the alpha of a 3D image</summary>
;;; <param name="TempImage">The handle of a 3D image</param>
;;; <remarks></remarks>
;;; <returns>The alpha value of the specified 3D image</returns>
;;; <subsystem>Blitz.Images.3D</subsystem>
;;; <example></example>
Function ImageAlpha3D#(TempImage)
	
	For Find.FR3DImage = Each FR3DImage
		
		If Find\Img3D = TempImage
			
			Return Find\Alpha#
			
		EndIf
		
	Next
	
End Function

;;; <summary>Copy's a 3D image</summary>
;;; <param name="TempImage">The handle of a 3D image</param>
;;; <remarks></remarks>
;;; <returns>The newly copied Image</returns>
;;; <subsystem>Blitz.Images.3D</subsystem>
;;; <example></example>
Function CopyImage3D(TempImage)
	
	For Find.FR3DImage = Each FR3DImage
		
		If Find\Img3D = TempImage
			
			NewFR3DImage.FR3DImage = New FR3DImage
			NewFR3DImage\Camera = Find\Camera
			NewFR3DImage\ID = FRNewFR3DImageID()
			NewFR3DImage\Img3D = CopyEntity(Find\Img3D,Find\Camera)
			NewFR3DImage\ZPos# = Find\ZPos#
			NewFR3DImage\ImgW# = Find\ImgW#
			NewFR3DImage\ImgH# = Find\ImgH#
			NewFR3DImage\ImgXHandle# = Find\ImgXHandle#
			NewFR3DImage\ImgYHandle# = Find\ImgYHandle#
			NewFR3DImage\Tex = CreateTexture(TextureWidth(Find\Tex),TextureHeight(Find\Tex),Find\Flags,Find\Frames)
			CopyRect(0,0,TextureWidth(Find\Tex),TextureHeight(Find\Tex),0,0,TextureBuffer(Find\Tex),TextureBuffer(NewFR3DImage\Tex))
			EntityTexture(NewFR3DImage\Img3D,NewFR3DImage\Tex)
			NewFR3DImage\Temporary = False
			NewFR3DImage\TemporaryReset = False
			NewFR3DImage\Flags = Find\Flags
			NewFR3DImage\Alpha# = Find\Alpha#
			NewFR3DImage\Frames = Find\Frames
			NewFR3DImage\Rotate# = Find\Rotate#
			
			Return NewFR3DImage\Img3D
			
		EndIf
		
	Next
	
End Function

;;; <summary>Deletes a 3D image</summary>
;;; <param name="TempImage">The handle of a 3D image</param>
;;; <param name="TempResetOrder">If true, this will reset the order of all FR3DImage ID's</param>
;;; <param name="TempWait">True to not delete until next call to Update3DImages()</param>
;;; <remarks></remarks>
;;; <returns></returns>
;;; <subsystem>Blitz.Images.3D</subsystem>
;;; <example></example>
Function FreeImage3D(TempImage,TempResetOrder=True,TempWait=False)
	
	Local TempReseting = False
	
	For Find.FR3DImage = Each FR3DImage
		
		If TempReseting = True
			
			Find\ID = Find\ID - 1
			
		EndIf
		
		If Find\Img3D = TempImage
			
			If TempWait = False
				
				FreeEntity(Find\Img3D)
				FreeTexture(Find\Tex)
				Delete Find.FR3DImage
				TempReseting = TempResetOrder
				If TempReseting = True Then FR3DImageID = FR3DImageID - 1
				
			Else
				
				Find\Temporary = True
				Find\TemporaryReset = TempResetOrder
				
			EndIf
			
		EndIf
		
	Next
	
End Function

;;; <summary>Creates a blank 3D image</summary>
;;; <param name="TempWidth">Width of 3D image</param>
;;; <param name="TempHeight">Height of 3D image</param>
;;; <param name="TempFlags">The flag that the 3D image uses</param>
;;; <param name="TempFrames">How many  frames the 3D image has</param>
;;; <param name="TempZPos">Z buffer position for the 3D image to be drawn</param>
;;; <param name="Temp3DImagingCamera">The camera the 3D image is attached to</param>
;;; <remarks></remarks>
;;; <returns>The 3D image as a sprite</returns>
;;; <subsystem>Blitz.Images.3D</subsystem>
;;; <example></example>
Function CreateImage3D(TempWidth,TempHeight,TempFlags=1,TempFrames=1,TempZPos#=2,Temp3DImagingCamera=0)
	
	Local TempImage3D
	Local TempGFXWidth# = GraphicsWidth()
	Local TempXScale# = TempZPos#/TempGFXWidth#
	Local TempYScale# = TempZPos#/TempGFXWidth#
	If Temp3DImagingCamera = 0 Then Temp3DImagingCamera = FR3DImagingCamera
	
	TempImage3D = CreateSprite(Temp3DImagingCamera)
	PositionEntity TempImage3D,0,0,TempZPos#
	ScaleSprite TempImage3D,TempWidth*TempXScale#,TempHeight*TempYScale#
	
	;Setup the Image3D Type
	NewFR3DImage.FR3DImage = New FR3DImage
	NewFR3DImage\Camera = Temp3DImagingCamera
	NewFR3DImage\ID = FRNewFR3DImageID()
	NewFR3DImage\Img3D = TempImage3D
	NewFR3DImage\ZPos# = TempZPos#
	NewFR3DImage\ImgW# = TempWidth
	NewFR3DImage\ImgH# = TempHeight
	If FR3DAutoMidHandle = False
		HandleSprite(TempImage3D,-1,1)
		NewFR3DImage\ImgXHandle# = -1
		NewFR3DImage\ImgYHandle# = 1
	Else
		HandleSprite(TempImage3D,0,0)
		NewFR3DImage\ImgXHandle# = 0
		NewFR3DImage\ImgYHandle# = 0
	EndIf
	NewFR3DImage\Tex = CreateTexture(TempWidth,TempHeight,TempFlags,TempFrames)
	NewFR3DImage\Temporary = False
	NewFR3DImage\TemporaryReset = 0
	NewFR3DImage\Flags = TempFlags
	NewFR3DImage\Alpha# = 1
	NewFR3DImage\Frames = TempFrames
	NewFR3DImage\Rotate# = 0
	
	HideEntity TempImage3D
	
	Return TempImage3D
	
End Function

;;; <summary>Creates a 3D image from a loaded 2D image</summary>
;;; <param name="TempImage2D">The 2D image to make into a 3D image</param>
;;; <param name="TempFlag">The flag that the 3D image uses</param>
;;; <param name="TempZPos">Z buffer position for the 3D image to be drawn</param>
;;; <param name="Temp3DImagingCamera">The camera the 3D image is attached to</param>
;;; <remarks>Vary Slow! much faster to use LoadImage3D()!</remarks>
;;; <returns>The 3D image as a sprite</returns>
;;; <subsystem>Blitz.Images.3D</subsystem>
;;; <example></example>
Function Make2D3D(Temp2DImage,TempFlags=1,TempFrames=1,TempZPos#=2,Temp3DImaginfCamera=0)
	
	Local TempImage3D
	Local TempTex
	Local TempGFXWidth# = GraphicsWidth()
	Local TempXScale# = TempZPos#/TempGFXWidth#
	Local TempYScale# = TempZPos#/TempGFXWidth#
	If Temp3DImagingCamera = 0 Then Temp3DImagingCamera = FR3DImagingCamera
	
	TempTex = CreateTexture(ImageWidth(Temp2DImage),ImageHeight(Temp2DImage),TempFlags,TempFrames)
	TempImgWidth = ImageWidth(Temp2DImage)
	TempImgHeight = ImageHeight(Temp2DImage)
	ResizeImage(Temp2DImage,TextureWidth(TempTex),TextureHeight(TempTex))
	
	For TempCountFrames = 0 To TempFrames - 1
		
		SetBuffer TextureBuffer(TempTex,TempCountFrames)
		DrawImage(Temp2DImage,ImageXHandle(Temp2DImage),ImageYHandle(Temp2DImage),TempCountFrames)
		
	Next
	SetBuffer BackBuffer()
	ResizeImage(Temp2DImage,TempImgWidth,TempImgHeight)
	
	TempImage3D = CreateSprite(Temp3DImagingCamera)
	PositionEntity TempImage3D,0,0,TempZPos#
	EntityTexture(TempImage3D,TempTex)
	ScaleSprite TempImage3D,ImageWidth(Temp2DImage)*TempXScale#,ImageHeight(Temp2DImage)*TempYScale#
	
	NewFR3DImage.FR3DImage = New FR3DImage
	NewFR3DImage\Camera = Temp3DImagingCamera
	NewFR3DImage\ID = FRNewFR3DImageID()
	NewFR3DImage\Img3D = TempImage3D
	NewFR3DImage\ZPos# = TempZPos#
	NewFR3DImage\ImgW# = ImageWidth(Temp2DImage)
	NewFR3DImage\ImgH# = ImageHeight(Temp2DImage)
	If FR3DAutoMidHandle = False
		HandleSprite(TempImage3D,-1,1)
		NewFR3DImage\ImgXHandle# = -1
		NewFR3DImage\ImgYHandle# = 1
	Else
		HandleSprite(TempImage3D,0,0)
		NewFR3DImage\ImgXHandle# = 0
		NewFR3DImage\ImgYHandle# = 0
	EndIf
	NewFR3DImage\Tex = TempTex
	NewFR3DImage\Temporary = False
	NewFR3DImage\TemporaryReset = 0
	NewFR3DImage\Flags = TempFlags
	NewFR3DImage\Alpha# = 1
	NewFR3DImage\Frames = TempFrames
	NewFR3DImage\Rotate# = 0
	
	HideEntity TempImage3D
	
	Return TempImage3D
	
End Function

;;; <summary>Grabs a portion of the current drawing buffer and put it onto a 3D image</summary>
;;; <param name="TempImage">The handle of a 3D image</param>
;;; <param name="TempX">X position of current buffer to start from</param>
;;; <param name="TempY">Y position of current buffer to start from</param>
;;; <param name="TempFrame">Frame to insert the grabed image into</param>
;;; <remarks></remarks>
;;; <returns>Vary Slow!</returns>
;;; <subsystem>Blitz.Images.3D</subsystem>
;;; <example></example>
Function GrabImage3D(TempImage,TempX,TempY,TempFrame=0)
	
	For Find.FR3DImage = Each FR3DImage
		
		If Find\Img3D = TempImage
			
			Local TempImg2D = CreateImage(Find\ImgW,Find\ImgH)
			
			CopyRect(TempX,TempY,Find\ImgW,Find\ImgH,0,0,GraphicsBuffer(),ImageBuffer(TempImg2D))
			ResizeImage TempImg2D,TextureWidth(Find\Tex),TextureHeight(Find\Tex)
			CopyRect(0,0,ImageWidth(TempImg2D),ImageHeight(TempImg2D),0,0,ImageBuffer(TempImg2D),TextureBuffer(Find\Tex))
			
		EndIf
		
	Next
	
End Function

;;; <summary>Tiles a 3D image over the screen</summary>
;;; <param name="TempImage">The handle of a 3D image</param>
;;; <param name="TempX">X position to start</param>
;;; <param name="TempY">Y position to start</param>
;;; <param name="TempFrame">Frame to Tile</param>
;;; <remarks>VARY SLOW!!!!!</remarks>
;;; <returns></returns>
;;; <subsystemBlitz.Images.3D></subsystem>
;;; <example></example>
Function TileImage3D(TempImage,TempX=0,TempY=0,TempFrame=0)
	
	Local TempNextX = TempX
	Local TempNextY = TempY
	Local TempImage3D
	
	For Find.FR3DImage = Each FR3DImage
		
		If Find\Img3D = TempImage
			
			For TempTileX = TempX To GraphicsWidth()
				
				For TempTileY = TempY To GraphicsHeight()
					
					If TempTileX = TempNextX 
						
						If TempTileY = TempNextY
							
							TempImage3D = CopyImage3D(Find\Img3D)
							FreeImage3D(TempImage3D,True,True)
							
							DrawImage3D(TempImage3D,TempTileX,TempTileY,TempFrame)
							
							TempNextY = TempNextY + Find\ImgH
							
						EndIf
						
					EndIf
					
				Next
				
				If TempTileX = TempNextX
					
					TempNextX = TempNextX + Find\ImgW
					TempNextY = TempY
					
				EndIf
				
			Next
			
		EndIf
		
	Next
	
End Function

;;; <summary>Scales a 3D image usng percents</summary>
;;; <param name="TempImage">The handle of a 3D image</param>
;;; <param name="TempXScale">X scale of 3D image</param>
;;; <param name="TempYScale">Y scale of 3D image</param>
;;; <remarks></remarks>
;;; <returns></returns>
;;; <subsystem>Blitz.Images.3D</subsystem>
;;; <example></example>
Function ScaleImage3D(TempImage,TempXScale#,TempYScale#)
	
	For Find.FR3DImage = Each FR3DImage
		
		If Find\Img3D = TempImage
			
			Local TempWidth# = GraphicsWidth()
			Local TempScale# = Find\ZPos#/TempWidth#
			
			ScaleSprite Find\Img3D,(Find\ImgW*TempScale#)*TempXScale#,(Find\ImgH*TempScale#)*TempYScale#
			Find\ImgW = Find\ImgW * TempXScale#
			Find\ImgH = Find\ImgH * TempYScale#
			
		EndIf
		
	Next
	
End Function

;;; <summary>Scales a 3D image usng pixels</summary>
;;; <param name="TempImage">The handle of a 3D image</param>
;;; <param name="TempXScale">X scale of 3D image</param>
;;; <param name="TempYScale">Y scale of 3D image</param>
;;; <remarks></remarks>
;;; <returns></returns>
;;; <subsystem>Blitz.Images.3D</subsystem>
;;; <example></example>
Function ResizeImage3D(TempImage,TempXScale,TempYScale)
	
	For Find.FR3DImage = Each FR3DImage
		
		If Find\Img3D = TempImage
			
			Local TempWidth# = GraphicsWidth()
			Local TempScale# = Find\ZPos#/TempWidth#
			
			ScaleSprite Find\Img3D,TempXScale*TempScale#,TempYScale*TempScale#
			Find\ImgW = TempXScale
			Find\ImgH = TempYScale
			
		EndIf
		
	Next
	
End Function

;;; <summary>Returns the width of a 3D image</summary>
;;; <param name="TempImage">The handle of a 3D image</param>
;;; <remarks></remarks>
;;; <returns>The width of the specified 3D image</returns>
;;; <subsystem>Blitz.Images.3D</subsystem>
;;; <example></example>
Function ImageWidth3D#(TempImage)
	
	For Find.FR3DImage = Each FR3DImage
		
		If Find\Img3D = TempImage
			
			Return Find\ImgW#
			
		EndIf
		
	Next
	
End Function

;;; <summary>Returns the height of a 3D image</summary>
;;; <param name="TempImage">The handle of a 3D image</param>
;;; <remarks></remarks>
;;; <returns>The height of the specified 3D image</returns>
;;; <subsystem>Blitz.Images.3D</subsystem>
;;; <example></example>
Function ImageHeight3D#(TempImage)
	
	For Find.FR3DImage = Each FR3DImage
		
		If Find\Img3D = TempImage
			
			Return Find\ImgH#
			
		EndIf
		
	Next
	
End Function

;;; <summary>Creates a 3D rectangle</summary>
;;; <param name="TempX">Starting X position</param>
;;; <param name="TempY">Starting Y position</param>
;;; <param name="TempWidth">Width of rectangle</param>
;;; <param name="TempHeight">Height of rectangle</param>
;;; <param name="TempTemp">If true, the rectangle will be deleted when Update3DImages() is called</param>
;;; <param name="TempResetOrder">If TempTemp if true, this will reset the order of FR3DImage\ID if true</param>
;;; <param name="TempZPos">Z buffer position for the 3D image to be drawn</param>
;;; <param name="Temp3DImagingCamera">The camera the 3D image is attached to</param>
;;; <remarks></remarks>
;;; <returns>Will return the rectangle image as a sprite ONLY if TempTemp is false</returns>
;;; <subsystem>Blitz.Images.3D</subsystem>
;;; <example></example>
Function Rect3D(TempX,TempY,TempWidth,TempHeight,TempTemp=True,TempResetOrder=True,TempZPos#=2,Temp3DImagingCamera=0)
	
	
	If Temp3DImagingCamera = 0 Then Temp3DImagingCamera = FR3DImagingCamera
	Local TempImage3D = CreateImage3D(TempWidth,TempHeight,4,1,TempZPos#,Temp3DImagingCamera)
	If TempTemp = True FreeImage3D(TempImage3D,TempResetOrder,True)
	
	For Find.FR3DImage = Each FR3DImage
		
		If Find\Img3D = TempImage3D
			
			TempBuffer = GraphicsBuffer()
			SetBuffer TextureBuffer(Find\Tex)
			ClsColor ColorRed(),ColorGreen(),ColorBlue()
			Cls
			SetBuffer TempBuffer
			Exit
			
		EndIf
		
	Next
	
	DrawImage3D(TempImage3D,TempX,TempY)
	
	If TempTemp=False Return TempImage3D
	
End Function

;;; <summary>Rotates a 3D image</summary>
;;; <param name="TempImage">The handle of a 3D image</param>
;;; <param name="TempValue">Absolute rotation of the 3D image</param>
;;; <remarks></remarks>
;;; <returns></returns>
;;; <subsystem>Blitz.Images.3D</subsystem>
;;; <example></example>
Function RotateImage3D(TempImage,TempValue#)
	
	For Find.FR3DImage = Each FR3DImage
		
		If Find\Img3D = TempImage
			
			RotateSprite Find\Img3D,TempValue#
			Find\Rotate# = TempValue#
			
		EndIf
		
	Next
	
End Function

;;; <summary>Returns the Rotation of a 3D image</summary>
;;; <param name="TempImage">The handle of a 3D image</param>
;;; <remarks></remarks>
;;; <returns>The rotation of a 3D image</returns>
;;; <subsystem>Blitz.Images.3D</subsystem>
;;; <example></example>
Function ImageRotation3D#(TempImage)
	
	For Find.FR3DImage = Each FR3DImage
		
		If Find\Img3D = TempImage
			
			Return Find\Rotate#
			
		EndIf
		
	Next
	
End Function

;;; <summary>Returns the X coords on-screen of the specified image's specified corner</summary>
;;; <param name="TempImage">The handle of a 3D image</param>
;;; <param name="TempX">X position on-screen that the image is drawn</param>
;;; <param name="TempCorner">The corner's number [0=center, 1=top-left, 2=bottom-left, 3=bottom-right, 4=top-left</param>
;;; <remarks></remarks>
;;; <returns>The Image's corner's X position on-screen</returns>
;;; <subsystem>Blitz.Images.3D</subsystem>
;;; <example></example>
Function ImageXCorner3D#(TempImage,TempX#,TempCorner)
	
	Local TempDrawX# = TempX#
	Local TempHDist#
	Local TempAngle1#
	Local TempAngle2#
	Local TempDist#
	Local TempRotateX
	Local TempDistAngle#
	Local TempReturn#
	
	For Find.FR3DImage = Each FR3DImage
		
		If Find\Img3D = TempImage
			
			TempHDist# = Find\ImgW# ^ 2 + Find\ImgH# ^ 2
			TempHDist# = Sqr(TempHDist#)/2
			TempAngle1# = ASin(Find\ImgH#/2/TempHDist#) + -Find\Rotate#
			TempAngle2# = ACos(Find\ImgH#/2/TempHDist#) + -Find\Rotate#
			
			TempDist# = (Find\ImgW#/2 - ImageXHandle3D(Find\Img3D)) ^ 2 + (Find\ImgH#/2 - ImageYHandle3D(Find\Img3D)) ^ 2
			TempDist# = Sqr(TempDist#)
			
			If ImageXHandle3D(Find\Img3D) => Find\ImgW#/2 And ImageYHandle3D(Find\Img3D) <= Find\ImgH#/2 Then
				TempRotateX = -Find\Rotate#
			EndIf
			If ImageXHandle3D(Find\Img3D) => Find\ImgW#/2 And ImageYHandle3D(Find\Img3D) => Find\ImgH#/2
				TempRotateX = Find\Rotate#
			EndIf
			If ImageXHandle3D(Find\Img3D) =< Find\ImgW#/2 And ImageYHandle3D(Find\Img3D) => Find\ImgH#/2
				TempRotateX = Find\Rotate#
			EndIf
			If ImageXHandle3D(Find\Img3D) =< Find\ImgW#/2 And ImageYHandle3D(Find\Img3D) =< Find\ImgH#/2
				TempRotateX = -Find\Rotate#
			EndIf
			
			If TempDist# <> 0
				TempDistAngle# = ACos((Find\ImgW#/2 - ImageXHandle3D(Find\Img3D))/TempDist#) + TempRotateX
				TempDrawX# = TempX# + Cos(TempDistAngle#)*TempDist#
			EndIf
			
			Select TempCorner
				
				Case 0
					
					Return TempDrawX
					
				Case 1
					
					Return TempDrawX - Cos(TempAngle1#)*TempHDist#
					
					
				Case 2
					
					TempAngle2# = TempAngle2# + 90
					Return TempDrawX - Cos(TempAngle2#)*TempHDist#
					
				Case 3
					
					TempAngle1# = TempAngle1# + 180
					Return TempDrawX - Cos(TempAngle1#)*TempHDist#
					
				Case 4
					
					TempAngle2# = TempAngle2# + 270
					Return TempDrawX - Cos(TempAngle2#)*TempHDist#
					
			End Select
			
		EndIf
		
	Next
	
End Function

;;; <summary>Returns the Y coords on-screen of the specified image's specified corner</summary>
;;; <param name="TempImage">The handle of a 3D image</param>
;;; <param name="TempX">Y position on-screen that the image is drawn</param>
;;; <param name="TempCorner">The corner's number [0=center, 1=top-left, 2=bottom-left, 3=bottom-right, 4=top-left</param>
;;; <remarks></remarks>
;;; <returns>The Image's corner's Y position on-screen</returns>
;;; <subsystem>Blitz.Images.3D</subsystem>
;;; <example></example>
Function ImageYCorner3D#(TempImage,TempY,TempCorner)
	
	Local TempDrawY = TempY
	Local TempHDist#
	Local TempAngle1#
	Local TempAngle2#
	Local TempDist#
	Local TempRotateY
	Local TempDistAngle#
	
	For Find.FR3DImage = Each FR3DImage
		
		If Find\Img3D = TempImage
			
			TempHDist# = Find\ImgW# ^ 2 + Find\ImgH# ^ 2
			TempHDist# = Sqr(TempHDist#)/2
			TempAngle1# = ASin(Find\ImgH#/2/TempHDist#) + -Find\Rotate#
			TempAngle2# = ACos(Find\ImgH#/2/TempHDist#) + -Find\Rotate#
			
			TempDist# = (Find\ImgW#/2 - ImageXHandle3D(Find\Img3D)) ^ 2 + (Find\ImgH#/2 - ImageYHandle3D(Find\Img3D)) ^ 2
			TempDist# = Sqr(TempDist#)
			
			If ImageXHandle3D(Find\Img3D) => Find\ImgW#/2 And ImageYHandle3D(Find\Img3D) <= Find\ImgH#/2 Then
				TempRotateY = Find\Rotate#
			EndIf
			If ImageXHandle3D(Find\Img3D) => Find\ImgW#/2 And ImageYHandle3D(Find\Img3D) => Find\ImgH#/2
				TempRotateY = Find\Rotate#
			EndIf
			If ImageXHandle3D(Find\Img3D) =< Find\ImgW#/2 And ImageYHandle3D(Find\Img3D) => Find\ImgH#/2
				TempRotateY = -Find\Rotate#
			EndIf
			If ImageXHandle3D(Find\Img3D) =< Find\ImgW#/2 And ImageYHandle3D(Find\Img3D) =< Find\ImgH#/2
				TempRotateY = -Find\Rotate#
			EndIf
			
			If TempDist# <> 0
				TempDistAngle# = ASin((Find\ImgH#/2 - ImageYHandle3D(Find\Img3D))/TempDist#) + TempRotateY
				TempDrawY = TempY + Sin(TempDistAngle#)*TempDist#
			EndIf
			
			Select TempCorner
					
				Case 0
					
					Return TempDrawY
					
				Case 1
					
					Return TempDrawY - Sin(TempAngle1#)*TempHDist#
					
				Case 2
					
					TempAngle2# = TempAngle2# + 90
					Return TempDrawY - Sin(TempAngle2#)*TempHDist#
					
				Case 3
					
					TempAngle1# = TempAngle1# + 180
					Return TempDrawY - Sin(TempAngle1#)*TempHDist#
					
				Case 4
					
					TempAngle2# = TempAngle2# + 270
					Return TempDrawY - Sin(TempAngle2#)*TempHDist#
					
			End Select
			
		EndIf
		
	Next
	
End Function

Comments

None.

Code Archives Forum