[bb] Vein R3 2D-in-3D System by N [ 1+ years ago ]

Started by BlitzBot, June 29, 2017, 00:28:42

Previous topic - Next topic

BlitzBot

Title : Vein R3 2D-in-3D System
Author : N
Posted : 1+ years ago

Description : Not exactly the most advanced 2D-in-3D system, but it did the job.  Given what I know now I could rewrite this much more efficiently, but I don't have Blitz3D anymore nor do I have any interest in going back just to rewrite this.

So have fun.


Code :
Code (blitzbasic) Select
;#Region DESCRIPTION
;; System for creating pixel perfect 3D sprites on screen
;#End Region

;#Region CLASSES
Type t2dI3d
Field X#,Y#,Z#,W#,H#,Camera%
End Type

Type Panel
Field Width#
Field Height#
Field X#
Field Y#
Field Mesh%
End Type

Global X3D#,Y3D#,Z3D# ;; 2D-in-3D coordinates
;#End Region

;#Region PROCEDURES
Function Create2DIn3DSource(Camera,Z#=24,ResW=0,ResH=0)
If ResW <= 0 Then ResW = GraphicsWidth()
If ResH <= 0 Then ResH = GraphicsHeight()
P = CreatePlane(1)
EntityPickMode P,2
PositionEntity P,EntityX(Camera,1),EntityY(Camera,1),EntityZ(Camera,1),1
RotateEntity P,EntityPitch(Camera,1),EntityYaw(Camera,1),EntityRoll(Camera,1),1
MoveEntity P,0,0,Z#
TurnEntity P,-90,0,0
CameraPick Camera,0,0
While PickedEntity() <> P And Z# > 1.0
Z# = Z# - .1
MoveEntity P,0,.1,0
CameraPick Camera,0,0
Wend
If Z < 1.0 Or PickedEntity() <> P Then RuntimeError "Unable to initialize 2d in 3d module"
TFormPoint PickedX(),PickedY(),Z,0,Camera
X# = Abs TFormedX()
Y# = Abs TFormedY()
i.t2dI3d = New t2dI3d
iX = X : iY = Y : i = Z : iW = ResW : iH = ResH : iCamera = Camera
FreeEntity P
Return Handle(i)
End Function


Function To3D(Source,X#,Y#,TFormGlobal = 0,TFormTo=0)
i.t2dI3d = Object.t2dI3d(Source)
X# = -iX + ((X# / iW) * (iX * 2))
Y# = iY - ((Y# / iH) * (iY * 2))
If TFormGlobal = 0 Then
TFormPoint X,Y,i,iCamera,TFormTo
X3D = TFormedX() : Y3D = TFormedY() : Z3D = TFormedZ()
Return
EndIf

X3D = X : Y3D = Y : Z3D = i
Return
End Function

Function MovePanel(Source,Panel,X#,Y#)
i.t2dI3d = Object.t2dI3d(Source)
To3D(Source,iW/2+X,iH/2+Y)
p.Panel = Object.Panel(Panel)
To3D(Source,X,Y)
End Function

Function PositionPanel(Source,Panel,X#,Y#,CenterX=0,CenterY=0)
i.t2dI3d = Object.t2dI3d(Source)
p.Panel = Object.Panel(Panel)

If CenterX Then X = X - pWidth/2
If CenterY Then Y = Y - pHeight/2

To3D(Source,X,Y)
PositionEntity pMesh,X3D,Y3D,Z3D,0
End Function

Function CreateQuad(Source,X#,Y#,Width#,Height#,CenterX=0,CenterY=0)
If CenterX >= 1 Then : CenterX = 1 : Else : CenterX = 0 : EndIf
If CenterY >= 1 Then : CenterY = 1 : Else : CenterY = 0 : EndIf
X = X - Width * (CenterX*.5)
Y = Y - Height * (CenterY*.5)

i.t2dI3d = Object.t2dI3d(Source)
M = CreateMesh()
S = CreateSurface(M)
To3D(Source,X,Y)
TFormPoint X3D,Y3D,Z3D,iCamera,0
PositionEntity M,TFormedX(),TFormedY(),TFormedZ(),1
RotateEntity M,EntityPitch(iCamera,1),EntityYaw(iCamera,1),EntityRoll(iCamera,1),1
EntityParent M,iCamera,1

To3D Source,X,Y
TFormPoint X3D,Y3D,Z3D,iCamera,M
V = AddVertex(S,TFormedX(),TFormedY(),TFormedZ(),0,0)

To3D Source,X+Width,Y
TFormPoint X3D,Y3D,Z3D,iCamera,M
AddVertex(S,TFormedX(),TFormedY(),TFormedZ(),1,0)

To3D Source,X+Width,Y+Height
TFormPoint X3D,Y3D,Z3D,iCamera,M
AddVertex(S,TFormedX(),TFormedY(),TFormedZ(),1,1)

To3D Source,X,Y+Height
TFormPoint X3D,Y3D,Z3D,iCamera,M
AddVertex(S,TFormedX(),TFormedY(),TFormedZ(),0,1)

AddTriangle S,V,V+1,V+2
AddTriangle S,V+2,V+3,V

EntityFX M,1+2+16+32
EntityOrder M,-100

p.Panel = New Panel
pX = X
pY = Y
pWidth = Width
pHeight = Height
pMesh = M
Return Handle(p)
End Function


Function AddQuad(Source,Panel,X#,Y#,Width#,Height#,CenterX=0,CenterY=0)
i.t2dI3d = Object.t2dI3d(Source)

p.Panel = Object.Panel(Panel)

M = pMesh
S = GetSurface(M,1)

To3D Source,X,Y
TFormPoint X3D,Y3D,Z3D,iCamera,M
V = AddVertex(S,TFormedX(),TFormedY(),TFormedZ(),0,0)

To3D Source,X+Width,Y
TFormPoint X3D,Y3D,Z3D,iCamera,M
AddVertex(S,TFormedX(),TFormedY(),TFormedZ(),1,0)

To3D Source,X+Width,Y+Height
TFormPoint X3D,Y3D,Z3D,iCamera,M
AddVertex(S,TFormedX(),TFormedY(),TFormedZ(),1,1)

To3D Source,X,Y+Height
TFormPoint X3D,Y3D,Z3D,iCamera,M
AddVertex(S,TFormedX(),TFormedY(),TFormedZ(),0,1)

AddTriangle S,V,V+1,V+2
AddTriangle S,V+2,V+3,V
End Function


Function CreateTriangleFan(Source,X#,Y#,Radius#,InnerRadius#,StartAngle#=0,AngleMax#=360,Segments=24,FlipY=0,FlipX=0)
i.t2dI3d = Object.t2dI3d(Source)
M = CreateMesh()
S = CreateSurface(M)
TurnEntity M,0,0,180*FlipY
TurnEntity M,0,180*FlipX,0
To3D(Source,X,Y)
TFormPoint X3D,Y3D,Z3D,iCamera,0
PositionEntity M,TFormedX(),TFormedY(),TFormedZ(),1
RotateEntity M,EntityPitch(iCamera,1),EntityYaw(iCamera,1),EntityRoll(iCamera,1),1
EntityParent M,iCamera,1

AStep# = (AngleMax-StartAngle)/Segments
A# = StartAngle

For n = 0 To Segments-1
A# = 180 + StartAngle + AStep*n
To3D(Source, X+Sin(A)*Radius, Y+Cos(A)*Radius )
TFormPoint X3D,Y3D,Z3D,iCamera,M
V = AddVertex( S, TFormedX(),TFormedY(),TFormedZ(), 0, 0 )

To3D(Source, X+Sin(A+AStep)*Radius, Y+Cos(A+AStep)*Radius )
TFormPoint X3D,Y3D,Z3D,iCamera,M
AddVertex( S, TFormedX(),TFormedY(),TFormedZ(), 1, 0 )

To3D(Source, X+Sin(A+AStep)*InnerRadius, Y+Cos(A+AStep)*InnerRadius )
TFormPoint X3D,Y3D,Z3D,iCamera,M
AddVertex( S, TFormedX(),TFormedY(),TFormedZ(), 1, 1 )

To3D(Source, X+Sin(A)*InnerRadius, Y+Cos(A)*InnerRadius )
TFormPoint X3D,Y3D,Z3D,iCamera,M
AddVertex( S, TFormedX(),TFormedY(),TFormedZ(), 0, 1 )

AddTriangle S,V+2,V+1,V
AddTriangle S,V,V+3,V+2
Next
EntityFX M,1+2+16+32
TurnEntity M,0,0,180*FlipY
TurnEntity M,0,180*FlipX,0
EntityOrder M,-100

p.Panel = New Panel
pX = X
pY = Y
pWidth = .001
pHeight = .001
pMesh = M
Return Handle(P)
End Function


Function AddTriangleFan(Source,Panel,X#,Y#,Radius#,InnerRadius#,StartAngle#=0,AngleMax#=360,Segments=24)
i.t2dI3d = Object.t2dI3d(Source)

p.Panel = Object.Panel(Panel)
M = pMesh

S = GetSurface(M,1)

AStep# = (AngleMax-StartAngle)/Segments
A# = StartAngle

For n = 0 To Segments-1
A# = 180 + StartAngle + AStep*n
To3D(Source, X+Sin(A)*Radius, Y+Cos(A)*Radius )
TFormPoint X3D,Y3D,Z3D,iCamera,Mesh
V = AddVertex( S, TFormedX(),TFormedY(),TFormedZ(), 0, 0 )

To3D(Source, X+Sin(A+AStep)*Radius, Y+Cos(A+AStep)*Radius )
TFormPoint X3D,Y3D,Z3D,iCamera,Mesh
AddVertex( S, TFormedX(),TFormedY(),TFormedZ(), 1, 0 )

To3D(Source, X+Sin(A+AStep)*InnerRadius, Y+Cos(A+AStep)*InnerRadius )
TFormPoint X3D,Y3D,Z3D,iCamera,Mesh
AddVertex( S, TFormedX(),TFormedY(),TFormedZ(), 1, 1 )

To3D(Source, X+Sin(A)*InnerRadius, Y+Cos(A)*InnerRadius )
TFormPoint X3D,Y3D,Z3D,iCamera,Mesh
AddVertex( S, TFormedX(),TFormedY(),TFormedZ(), 0, 1 )

AddTriangle S,V+2,V+1,V
AddTriangle S,V,V+3,V+2
Next
End Function


Function ColorMeter(Panel,Percent#,RFrom=255,GFrom=255,BFrom=255,AFrom#=1,RTo=128,GTo=128,BTo=128,ATo#=.5)
p.Panel = Object.Panel(Panel)
Mesh = pMesh
S = GetSurface(Mesh,1)

Vs = CountVertices(S)
For v = 0 To Vs-1 Step 4
A# = (Float(v+4)/(Vs))*100
If A <= Percent Then
For n = 0 To 3
VertexColor S,v+n,RFrom,GFrom,BFrom,AFrom
Next
ElseIf NoBlend = 0 Then
D# = (A#-Percent)/((1.0/(Vs/4))*100)
D2# = 1.0 - D

R# = RFrom*D2 + RTo*D
G# = GFrom*D2 + GTo*D
B# = BFrom*D2 + BTo*D
A# = AFrom*D2 + ATo*D
For n = 0 To 3
VertexColor S,v+n,R,G,B,A
Next
NoBlend = 1
Else
For n = 0 To 3
VertexColor S,v+n,RTo,GTo,BTo,ATo
Next
EndIf
Next
End Function

Function TexturePanel(Panel,Texture,Frame=0,Layer=0)
p.Panel = Object.Panel(Panel)
EntityTexture pMesh,Texture,Frame,Layer
End Function

Function PanelOrder(Panel,Z%)
p.Panel = Object.Panel(Panel)
EntityOrder pMesh,-100-Z
End Function

Function PanelBlend(Panel,Blend)
p.Panel = Object.Panel(Panel)
EntityBlend pMesh,Blend
End Function

Function PanelFX(Panel,FX)
p.Panel = Object.Panel(Panel)
EntityFX pMesh,FX
End Function

Function LoadPanel(Source,X,Y,Path$,Flags=1+8,CenterX=0,CenterY=0)
I = LoadImage(Path$)
T = LoadTexture(Path$,Flags)
W = ImageWidth(I)
H = ImageHeight(I)
Q = CreateQuad(Source,X,Y,W,H,CenterX,CenterY)
TexturePanel Q,T
FreeTexture T
FreeImage I
Return Q
End Function
;#End Region


Comments : none...