Code archives/3D Graphics - Mesh/CLE - Cower Landscape Editor
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
| This was my counter-action to FLE becoming closed-source and for-profit. It was a relatively complete editor that used the what I believe was called F-UI. Unfortunately, I no longer have F-UI or Blitz3D.. or much else in that area, so you may be out of luck if you're hoping to use the old UI. However, I did include a means of replacing the UI rather easily, so it shouldn't be too much trouble to adapt to your own needs. This uses the old 'tried and true' vertex alpha stuff that .. you get the idea. To get right to where the GUI is implemented and read the basic documentation, search for #gui-key in the code. I tried to support both 2D and 3D GUIs, as it was obviously not possible for me to expect others to have the same assets as I did. | |||||
;#Region INPUT GLOBALS
;; Set these globals inside your CLEUpdateGUI* function- either 2D or 3D, but they have to be set in order for CLE to work properly
Global PaintMode% = 0 ;; The paint mode (0 for texture painting, 1 for raising terrain, 2 for lowering terrain, 3 for smoothing terrain)
Global BrushSize% = 0 ;; The size of the brush
Global BrushSpeed# = .1 ;; The speed of the brush
Global BrushLayer% = 0 ;; The current layer to be painted on
Global MXS#,MYS#,MZS#,MX#,MY#,MZ# ;; Mouse X/Y/Z speed and mouse X/Y/Z position
Global MD1%,MD2%,MD3% ;; Mouse button down
Global Camera% ;; Camera used for moving around the terrain
Global WindowWidth% ;; Window width
Global WindowHeight% ;; Window height
Global EndEditor% = 0 ;; Close the editor
;#End Region
Include "CLE_GUI.bb"
;#Region TERRAIN SYSTEM
Type CLETexture
Field Path$
Field Flags%
Field Blend%
Field SX#
Field SY#
Field Texture%
Field Index
End Type
Global Terra = CreateStack() ;; Terrain meshes- uses AnimaStack
Global TexStack = CreateStack() ;; Textures
Global LayerTex = CreateStack() ;; Layer textures
Global TerrainRoot = 0 ;; The first layer of the terrain mesh
Dim OptimArray(0) ;; Used in optimization of the terrain mesh on load
;#Region CREATE TERRAIN [ SEGMENTS ]
Function t_CreateTerrain(Segments=32,Layers=1)
ClearTerrain() ;; Precaution against creating more than one terrain that isn't optimized
For i = 0 To Layers-1
om = mesh
mesh = CreateSegQuad(Segments,0,0)
PushObject Terra,mesh
If i > 0
EntityFX mesh,2+32
EntityParent mesh,om,0
Else
EntityFX mesh,2
EndIf
TranslateEntity mesh,0,.00036*i,0
PushObject LayerTex,CreateStack()
Next
EntityPickMode GetObject(Terra,0),2
RaiseLayer 0,0,512,2
TerrainRoot = GetObject(Terra,0)
Return TerrainRoot
End Function
;#End Region
;#Region HEIGHTMAP
;#Region APPLY HEIGHT MAP [ MAP [ SCALE ] ]
Function ApplyHeightmap(Map$,Scale#=1.0)
If Objects(Terra) = 0 Then Return 0
Segments = Sqr(CountVertices(GetSurface(GetObject(Terra,i),1)))
tm = LoadImage(Map$)
If tm = 0 Then DebugLog( "ERROR:: Heightmap '"+Map$+"' does not exist" ) Return 0
w = ImageWidth(tm)
h = ImageHeight(tm)
buffer = ImageBuffer(tm)
LockBuffer(buffer)
For ix# = 0 To Segments-1
For iz# = 0 To Segments - 1
x = (ix / segments) * w
z = (iz / segments) * h
v = ix + iz * segments
r# = (Float(((ReadPixelFast(x,z,buffer) Shr 16) And 255) - 128) / 255) * Scale
For i = 0 To Objects(Terra)-1
s = GetSurface(GetObject(Terra,i),1)
VertexCoords(s,v,VertexX(s,v),r,VertexZ(s,v))
Next
Next
Next
For i = 0 To Objects(Terra)-1
UpdateNormals GetObject(Terra,i)
Next
UnlockBuffer(buffer)
FreeImage tm
Return 1
End Function
;#End Region
;#Region EXPORT HEIGHTMAP [ PATH ]
Function ExportHeightmap(Path$)
If Objects(Terra) = 0 Then Return 0
Mesh = GetObject(Terra,0)
s = GetSurface(Mesh,1)
segments = Sqr(CountVertices(s))
image = CreateImage(segments,segments)
b = ImageBuffer(image)
LockBuffer(b)
Local minx#=10000,miny#=-10000,minz#
For i = 0 To CountVertices(s)-1
v# = VertexY(s,i)
If v < minx Then minx = v
If v > miny Then miny = v
Next
minz = miny-minx
For i = 0 To CountVertices(s)-1
x = i Mod segments
y = (i - x)/segments
l# = ((VertexY(s,i)-minx)/minz)*255
WritePixelFast x,y,255 Shl 24 Or l Shl 16 Or l Shl 8 Or l,b
Next
UnlockBuffer(b)
SaveImage(image,Path$)
FreeImage image
Return 1
End Function
;#End Region
;#End Region
;#Region CLEAR TERRAIN
Function ClearTerrain()
While Objects(Terra) > 0
FreeEntity PopObject(Terra)
Wend
While Objects(LayerTex) > 0
FreeStack PopObject(LayerTex)
Wend
End Function
;#End Region
;#Region CLM FORMAT
;#Region CONSTANTS
;; The CLM (Cower Landscape Mesh) plays off the file structure of Gile[s]'s, the (damn cool) lightmapper, scene files
Const CLM_HEADER = $1000 ;; Header- one string and a float
Const CLM_AUTHOR = $1001 ;; Author of the file being saved
Const CLM_TEXTURES = $3001 ;; Opening of the texture list
Const CLM_TEXTURE = $3002 ;; Opening of a texture
Const CLM_TEXTUREPATH = $3003 ;; Sets the path from which the texture will be loaded from
Const CLM_TEXTUREFLAGS = $3004 ;; Sets the flags the texture is loaded with
Const CLM_LOADTEXTURE = $3005 ;; Tells the importer to load the texture at this point because it has sufficient data to do so
Const CLM_TEXTUREBLEND = $3006 ;; Sets the blend mode of the texture
Const CLM_TEXTURESCALE = $3007 ;; Sets the scale of the texture
Const CLM_LAYERS = $2000 ;; Opening of the layers, one byte and one int
Const CLM_LAYER = $2001 ;; Opening of a CLE layer, one byte
Const CLM_LAYERFORMAT = $2002 ;; 1- Alpha
Const CLM_LAYERDATA = $2003 ;; N Bytes; refer to CLM_MESHFORMAT
Const CLM_HEIGHTDATA = $2004 ;; The heightmap information- two floats to set delta and minimum y and all bytes to determine height afterwards
Const CLM_LAYERTEXTURES = $2005 ;; The textures applied to the layer
Const CLM_HEIGHTFORMAT = $2006 ;; The format in which the heightmap data is stored
;#End Region
;#Region EXPORT CLM
Function ExportCLM(Name$)
If Objects(Terra) = 0 Then Return
F = WriteFile(Name$+".clm")
If F = 0 Then DebugLog "Failed to open "+Name$+".clm for writing, check file properties"+Chr(10)+FileType(Name$+".clm")+ " " + FileSize(Name$+".clm") Return 0
Local Paths$[7]
WriteInt F,CLM_HEADER
WriteInt F,12
WriteString F,"CLMesh_"
WriteFloat F,0.6
WriteInt F,CLM_TEXTURES
WriteInt F,0
For i = 0 To Objects(TexStack)-1
t.CLETexture = Object.CLETexture(GetObject(TexStack,i))
WriteInt F,CLM_TEXTURE
WriteInt F,0
WriteInt F,CLM_TEXTUREPATH
WriteInt F,Len(t\Path)+1
WriteString F,t\Path
WriteInt F,CLM_FLAGS
WriteInt F,2
WriteShort F,t\Flags
WriteInt F,CLM_TEXTUREBLEND
WriteInt F,1
WriteByte F,t\Blend
WriteInt F,CLM_TEXTURESCALE
WriteInt F,8
WriteFloat F,t\SX
WriteFloat F,t\SY
WriteInt F,CLM_LOADTEXTURE
WriteInt F,0
Next
WriteInt F,CLM_LAYERS
WriteInt F,5
WriteByte F,Objects(Terra)
WriteInt F,Sqr(CountVertices(GetSurface(GetObject(Terra,0),1)))
For i = 0 To Objects(Terra)-1
s = GetSurface(GetObject(Terra,i),1)
Bytes = CountVertices(s)
WriteInt F,CLM_LAYER
WriteInt F,1
WriteByte F,i
WriteInt F,CLM_LAYERFORMAT
WriteInt F,1
WriteByte F,1
WriteInt F,CLM_LAYERDATA
WriteInt F,Bytes
For n = 0 To Bytes-1
WriteByte F,VertexAlpha(s,n)*255
Next
WriteInt F,CLM_LAYERTEXTURES
WriteInt F,2+Objects(GetObject(LayerTex,i))*2
st = GetObject(LayerTex,i)
WriteShort F,Objects(st)
For n = 0 To Objects(st)-1
WriteShort F,GetObject(st,n)
Next
Next
minx# = -1000
miny# = 1000
WriteInt F,CLM_HEIGHTFORMAT
WriteInt F,1
WriteByte F,2
WriteInt F,CLM_HEIGHTDATA
s = GetSurface(GetObject(Terra,0),1)
WriteInt F,CountVertices(s)*4
; For n = 0 To CountVertices(s)-1
; y# = VertexY(s,n)
; If y < miny Then miny = y
; If y > minx Then minx = y
; Next
;
; d# = minx - miny
;
; WriteFloat F,d
; WriteFloat F,miny
For n = 0 To CountVertices(s)-1
WriteFloat F,VertexY(s,n)
Next
Return 1
End Function
;#End Region
;#Region IMPORT CLM
;; Setting the optimize flag to 1/True will make the loaded mesh unuseable in the editor, but it can drastically reduce the polygon count of terrain
Function ImportCLM(Name$,Optimize=0)
Local F = ReadFile(Name$+".clm")
If F = 0 Then DebugLog "Failed to open "+Name$+".clm for reading, check file properties"+Chr(10)+FileType(Name$+".clm")+ " " + FileSize(Name$+".clm") Return 0
tex = -1
ClearTerrain()
While Not Eof(F)
Class = ReadInt(F)
Size = ReadInt(F)
Position = FilePos(F)
Select Class
Case CLM_HEADER
Header$ = ReadString(F)
Version# = ReadFloat(F)
Case CLM_AUTHOR
Author = ReadString(F)
Case CLM_TEXTURES
Case CLM_TEXTURE
tex = -1
sx# = 1
sy# = 1
blend = 5
Case CLM_TEXTUREPATH
path$ = ReadString(F)
Case CLM_TEXTUREFLAGS
flags = ReadShort(F)
Case CLM_TEXTUREBLEND
blend = ReadByte(F)
If tex >= 0 Then
t_TextureBlend tex,blend
EndIf
Case CLM_TEXTURESCALE
sx# = ReadFloat(F)
sy# = ReadFloat(F)
If tex >= 0 Then
t_ScaleTexture tex,sx,sy
EndIf
Case CLM_LOADTEXTURE
tex = t_LoadTexture(path$,flags,sx,sy,blend)
Case CLM_LAYERS
Layers = ReadByte(F)
Segments = ReadInt(F)
Terrain = t_CreateTerrain(Segments,Layers)
Case CLM_LAYER
Layer = ReadByte(F)
Case CLM_LAYERFORMAT
Format = ReadByte(F)
If (Format And 1) = 1 Then Alpha = 1
Case CLM_LAYERDATA
Vertices = Segments*Segments-1
s = GetSurface(GetObject(Terra,Layer),1)
For i = 0 To Vertices
a# = Float(ReadByte(F))/255
VertexColor s,i,VertexRed(s,i),VertexGreen(s,i),VertexBlue(s,i),a
Next
UpdateNormals(GetObject(Terra,Layer))
Case CLM_LAYERTEXTURES
textures = ReadShort(F)
For i = 1 To textures
index = ReadShort(F)
t_ApplyTexture Layer,index
Next
Case CLM_HEIGHTFORMAT
hmf = ReadByte(F)
Case CLM_HEIGHTDATA
If (hmf And 2) = 2 Then
For i = 0 To CountVertices(GetSurface(GetObject(Terra,0),1))-1
h# = ReadFloat(F)
For n = 0 To Objects(Terra)-1
s = GetSurface(GetObject(Terra,n),1)
VertexCoords s,i,VertexX(s,i),h,VertexZ(s,i)
Next
Next
Else
delta# = ReadFloat(F)
my# = ReadFloat(F)
For i = 0 To Segments*Segments-1
h# = Float(ReadByte(F))/255
For n = 0 To Objects(Terra)-1
s = GetSurface(GetObject(Terra,n),1)
VertexCoords s,i,VertexX(s,i),my+h*delta,VertexZ(s,i)
Next
Next
EndIf
For n = 0 To Objects(Terra)-1
UpdateNormals(GetObject(Terra,n))
Next
Default
SeekFile(F,Position+Size)
End Select
Wend
If Optimize Then
told = Terrain
Dim OptimArray(CountTriangles(GetSurface(GetObject(Terra,0),1))-1)
root = 0
For i = 0 To Objects(Terra)-1
s = GetSurface(GetObject(Terra,i),1)
m2 = M
M = CreateMesh()
If m2 <> 0 Then EntityParent m2,M
ss = CreateSurface(M)
TranslateEntity M,0,.0015*i,0
If i = 0 Then
root = M
Else
EntityFX M,2+32
EndIf
For v = 0 To CountVertices(s)-1
AddVertex ss,VertexX(s,v),VertexY(s,v),VertexZ(s,v),VertexU(s,v),VertexV(s,v)
VertexNormal ss,v,VertexNX(s,v),VertexNY(s,v),VertexNZ(s,v)
VertexColor ss,v,VertexRed(s,v),VertexGreen(s,v),VertexBlue(s,v),VertexAlpha(s,v)
Next
For t = 0 To CountTriangles(s)-1
If OptimArray(t) = 0 And M <> root Then
a# = 0
For n = 0 To 2
a# = a# + VertexAlpha(s,TriangleVertex(s,t,n))
Next
If a = 3 Then OptimArray(t) = 1
If a > 0 Then AddTriangle ss,TriangleVertex(s,t,0),TriangleVertex(s,t,1),TriangleVertex(s,t,2)
ElseIf root = M Then
AddTriangle ss,TriangleVertex(s,t,0),TriangleVertex(s,t,1),TriangleVertex(s,t,2)
EndIf
Next
Next
Dim OptimArray(0)
ClearTerrain()
Terrain = root
EndIf
Return Terrain
End Function
;#End Region
;#End Region
;#Region LAYER CONTROL
;#Region RAISE LAYER [ INDEX [ LAYER [ SIZE ] ] ]
Function RaiseLayer(Index,Layer,Size%=1,Speed#=.01,Mode=0)
If Objects(Terra) = 0 Then Return
If Index < 0 Then Return 0
Segments = Sqr(CountVertices(GetSurface(GetObject(Terra,0),1)))
x = Index Mod Segments
Y = (Index-ix)/Segments
ssize# = Sqr(Size*Size+Size*Size)
fD# = Sqr(Size*Size+Size*Size)
For ix = -Floor(fD) To Floor(fD)
For iy = -Floor(fD) To Floor(fD)
vx = x + ix
vy = y + iy
vertex = vx + vy * segments
vl = vertex - 1
vr = vertex + 1
va = vertex - segments
vb = vertex + segments
If vx > -1 And vx < segments And vy > -1 And vy < segments Then
If Size > 0 Then
d# = Min(1.0-(Sqr(ix*ix+iy*iy)/fD),0)
Else
d# = 1
EndIf
For i = 1-Max(Min(Mode,0),1) To Objects(Terra)-1
s = GetSurface(GetObject(Terra,i),1)
If Mode = 0 Then
a# = VertexAlpha(s,vertex)
If i <> Layer Then
a# = Min(a# -Speed*d,0)
Else
a# = Max(a# +Speed*d,1)
EndIf
VertexColor s,vertex,VertexRed(s,vertex),VertexGreen(s,vertex),VertexBlue(s,vertex),a#
ElseIf Mode = 1
VertexCoords s,vertex,VertexX(s,vertex),VertexY(s,vertex)+(Speed*d)*.5,VertexZ(s,Vertex)
ElseIf Mode = 2
VertexCoords s,vertex,VertexX(s,vertex),VertexY(s,vertex)-(Speed*d)*.5,VertexZ(s,Vertex)
ElseIf Mode = 3
div = 1
zy# = VertexY(s,vertex)
For ly = -4 To 4
For lx = -4 To 4
vl = vertex +ly*segments +lx
If SameRow(vl,vertex+ly*segments,segments) And vl > -1 And vl < CountVertices(s)
div = div + 1
zy = zy + VertexY(s,vl)
EndIf
Next
Next
If div > 0 Then
zy# = zy# / div
dy# = zy# - VertexY(s,vertex)
ny# = VertexY(s,vertex) + (dy * Speed);*d ;; I decided not to make this one affected by radial falloff. you can uncomment the *d if you want it to.
VertexCoords s,vertex,VertexX(s,vertex),ny#,VertexZ(s,Vertex)
EndIf
EndIf
Next
EndIf
Next
Next
If Mode > 0 Then
For i = 0 To Objects(Terra)-1
UpdateNormals(GetObject(Terra,i))
Next
EndIf
End Function
;#End Region
;#Region APPLY TEXTURE [ LAYER [ TEXTURE ] ] ]
Function t_ApplyTexture(Layer, Texture)
If Objects(Terra) = 0 Then Return
If Layer < 0 Or Layer >= Objects(Terra) Then Return 0
Index = Objects(GetObject(LayerTex,Layer))
i.CLETexture = Object.CLETexture(GetObject(TexStack,Texture))
If i = Null Then Return 0
EntityTexture GetObject(Terra,Layer),i\Texture,0,Index
PushObject GetObject(LayerTex,Layer),i\Index
End Function
;#End Region
;#Region GENERATE
Function GenerateTerrain(Rock=1, Sand=2,Normal#=.35)
If Objects(Terra) = 0 Then Return
rs = GetSurface(GetObject(Terra,Rock),1)
For i = 0 To CountVertices(rs)-1
y# = Abs(VertexNY(rs,i))
If y =< Normal Then
a# = y / (Normal/2)
VertexColor rs,i,VertexRed(rs,i),VertexGreen(rs,i),VertexBlue(rs,i),a
Else
VertexColor rs,i,VertexRed(rs,i),VertexGreen(rs,i),VertexBlue(rs,i),0
EndIf
Next
If Sand < 0 Then Return
ss = GetSurface(GetObject(Terra,Sand),1)
segments = Sqr(CountVertices(ss))
For i = 0 To CountVertices(ss)-1
l = 0
a = i
d = i
k=0
For n = 1 To 6
a = i- Segments*n
d = i+ Segments*n
If a > -1 Then
If VertexAlpha(rs,a) = 0 Then l = l + 1
Else
k = k + 1
EndIf
If d < CountVertices(ss)
If VertexAlpha(rs,d) = 0 Then l = l + 1
Else
k = k + 1
EndIf
Next
If VertexAlpha(rs,i) = 0 Then l = l + 1
a = i
d = i
If l = 13-k Then
; VertexColor ss,i,VertexRed(ss,i),VertexGreen(ss,i),VertexBlue(ss,i),VertexAlpha(ss,i)+.5
For n = 1 To 6
a = i- Segments*n
d = i+ Segments*n
If a > -1 Then
VertexColor ss,a,VertexRed(ss,a),VertexGreen(ss,a),VertexBlue(ss,a),VertexAlpha(ss,a)+(Float(6-n)/6)*.05
EndIf
If d < CountVertices(ss)
VertexColor ss,d,VertexRed(ss,d),VertexGreen(ss,d),VertexBlue(ss,d),VertexAlpha(ss,d)+(Float(6-n)/6)*.05
EndIf
Next
EndIf
Next
End Function
;#End Region
;#Region ADD LAYER
;; Adds another layer on top of all the others
Function AddLayer()
If Objects(Terra) = 0 Then Return
b = CreateBrush()
root = GetObject(Terra,0)
m = CopyMesh(root)
TranslateEntity m,0,.00036,0
PaintEntity m,b
FreeBrush b
EntityFX m,2+32
s = GetSurface(m,1)
For i = 0 To CountVertices(s)-1
VertexColor s,i,255,255,255,0
Next
EntityParent m,GetObject(Terra,Objects(Terra)-1),0
PushObject Terra,m
PushObject LayerTex,CreateStack()
End Function
;#End Region
;#Region REMOVE LAYER
;; Removes the top-most layer from the terrain, you have to be careful with this 'cause you may accidentally lose work if calling it at the wrong time
Function RemoveLayer()
If Objects(Terra) = 0 Then Return
Layer = Objects(Terra)-1
If Layer = 0 Then Return 0
FreeEntity PopObject(Terra)
For i = Layer To Objects(Terra)-1
TranslateEntity GetObject(Terra,i),0,-.0015,0
Next
FreeStack PopObject(LayerTex)
Return 1
End Function
;#End Region
;#Region RESET LAYER
Function ResetLayer(Layer)
If Layer < 0 Or Layer > Objects(Terra)-1 Then Return 0
b = CreateBrush()
If Layer > 0 Then
BrushFX b,2+32
Else
BrushFX b,2
EndIf
PaintEntity GetObject(Terra,Layer),b
FreeBrush b
End Function
;#End Region
;#Region TEXTURE
Function t_LoadTexture(Path$,Flags%,SX#=1,SY#=1,Blend=5)
For i.CLETexture = Each CLETexture
If Lower(i\Path$) = Lower(Path$) Then Return i\Index
Next
i.CLETexture = New CLETexture
i\Texture = LoadTexture(Path$,Flags%)
tex = i\Texture
i\Path = Path
i\Flags = Flags
ScaleTexture tex,SX,SY
i\SX = SX
i\SY = SY
i\Blend = Blend
TextureBlend tex,Blend
i\Index = Objects(TexStack)
PushObject TexStack,Handle(i)
Return i\Index
End Function
Function t_TextureBlend(ind,blend)
i.CLETexture = Object.CLETexture(GetObject(TexStack,ind))
i\Blend = blend
TextureBlend i\Texture,blend
End Function
Function t_ScaleTexture(ind,sx#,sy#)
i.CLETexture = Object.CLETexture(GetObject(TexStack,ind))
i\sx = sx : i\sy = sy
ScaleTexture i\texture,sx,sy
End Function
;#End Region
;#End Region
;#End Region
CLEInit()
;#Region SKY
; Sky = MakeSkyBox("sky")
;#End Region
;#Region LIGHTING
AmbientLight 128,128,128
l = CreateLight(1)
PositionEntity(l,25,75,25)
LightRange(l,150)
LightColor l,150,150,150
;#End Region
Repeat
CLEUpdateGUI3D()
;#Region CAMERA
rts# = rts * .85
pts# = pts * .85
sts# = sts * .75
fts# = fts * .75
If MouseDown(2) And (Not CLEMouseInGUI()) Then
MoveMouse WindowWidth/2,WindowHeight/2
pts = pts + MYS*.25
rts = rts - MXS*.25
TurnEntity Camera,pts,rts,0
RotateEntity Camera,EntityPitch(Camera),EntityYaw(Camera),0
sts = sts + (KeyDown(32)-KeyDown(30))*.03
fts = fts + (KeyDown(17)-KeyDown(31))*.03
MoveEntity Camera,sts,0,fts
EndIf
;#End Region
;#Region SKY
; PositionEntity Sky,EntityX(Camera,1),EntityY(Camera,1),EntityZ(Camera,1)
;#End Region
;#Region TERRAIN
If Objects(Terra) > 0 Then
If Not CLEMouseInGUI()
pick = CameraPick( Camera,MX,MY )
If pick = GetObject(Terra,0) And MouseDown(1) Then RaiseLayer(PickedVertex(),BrushLayer,BrushSize,BrushSpeed,PaintMode)
EndIf
EndIf
;#End Region
;#Region SYSTEM
UpdateWorld
RenderWorld
CLEUpdateGUI2D()
Flip False
;#End Region
Until EndEditor = 1
ClearWorld()
EndGraphics()
End()
;#Region CREATE SEG QUAD [ SEGMENTS [ SEGMENTED [ CENTERED ] ] ]
Function CreateSegQuad(Segments=16,Segmented=0,Centered=0)
sx = 0
sz = 0
st = Segments-1
m = CreateMesh()
s = CreateSurface(m)
If Segmented = 0 Then
For x# = sx To st
For z# = sz To st
vertex = CountVertices(s)
AddVertex s, x, 0, z, x / Segments, z / Segments
; VertexNormal s,vertex,0,1,0
Next
Next
For ix = 0 To st-1
For iz = 0 To st-1
v1 = (iz) * Segments + (ix)
v2 = (iz) * Segments + (ix+1)
v3 = (iz+1) * Segments + (ix+1)
v4 = (iz+1) * Segments + (ix)
AddTriangle s,v1,v2,v3
AddTriangle s,v3,v4,v1
Next
Next
Else
For x# = sx To st
For z# = sz To st
vertex = CountVertices(s)
AddVertex s,x,0,z,0,0
AddVertex s,x+1,0,z,1,0
AddVertex s,x+1,0,z+1,1,1
AddVertex s,x,0,z+1,0,1
AddTriangle s,vertex,vertex+1,vertex+2
AddTriangle s,vertex+2,vertex+3,vertex
For i = 0 To 3
; VertexNormal s,vertex+i,0,1,0
Next
Next
Next
EndIf
ScaleMesh m,1.0/Segments,1,1.0/Segments
Return m
End Function
;#End Region
;#Region MATH
Function Min#(x#,y#) ; Returns x if x > y, else y
If x < y Then Return y
Return x
End Function
Function Max#(x#,y#) ; Returns x if x < y, else y
If x > y Then Return y
Return x
End Function
Function SameRow(x,z,width)
y = x
x = x Mod width
y = y - x
z = (z - (z Mod width))/width
If y/width <> z Then Return 0
Return 1
End Function
;#End Region
;#Region MESH
Function PickedVertex()
s = PickedSurface()
If s = 0 Then Return -1
x# = PickedX()
y# = PickedY()
z# = PickedZ()
piv = CreatePivot()
PositionEntity piv,x,y,z
d# = -1
piv2 = CreatePivot()
t = PickedTriangle()
Local d2#[2]
Local v2%[2]
For i = 0 To 2
v = TriangleVertex(s,t,i)
TFormPoint VertexX(s,v),VertexY(s,v),VertexZ(s,v),PickedEntity(),0
PositionEntity piv2,TFormedX(),TFormedY(),TFormedZ()
d2[i] = EntityDistance(piv,piv2)
v2[i] = v
Next
FreeEntity piv2
FreeEntity piv
If d2[0] < d2[1] And d2[0] < d2[2] Then
Return v2[0]
ElseIf d2[1] < d2[0] And d2[1] < d2[2] Then
Return v2[1]
Else
Return v2[0]
EndIf
End Function
;#End Region
;#Region COLOR
Const RALPHA = 24 ;Return Alpha when using RColor
Const RRED = 16 ;Return Red when using RColor
Const RGREEN = 8 ;Return Green when using RColor
Const RBLUE = 0 ;Return Blue when using RColor
Function IntColor(R,G,B,A=255)
Return A Shl 24 Or R Shl 16 Or G Shl 8 Or B Shl 0
End Function
Function RColor%(c%,d%)
Return c Shr d And 255 Shl 0
End Function
;#End Region
;#Region SKY [ PATH ]
;; AGore's nice sky box code
;; Taken from Samples/AGore/BirdDemo
;; I'm not sure what license this is under, so it is not under the license the rest of this source is [NOTE: this is probably pub. domain now]
Function MakeSkyBox( file$ )
m=CreateMesh()
;front face
b=LoadBrush( file$+"_FR.bmp",49 )
s=CreateSurface( m,b )
AddVertex s,-1,+1,-1,0,0:AddVertex s,+1,+1,-1,1,0
AddVertex s,+1.5,-1,-1.5,1,1:AddVertex s,-1.5,-1,-1.5,0,1
AddTriangle s,0,1,2:AddTriangle s,0,2,3
FreeBrush b
;right face
b=LoadBrush( file$+"_LF.bmp",49 )
s=CreateSurface( m,b )
AddVertex s,+1,+1,-1,0,0:AddVertex s,+1,+1,+1,1,0
AddVertex s,+1.5,-1,+1.5,1,1:AddVertex s,+1.5,-1,-1.5,0,1
AddTriangle s,0,1,2:AddTriangle s,0,2,3
FreeBrush b
;back face
b=LoadBrush( file$+"_BK.bmp",49 )
s=CreateSurface( m,b )
AddVertex s,+1,+1,+1,0,0:AddVertex s,-1,+1,+1,1,0
AddVertex s,-1.5,-1,+1.5,1,1:AddVertex s,+1.5,-1,+1.5,0,1
AddTriangle s,0,1,2:AddTriangle s,0,2,3
FreeBrush b
;left face
b=LoadBrush( file$+"_RT.bmp",49 )
s=CreateSurface( m,b )
AddVertex s,-1,+1,+1,0,0:AddVertex s,-1,+1,-1,1,0
AddVertex s,-1.5,-1,-1.5,1,1:AddVertex s,-1.5,-1,+1.5,0,1
AddTriangle s,0,1,2:AddTriangle s,0,2,3
FreeBrush b
;top face
b=LoadBrush( file$+"_UP.bmp",49 )
s=CreateSurface( m,b )
AddVertex s,-1,+1,+1,0,1:AddVertex s,+1,+1,+1,0,0
AddVertex s,+1,+1,-1,1,0:AddVertex s,-1,+1,-1,1,1
AddTriangle s,0,1,2:AddTriangle s,0,2,3
FreeBrush b
;bottom face - this bit was added by me. 'cause i wanted a bottom face. WHAT!? YOU DON'T SEE IT BUT I NEED IT THERE ANYWAY!
b=LoadBrush( file$+"_BT.bmp",49 )
s=CreateSurface( m,b )
AddVertex s,-1.5,-1,+1.5,0,1:AddVertex s,+1.5,-1,+1.5,0,0
AddVertex s,+1.5,-1,-1.5,1,0:AddVertex s,-1.5,-1,-1.5,1,1
AddTriangle s,0,1,2:AddTriangle s,0,2,3
FreeBrush b
ScaleEntity m,20,20,20
FlipMesh m
EntityFX m,1+16+8
EntityOrder m,100
Return m
End Function
;#End Region
;#Region TEXTS [ X [ Y [ T$ [ CX [ CY ] ] ] ] ]
Function Texts(X,Y,T$,CX=0,CY=0)
Color 0,0,0
Text X-1,Y-1,T$,CX,CY
Text X+1,Y-1,T$,CX,CY
Text X+1,Y+1,T$,CX,CY
Text X-1,Y+1,T$,CX,CY
Text X,Y-1,T$,CX,CY
Text X,Y+1,T$,CX,CY
Text X-1,Y,T$,CX,CY
Text X+1,Y,T$,CX,CY
Color 255,255,255
Text X,Y,T$,CX,CY
End Function
;#End Region
;#Region PUSH/POP DATA
Global PoppedValue$
Global PoppedClass%
Type Stack
Field F.StackObj
Field L.StackObj
Field Objects
End Type
Type StackObj
Field Parent.Stack
Field N.StackObj
Field P.StackObj
Field Value$
Field Class%
End Type
Function CreateStack()
Local s.Stack
s.Stack = New Stack
Return Handle(s)
End Function
Function PushObject(Stack,Value$,Class%=0,ToFront=0)
Local s.Stack,i.StackObj
s.Stack = Object.Stack(Stack)
s\Objects = s\Objects + 1
i.StackObj = New StackObj
i\Value = Value
i\Class = Class
i\Parent = s
If ToFront = 0 Then
If s\F = Null And s\L = Null Then
s\F = i
s\L = s\F
Else
i\P = s\L
s\L\N = i
s\L = i
EndIf
Else
If s\F = Null And s\L = Null Then
s\F = i
s\L = s\F
Else
i\N = s\F
s\F\P = i
s\F = i
EndIf
EndIf
End Function
Function PopObject$(Stack,FromFront=0,RemoveData=1)
Local s.Stack,i.StackObj,v$
s.Stack = Object.Stack(Stack)
If RemoveData > 0 Then s\Objects = s\Objects - 1
If FromFront = 0 Then
i.StackObj = s\L
If RemoveData > 0 Then
s\L = i\P
If S\L <> Null Then s\L\N = Null
EndIf
Else
i.StackObj = s\F
If RemoveData > 0 Then
s\F = i\N
If S\F <> Null Then s\F\P = Null
EndIf
EndIf
If s\L = Null Then s\L = s\F
If s\F = Null Then s\F = s\L
PoppedClass = i\Class
PoppedValue = i\Value
v$ = i\Value
If RemoveData > 0 Then Delete i
Return V
End Function
Function Objects(Stack)
Local s.Stack
s.Stack = Object.Stack(Stack)
Return s\Objects
End Function
Function GetObject$(Stack,Index,RemoveData = 0,Reverse=0)
Local s.Stack,i.StackObj,n
s.Stack = Object.Stack(Stack)
i.StackObj = s\F
If Reverse Then Index = (s\Objects-1)-Index
Repeat
If i = Null Then
Return False
ElseIf n = Index Then
PoppedValue = i\Value
PoppedClass = i\Class
If RemoveData Then
If i\P <> Null Then i\P\N = i\N
If i\N <> Null Then i\N\P = i\P
s\Objects = s\Objects - 1
Delete i
EndIf
Return PoppedValue
EndIf
i = i\N
n = n + 1
Forever
End Function
Function InsertObject(Stack,Index,Value$="",Class%=0)
Local s.Stack,i.StackObj,o.StackObj,ne.StackObj,pr.StackObj,n
s.Stack = Object.Stack(Stack)
i.StackObj = s\F
o.StackObj = New StackObj
o\Value$ = Value
o\Class% = Class
o\Parent = s
Repeat
If i\N = Null Or n = Index Then
ne.StackObj = i\N
pr.StackObj = i\P
If ne <> Null Then ne\P = o
If pr <> Null Then pr\N = o
If ne = Null Then s\L = o
If pr = Null Then s\F = o
o\N = ne
o\P = pr
Return True
EndIf
i = i\N
n = n + 1
Forever
End Function
Function FreeStack(Stack)
Local s.Stack,i.StackObj
s.Stack = Object.Stack(Stack)
Delete s
For i.StackObj = Each StackObj
If i\Parent = Null Then Delete i
Next
End Function
;#End Region
;;;;;;;;;;;;;; THIS IS WHERE THE GUI BEGINS ;;;;;;;;;;;;;;;;;;;
; #gui-key
; If you intend to replace the GUI, be aware of the functions
; marked as required. You will have to implement those, either
; the 3D set or the 2D set.
;; This is the old GUI, probably doesn't work with any version of F-UI that does
;; not include my vast array of changes (now lost to time)
Include "FUI/F-UI.bb"
Type CLEGUI
Field Window
Field View
Field BrushParmsSize
Field BrushParmsSpeed
Field BrushModeGroup
Field BrushParmsModePaint
Field BrushParmsModeRaise
Field BrushParmsModeLower
Field BrushParmsModeSmooth
Field LayerList
Field ControlTab
Field BrushPage
Field LayerStack
Field mnCLMNew
Field mnCLMSave
Field mnCLMLoad
Field mnCreateWindow
Field mnCreateSegments
Field mnApplyHMap
Field mnExportHMap
Field mnQuit
Field cmLayer
Field cmLayerAdd
Field cmLayerRmv
Field cmLayerReset
Field TexPage
Field TexList
Field BtnApplyTexture
Field ScaleSpinner
Field BlendGroup
Field BlendRadioAlp
Field BlendRadioMul
Field BlendRadioAdd
Field BlendRadioMod
Field cmTexture
Field cmTextureLoad
Field tlStack
Field selTex
Field nterraWin
Field spnSegments
Field lblAmnt
Field btnOK
Field btnCancel
Field hmpCancel
Field hmpOK
Field hmpWin
Field hmpSize
Field pathText
Field opnPath
End Type
Type TextureBlock
Field Node
Field Index
Field Path$
Field Name$
End Type
Global GUI.CLEGUI
;; This function is REQUIRED
;; Use this function to intialize graphics mode, create the camera, set texture filters, etc.
Function CLEInit()
FUI_LoadResolution("CLE.cfg")
WINDOW_RESIZE_METHOD = 0
FUI_Initialise(800,600,32,2,0,1,"CLE",".72b") ;; That bit about '.72b' is just bullshit, ignore it
GUI = New CLEGUI
GUI\Window = FUI_Window(0,0,192+12,GraphicsHeight(),"Control Panel",0,1+2,2)
; GUI\Window = FUI_Window(0,0,GraphicsWidth(),GraphicsHeight(),"Control Panel",0,1+2,2)
; v.View = Object.View(GUI\View)
GUI\tlStack = CreateStack()
FUI_LockWindow(GUI\Window)
GUI\ControlTab = FUI_Tab(GUI\Window,6,128,192,GraphicsHeight()-128-52)
GUI\BrushPage = FUI_TabPage(GUI\ControlTab,"Brush")
GUI\TexPage = FUI_TabPage(GUI\ControlTab,"Textures")
GUI\LayerList = FUI_ListBox(GUI\Window,6,6,192,128-12,0,1)
FUI_Label(GUI\BrushPage,6,6,"Brush Size")
GUI\BrushParmsSize = FUI_Slider(GUI\BrushPage,6,6+16*1+32*0,192-24,16,0,25,BrushSize,12,DIR_HORIZONTAL)
FUI_Label(GUI\BrushPage,6,6+16*1+32*1,"Brush Speed")
GUI\BrushParmsSpeed = FUI_Slider(GUI\BrushPage,6,6+16*2+32*1,192-24,16,0.01,.5,BrushSpeed,12,DIR_HORIZONTAL)
GUI\BrushModeGroup = FUI_GroupBox(GUI\BrushPage,6,116,192-36,12+78+8,"Brush Mode")
GUI\BrushParmsModePaint = FUI_Radio(GUI\BrushModeGroup,6,6,"Paint",1,0)
GUI\BrushParmsModeRaise = FUI_Radio(GUI\BrushModeGroup,6,6+18,"Raise",0,0)
GUI\BrushParmsModeLower = FUI_Radio(GUI\BrushModeGroup,6,6+36,"Lower",0,0)
GUI\BrushParmsModeSmooth = FUI_Radio(GUI\BrushModeGroup,6,6+36+18,"Smooth",0,0)
GUI\TexList = FUI_ListBox(GUI\TexPage,6,6,192-12,128-12,0,1)
GUI\BtnApplyTexture = FUI_Button(GUI\TexPage,6,128,192-12,24,"Apply Texture")
FUI_Label(GUI\TexPage,6,128+24+10,"Scale")
GUI\ScaleSpinner = FUI_Spinner(GUI\TexPage, (192-12)/2-48, 128+24+6, 48+(192-12)/2, 24, 0, 20, 1.0, 0.01, DTYPE_FLOAT)
GUI\BlendGroup = FUI_GroupBox(GUI\TexPage,6,128+48+12,192-12,22*4+4,"Blend Mode")
GUI\BlendRadioAlp = FUI_Radio(GUI\BlendGroup,2,1+19*0,"Alpha",1,1)
GUI\BlendRadioMul = FUI_Radio(GUI\BlendGroup,2,1+19*1,"Multiply",0,1)
GUI\BlendRadioAdd = FUI_Radio(GUI\BlendGroup,2,1+19*2,"Add",0,1)
GUI\BlendRadioMod = FUI_Radio(GUI\BlendGroup,2,1+19*3,"Modulate 2X",0,1)
file=FUI_MenuTitle(GUI\Window,"File")
GUI\mnCLMNew = FUI_MenuItem(file,"New")
GUI\mnCLMLoad = FUI_MenuItem(file,"Load")
GUI\mnCLMSave = FUI_MenuItem(file,"Save")
FUI_MenuBar(file)
GUI\mnApplyHMap = FUI_MenuItem(file,"Load Heightmap")
GUI\mnExportHMap = FUI_MenuItem(file,"Save Heightmap")
FUI_MenuBar(file)
GUI\mnQuit = FUI_MenuItem(file,"Quit")
GUI\cmLayer = FUI_ContextMenu()
GUI\cmLayerAdd = FUI_ContextMenuItem(GUI\cmLayer,"Add Layer")
GUI\cmLayerRmv = FUI_ContextMenuItem(GUI\cmLayer,"Remove Layer")
FUI_ContextMenuBar(GUI\cmLayer)
GUI\cmLayerReset = FUI_ContextMenuItem(GUI\cmLayer,"Reset Textures")
GUI\cmTexture = FUI_ContextMenu()
GUI\cmTextureLoad = FUI_ContextMenuItem(GUI\cmTexture,"Load Texture")
GUI\nterraWin = FUI_Window( app\W/2-101, app\H/2-50, 202, 100, "New Terrain", "", 1 )
GUI\spnSegments = FUI_Spinner( GUI\nterraWin, 120, 8, 70, 20, 0.0, 128.0, 64.0, 1.0, DTYPE_INTEGER, "" )
GUI\lblAmnt = FUI_Label( GUI\nterraWin, 14, 12, "Amount of Segments" )
GUI\btnOK = FUI_Button( GUI\nterraWin, 26, 42, 70, 20, "OK" )
GUI\btnCancel = FUI_Button( GUI\nterraWin, 110, 42, 70, 20, "Cancel" )
FUI_HideGadget(GUI\nterraWin)
hmpWin = FUI_Window( app\W/2-267/2, app\H/2-55, 267, 128, "Load Heightmap", "", 1 )
FUI_Label( hmpWin, 10, 42, "Scale" )
hmpSize = FUI_Spinner( hmpWin, 46, 40, 92, 20, -100.0, 100.0, 1.0, .01, DTYPE_FLOAT, "" )
FUI_Label( hmpWin, 10, 16, "Path" )
pathText = FUI_TextBox( hmpWin, 46, 12, 200, 22, 0 )
opnPath = FUI_Button( hmpWin, 245, 12, 16, 22, "..." )
hmpOK = FUI_Button( hmpWin, 30, 74, 70, 20, "OK" )
hmpCancel = FUI_Button( hmpWin, 112, 74, 70, 20, "Cancel" )
FUI_ModalWindow(hmpWin,0)
GUI\hmpWin = hmpWin
GUI\pathText = pathText
GUI\opnPath = opnPath
GUI\hmpSize = hmpSize
GUI\hmpOK = hmpOK
GUI\hmpCancel = hmpCancel
FUI_HideGadget(GUI\hmpWin)
Camera = app\Cam
CameraRange Camera,.01,5000
CameraFogMode Camera,1
CameraFogColor Camera,220,250,252
CameraFogRange Camera,35,150
CameraClsColor Camera,192,200,240
PositionEntity Camera,0,50,0
GUI\LayerStack = CreateStack()
TextureFilter "",1+8
FUI_SetGadgetAlpha(GUI\Window,.8,1)
FUI_SetGadgetAlpha(GUI\nterraWin,.8,1)
FUI_SetGadgetAlpha(GUI\hmpWin,.8,1)
WindowWidth = app\W
WindowHeight = app\H
GUI\selTex = -1
End Function
;; This function is REQUIRED
;; If you are not using a 2D GUI then leave its contents blank, but you MUST have it defined
Function CLEUpdateGUI2D()
End Function
;; This function is REQUIRED
;; If you are not using a 3D GUI then leave its contents blank, but you MUST have it defined
Function CLEUpdateGUI3D()
If Objects(Terra) > 0 Then
FUI_EnableGadget(GUI\cmLayerRmv)
FUI_EnableGadget(GUI\cmLayerAdd)
FUI_EnableGadget(GUI\cmLayerReset)
Else
FUI_DisableGadget(GUI\cmLayerRmv)
FUI_DisableGadget(GUI\cmLayerAdd)
FUI_DisableGadget(GUI\cmLayerReset)
EndIf
If FUI_OverGadget(GUI\LayerList) And app\MB2 Then
FUI_OpenContextMenu(GUI\cmLayer)
ElseIf FUI_OverGadget(GUI\TexList) And app\MB2 Then
FUI_OpenContextMenu(GUI\cmTexture)
EndIf
; CameraClsMode Camera,1,1
FUI_Update()
; CameraClsMode Camera,0,0
If Terra <> 0 Then
While Objects(GUI\LayerStack) <> Objects(Terra)
If Objects(Terra) > Objects(GUI\LayerStack) Then
PushObject GUI\LayerStack,FUI_ListBoxItem(GUI\LayerList,"Layer "+(Objects(GUI\LayerStack)+1))
Else
FUI_DeleteGadget(PopObject(GUI\LayerStack))
EndIf
Wend
EndIf
MX = app\MX
MY = app\MY
MZ = app\MZ
MXS = app\MXS
MYS = app\MYS
MZS = app\MZS
MD1 = app\MB1
MD2 = app\MB2
MD3 = app\MB3
app\currentFile = "burnInHellMemoryAccessViolation"
If GUI\selTex = -1 Then
FUI_DisableGadget(GUI\BtnApplyTexture)
; FUI_DisableGadget(GUI\BlendGroup)
FUI_DisableGadget(GUI\ScaleSpinner)
FUI_DisableGadget(GUI\BlendRadioAlp)
FUI_DisableGadget(GUI\BlendRadioMul)
FUI_DisableGadget(GUI\BlendRadioAdd)
FUI_DisableGadget(GUI\BlendRadioMod)
Else
FUI_EnableGadget(GUI\BtnApplyTexture)
; FUI_EnableGadget(GUI\BlendGroup)
FUI_EnableGadget(GUI\ScaleSpinner)
FUI_EnableGadget(GUI\BlendRadioAlp)
FUI_EnableGadget(GUI\BlendRadioMul)
FUI_EnableGadget(GUI\BlendRadioAdd)
FUI_EnableGadget(GUI\BlendRadioMod)
EndIf
For i = 0 To Objects(TexStack)-1
d.CLETexture = Object.CLETexture(GetObject(TexStack,i))
Found = 0
p$ = d\Path
For n = 1 To Len(p)
If Left(Right(p,n),1) = "\" Or Left(Right(p,n),1) = "/" Then
p$ = Trim(Right(p,n-1))
Exit
EndIf
Next
For t.TextureBlock = Each TextureBlock
If Lower(p) = Lower(t\Name) Then
Found = 1
Exit
EndIf
Next
If Found = 0 Then
image = LoadImage(d\Path)
If image = 0 Then
ResizeImage image,16,16
t.TextureBlock = New TextureBlock
t\Node = FUI_ListBoxItem(GUI\TexList,p$,image)
t\Name = p
t\Path = d\Path
FreeImage Image
PushObject GUI\tlStack,Handle(t)
EndIf
EndIf
Next
; f.ListBox = Object.ListBox(GUI\TexList)
;
; For i = 0 To Objects(GUI\tlStack)-1
; t.TextureBlock = Object.TextureBlock(GetObject(GUI\tlStack,i))
; If f\overItem = Null
; FUI_HideGadget t\ImageBox
; Else
; If Handle(f\overItem) = t\Node
; FUI_ShowGadget t\ImageBox
; Else
; FUI_HideGadget t\ImageBox
; EndIf
; EndIf
; Next
For e.Event = Each Event
Select e\EventID
Case GUI\cmLayerRmv
RemoveLayer()
Case GUI\cmLayerAdd
AddLayer()
Case GUI\cmLayerReset
ResetLayer(BrushLayer)
Case GUI\BrushParmsSize
BrushSize = e\EventData
Case GUI\BrushParmsSpeed
BrushSpeed = e\EventData
Case GUI\BrushParmsModePaint
PaintMode = 0
Case GUI\BrushParmsModeRaise
PaintMode = 1
Case GUI\BrushParmsModeLower
PaintMode = 2
Case GUI\BrushParmsModeSmooth
PaintMode = 3
Case GUI\ScaleSpinner
t_ScaleTexture GUI\selTex,e\EventData,e\EventData
Case GUI\BlendRadioAlp
t_TextureBlend GUI\selTex,1
Case GUI\BlendRadioMul
t_TextureBlend GUI\selTex,2
Case GUI\BlendRadioAdd
t_TextureBlend GUI\selTex,3
Case GUI\BlendRadioMod
t_TextureBlend GUI\selTex,5
Case GUI\BtnApplyTexture
t_ApplyTexture BrushLayer,GUI\selTex
Case GUI\mnCLMSave
FUI_SaveDialog("Save landscape..","","Cower Landscape Mesh (*.clm)|*.clm|All files (*.*)|*.*")
path$ = Replace( Lower(app\currentFile),".clm","" )
ExportCLM(path$)
Case GUI\mnCLMLoad
FUI_OpenDialog("Load landscape..","","Cower Landscape Mesh (*.clm)|*.clm|All files (*.*)|*.*")
path$ = app\currentFile
While Objects(GUI\LayerStack)
FUI_DeleteGadget(PopObject(GUI\LayerStack))
Wend
If FileType(path$) = 1 Then
path$ = Replace( Lower(app\currentFile),".clm","" )
ter = ImportCLM(path$)
ScaleEntity ter,50,50,50
EndIf
Case GUI\mnCLMNew
While Objects(GUI\LayerStack)
FUI_DeleteGadget(PopObject(GUI\LayerStack))
Wend
FUI_ModalWindow(GUI\Window,0)
FUI_ShowGadget(GUI\nterraWin)
FUI_ModalWindow(GUI\nterraWin,1)
Delete e
Repeat
FUI_Update()
For k.Event = Each Event
Select k\EventID
Case GUI\btnOK
Segments = FUI_SendMessageI(GUI\spnSegments,M_GETVALUE)
ter = t_CreateTerrain(Segments,1)
If ter <> 0 Then ScaleEntity ter,50,50,50
quitLoop = 1
Case GUI\btnCancel
quitLoop = 1
End Select
Delete k
Next
RenderWorld
Flip 0
Until quitLoop = 1
FUI_HideGadget(GUI\nterraWin)
FUI_ModalWindow(GUI\nterraWin,0)
FUI_ModalWindow(GUI\Window,1)
Case GUI\mnApplyHMap
Delete e
FUI_ModalWindow(GUI\Window,0)
FUI_SendMessage(GUI\pathText,M_SETTEXT,"")
FUI_SendMessage(GUI\hmpSize,M_SETVALUE,1.0)
FUI_ShowGadget(GUI\hmpWin)
FUI_ModalWindow(GUI\hmpWin,1)
size# = 1.0
path$ = ""
Repeat
FUI_Update()
For k.Event = Each Event
Select k\EventID
Case GUI\hmpSize
size# = k\EventData
Case GUI\hmpOK
If FileType(path$) = 1 Then
ApplyHeightmap(path$,size#)
EndIf
quitLoop = 1
Case GUI\hmpCancel
quitLoop = 1
Case GUI\opnPath
FUI_OpenDialog("Load heightmap..","","PNG (*.png)|*.png|Bitmap (*.bmp)|*.bmp|Targa (*.tga)|*.tga|JPG (*.jpg)|*.jpg|All files (*.*)|*.*")
path$ = app\currentFile
FUI_SendMessage GUI\pathText,M_SETTEXT,path$
Case GUI\pathText
path$ = k\EventData
End Select
Delete k
Next
RenderWorld
Flip 0
Until quitLoop = 1
FUI_ModalWindow(GUI\hmpWin,0)
FUI_HideGadget(GUI\hmpWin)
FUI_ModalWindow(GUI\Window,1)
Case GUI\mnExportHMap
FUI_SaveDialog("Save landscape..","","Bitmap (*.bmp)|*.bmp|All files (*.*)|*.*")
path$ = app\currentFile
ExportHeightmap(path$)
Case GUI\mnQuit
q = FUI_CustomMessageBox("Are you sure you want to quit?","Quit",MB_YESNO)
If q = IDYES Then
Delete GUI
EndEditor = 1
Exit
EndIf
Case GUI\cmTextureLoad
FUI_OpenDialog("Load texture..","","PNG (*.png)|*.png|Bitmap (*.bmp)|*.bmp|Targa (*.tga)|*.tga|JPG (*.jpg)|*.jpg|All files (*.*)|*.*")
path$ = app\currentFile
If FileType(path$) = 1 Then
tex = t_LoadTexture(Path$,1+8,1.0,1.0,5)
For n = 1 To Len(path$)
If Left(Right(path$,n),1) = "\" Or Left(Right(path$,n),1) = "/" Then
name$ = Trim(Right(path$,n-1))
Exit
EndIf
Next
t.TextureBlock = New TextureBlock
image = LoadImage(path)
ResizeImage image,16,16
t\Node = FUI_ListBoxItem(GUI\TexList,name$,image)
t\Name = name
t\Index = tex
t\Path = path$
FreeImage image
PushObject GUI\tlStack,Handle(t)
EndIf
Default
For i = 0 To Objects(GUI\LayerStack)-1
If Int(GetObject(GUI\LayerStack,i)) = Int(e\EventID) Then
BrushLayer = i
Exit
EndIf
Next
For i = 0 To Objects(GUI\tlStack)-1
t.TextureBlock = Object.TextureBlock(GetObject(GUI\tlStack,i))
If t\Node = e\EventID Then
GUI\selTex = t\Index
d.CLETexture = Object.CLETexture(GetObject(TexStack,i))
FUI_SendMessage GUI\ScaleSpinner,M_SETVALUE,d\SX
Select d\Blend
Case 1
FUI_SendMessage GUI\BlendRadioAlp,M_SETCHECKED,1
FUI_SendMessage GUI\BlendRadioMul,M_SETCHECKED,0
FUI_SendMessage GUI\BlendRadioAdd,M_SETCHECKED,0
FUI_SendMessage GUI\BlendRadioMod,M_SETCHECKED,0
Case 2
FUI_SendMessage GUI\BlendRadioAlp,M_SETCHECKED,0
FUI_SendMessage GUI\BlendRadioMul,M_SETCHECKED,1
FUI_SendMessage GUI\BlendRadioAdd,M_SETCHECKED,0
FUI_SendMessage GUI\BlendRadioMod,M_SETCHECKED,0
Case 3
FUI_SendMessage GUI\BlendRadioAlp,M_SETCHECKED,0
FUI_SendMessage GUI\BlendRadioMul,M_SETCHECKED,0
FUI_SendMessage GUI\BlendRadioAdd,M_SETCHECKED,1
FUI_SendMessage GUI\BlendRadioMod,M_SETCHECKED,0
Case 5
FUI_SendMessage GUI\BlendRadioAlp,M_SETCHECKED,0
FUI_SendMessage GUI\BlendRadioMul,M_SETCHECKED,0
FUI_SendMessage GUI\BlendRadioAdd,M_SETCHECKED,0
FUI_SendMessage GUI\BlendRadioMod,M_SETCHECKED,1
End Select
Exit
EndIf
Next
End Select
Next
Delete Each Event
End Function
;; This function is REQUIRED
;; This function should return whether or not the mouse is over/inside of the
;; GUI area (the area you don't want to have the camera rotate/move when mouse
;; 2 is pressed).
Function CLEMouseInGUI()
If GUI = Null Then Return -1
Return (FUI_OverGadget(GUI\Window))
End Function |
Comments
| ||
| Thanks Noel. |
Code Archives Forum