8f3114e377
Signed-off-by: Michael Fabian Dirks <michael.dirks@project-kube.de>
122 lines
3.8 KiB
BlitzBasic
122 lines
3.8 KiB
BlitzBasic
Const ImpostorVariant = 0
|
|
|
|
Type Impostor
|
|
Field Frames%
|
|
Field FrameWidth%, FrameHeight%
|
|
Field PitchFrames%, PitchMin#, PitchMax#
|
|
Field YawFrames%, YawMin#, YawMax#
|
|
Field Sheet%
|
|
|
|
Field Pivot%, Parent%
|
|
Field Mesh%, Surface%
|
|
|
|
Field YawStep#, PitchStep#
|
|
End Type
|
|
|
|
Function Impostor_Init.Impostor(Parent%=0)
|
|
Local Instance.Impostor = New Impostor
|
|
Instance\Pivot = CreatePivot(Parent)
|
|
Instance\Mesh = CreateMesh(Instance\Pivot)
|
|
Instance\Surface = CreateSurface(Instance\Mesh)
|
|
Local V0,V1,V2,V3
|
|
V0 = AddVertex(Instance\Surface, -1, 1, 0, 1, 0, 0)
|
|
V1 = AddVertex(Instance\Surface, 1, 1, 0, 0, 0, 0)
|
|
V2 = AddVertex(Instance\Surface, -1, -1, 0, 1, 1, 0)
|
|
V3 = AddVertex(Instance\Surface, 1, -1, 0, 0, 1, 0)
|
|
AddTriangle Instance\Surface, V0, V2, V1
|
|
AddTriangle Instance\Surface, V1, V2, V3
|
|
Return Instance
|
|
End Function
|
|
|
|
Function Impostor_Load.Impostor(Path$, Flags%=1+4+16+32+256+512, Parent%=0)
|
|
If FileType(Path) <> 1 Then
|
|
RuntimeError "Impostor: Given <Path$> is not a file."
|
|
Else
|
|
Local Stream = ReadFile(Path)
|
|
If Stream = 0 Then
|
|
RuntimeError "Impostor: Unable to open given <Path$>."
|
|
Else
|
|
Local Instance.Impostor = Impostor_Init(Parent)
|
|
|
|
Instance\FrameWidth = ReadShort(Stream)
|
|
Instance\FrameHeight = ReadShort(Stream)
|
|
Instance\PitchFrames = ReadByte(Stream)
|
|
Instance\PitchMin = ReadFloat(Stream)
|
|
Instance\PitchMax = ReadFloat(Stream)
|
|
Instance\YawFrames = ReadByte(Stream)
|
|
Instance\YawMin = ReadFloat(Stream)
|
|
Instance\YawMax = ReadFloat(Stream)
|
|
|
|
Local BaseName$ = Impostor_StripExtension(Path)
|
|
Instance\Sheet = LoadAnimTexture(BaseName + "png", Flags, Instance\FrameWidth, Instance\FrameHeight, 0, Instance\PitchFrames * Instance\YawFrames)
|
|
If Instance\Sheet = 0 Then RuntimeError "Impostor: Unable to open texture for given <Path$>."
|
|
|
|
Instance\YawStep = (Instance\YawMax - Instance\YawMin) / Instance\YawFrames
|
|
Instance\PitchStep = (Instance\PitchMax - Instance\PitchMin) / Instance\PitchFrames
|
|
|
|
Return Instance
|
|
EndIf
|
|
EndIf
|
|
End Function
|
|
|
|
Function Impostor_Create.Impostor(Mesh%, Diffuse%)
|
|
|
|
|
|
|
|
End Function
|
|
|
|
Function Impostor_Update(Camera%)
|
|
Local Instance.Impostor = Null
|
|
For Instance = Each Impostor
|
|
Impostor_UpdateSingle(Camera, Instance)
|
|
Next
|
|
End Function
|
|
|
|
Function Impostor_UpdateSingle(Camera%, Impostor.Impostor)
|
|
; Calculate current Yaw frame and Pitch frame.
|
|
PointEntity Impostor\Mesh, Camera, 0
|
|
|
|
Local Yaw# = Impostor_Math_MaxMin(EntityYaw(Impostor\Mesh), Impostor\YawMax, Impostor\YawMin) - Impostor\YawMin
|
|
Local Pitch# = Impostor_Math_MaxMin(EntityPitch(Impostor\Mesh), Impostor\PitchMax, Impostor\PitchMin) - Impostor\PitchMin
|
|
|
|
Local YawFrame = Int(Yaw / Impostor\YawStep)
|
|
Local PitchFrame = Floor(Pitch / Impostor\PitchStep)
|
|
DebugLog YawFrame
|
|
EntityTexture Impostor\Mesh, Impostor\Sheet, PitchFrame * Impostor\YawFrames + YawFrame, 0
|
|
EntityFX Impostor\Mesh, 16
|
|
RotateEntity Impostor\Mesh, Impostor\PitchMin - PitchFrame * Impostor\PitchStep, 180 + Impostor\YawMin + YawFrame * Impostor\YawStep, 0
|
|
End Function
|
|
|
|
Function Impostor_StripExtension$(Path$)
|
|
Local RPath$ = Path$
|
|
For temp_Pos = Len(Path)-1 To 1 Step -1
|
|
If Mid(Path, temp_Pos, 1) = "."
|
|
RPath = Left(Path, temp_Pos)
|
|
Exit
|
|
EndIf
|
|
Next
|
|
Return RPath
|
|
End Function
|
|
|
|
Function Impostor_Math_MaxMin#(Value#, Max#, Min#)
|
|
If Value> Max Then Return Max
|
|
If Value < Min Then Return Min
|
|
Return Value
|
|
End Function
|
|
Function Impostor_Math_Max#(Value#, Max#)
|
|
If Value> Max Then Return Max
|
|
Return Value
|
|
End Function
|
|
Function Impostor_Math_Min#(Value#, Min#)
|
|
If Value < Min Then Return Min
|
|
Return Value
|
|
End Function
|
|
Function Impostor_Math_Clip#(Value#, Low#, High#)
|
|
Local Out#, Diff#
|
|
Diff = High-Low:Out = Value-Low
|
|
If (Out >= Diff) Then Out = Out - Floor(Out/Diff)*Diff
|
|
If (Out < 0) Then Out = Out - Floor(Out/Diff)*Diff
|
|
Return Low+Out
|
|
End Function
|
|
;~IDEal Editor Parameters:
|
|
;~C#Blitz3D |