Code archives/3D Graphics - Misc/3D, 2D Images
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
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