Ok here's my go at a tree... Fractal generated, kinda Lengthy code, and most of the constants at the top can be tweaked for, ah... shall I say... interesting effect...
Saddly I didn't have time to input animation and other such things as I'm leaving for the weekend and just managed to finish the texture generation and rain as an added feature just a little bit ago.
da codz:
#constant C_basicLengthFactor 75.0
#constant C_basicSizeFactor 15.0
#constant C_BranchRadiusDecline 0.55
#constant C_BranchLengthDecline 0.70
#constant C_maxDownAngle 135
#constant C_branchMinAngle 30.0
#constant C_branchRndAngle 10.0
#constant C_trunkMinAngle 5.0
#constant C_trunkRndAngle 5.5
#constant C_textureDeScale 5.0
#constant C_BranchesPerLayer 3
#constant C_NumberOfLayers 5
#constant C_NumberOfLeaves 2
#constant C_XuprightOffset 270
#constant C_BarkTextureStart 1
#constant C_BarkTextureEnd 5
#constant C_LeafTextureStart 6
#constant C_LeafTextureEnd 10
#constant C_GroundTexture 100
#constant C_RainTexture 200
type XYZfloat
x as float
y as float
z as float
endtype
gosub setupEnvironment
do
text 10,10,"Screen FPS: " + str$(screen FPS())
text 10,30,"Polygons on Screen: " + str$(Statistic(1))
text 10,50,"Hold [Shift] and move mouse to turn, RMB goes forward, LMB goes backward"
text 10,70,"Press [Space] to generate a new tree..."
MouseControl(2)
`update rain
updateRain()
if spacekey() = 1
repeat
text 10,10,"Screen FPS: " + str$(screen FPS())
text 10,30,"Polygons on Screen: " + str$(Statistic(1))
text 10,50,"Hold [Shift] and move mouse to turn, RMB goes forward, LMB goes backward"
center text screen width()/2,70,"...Release [Space] to generate a new tree..."
MouseControl(2)
syn
il spacekey() = 0
if limbedTreeObj <> 0
if object exist(limbedTreeObj) = 1 then delete object limbedTreeObj
endif
text screen width()-text width("...Constructing New Tree "),70, "...Constructing New Tree "
sync
limbedTreeObj = CreateLimbedTree(XYZstartPos, XYZstartDir, C_BranchesPerLayer, C_NumberOfLayers, C_basicLengthFactor, C_basicSizeFactor)
pause("...New Tree Created, Press [space] to resume...")
endif
sync
loop
setupEnvironment:
sync on
sync rate 0
autocam off
set display mode 800,600,32
position camera 200,200,200
point camera 0,100,0
randomize timer()
`randomize 1
text 0,0,"Generating Bark Texture..."
sync
sync
for n = C_BarkTextureStart to C_BarkTextureEnd
BarkTexture(n)
next n
cls rgb(0,0,0)
ink rgb(255,255,255),0
text 0,0,"Generating Leaf Textures..."
sync
sync
for n = C_LeafTextureStart to C_LeafTextureEnd
LeafTexture(n)
next n
GroundTexture(C_GroundTexture)
global XYZfReturn as XYZfloat
global XYZstartDir as XYZfloat
global XYZstartPos as XYZfloat
global rainObj as integer
global limbedTreeObj as integer
XYZstartDir.x = 0
XYZstartDir.y = 0
XYZstartDir.z = 0
XYZstartPos.x = 0
XYZstartPos.y = 0
XYZstartPos.z = 0
make matrix 1, 5000, 5000, 35, 35
position matrix 1,-2500,0,-2500
set matrix wireframe on 1
prepare matrix texture 1, C_GroundTexture, 1, 1
fill matrix 1, 0, 1
randomize matrix 1,30
update matrix 1
ink rgb(255,255,255),0
fog on
fog color RGB(189,193,196)
fog distance 1000
color backdrop RGB(189,193,196)
limbedTreeObj = CreateLimbedTree(XYZstartPos, XYZstartDir, C_BranchesPerLayer, C_NumberOfLayers, C_basicLengthFactor, C_basicSizeFactor)
make light 1
set point light 1, -100, 100, -100
rainSpout()
ink rgb(150,150,150),0
return
function rainSpout()
RainTexture(C_RainTexture)
rainObj = FreeObject()
`MemblockTCone(rainObj, 20, 50, 30, 800)
`MemblockTCone(rainObj+1,20,75, 45, 800)
make object cylinder rainObj, 100 : scale object rainObj,200,800,200
make object cylinder rainObj+1, 100 : scale object rainObj+1,400,800,400
texture object rainObj, C_RainTexture
texture object rainObj+1, C_RainTexture
set object transparency rainObj, 0
set object transparency rainObj+1, 0
ghost object on rainObj
ghost object on rainObj+1
set object cull rainObj, 0
set object cull rainObj+1, 0
disable object zwrite rainObj
disable object zwrite rainObj+1
set object light rainObj, 0
set object light rainObj+1, 0
endfunction
function updateRain()
position object rainObj, camera position x(), 0, camera position z()
position object rainObj+1, camera position x(), 0, camera position z()
`position object rainObj, 0, 400, 0
`position object rainObj+1, 0, 400, 0
scroll object texture rainObj,0.0001,-0.005
scroll object texture rainObj+1,-0.0001,-0.005
endfunction
function CreateLimbedTree(pos as XYZfloat, direction as XYZfloat, BPL as integer, numLayers as integer, length as float, width as float)
local treeobj as integer
treeobj = FreeObject()
make object box treeobj, 0, 0, 0
DrawLimbedTree(numLayers, BPL, treeobj, 0, direction, pos, length, width)
`DrawLimbedTree(6, BPL, treeobj, 0, direction, pos, length, width)
set object transparency treeobj,1
endfunction treeobj
function DrawLimbedTree(n as integer,BPL as integer, obj as integer, limb as integer, direction as XYZfloat, pos as XYZfloat, length as float, width as float)
local RndBchDir as XYZfloat
local RndBchPos as XYZfloat
if n > 0
limb = DrawLimbedTrunk(n, obj, limb, pos, direction, length, width)
`sync
`pause("Created a Trunk")
if n > 1
rem trunk stem
RandomLimbedBranchDirection(C_trunkRndAngle, C_trunkMinAngle) : RndBchDir = XYZfReturn
NewLimbedTrunkPos(length) : RndBchPos = XYZfReturn
`pause("Stem")
DrawLimbedTree(n-1,BPL,obj,limb,RndBchDir,RndBchPos,LengthDeScale(n,length), SizeDeScale(n,width))
rem branches ahoy!!!
for i = 1 to BPL
RandomLimbedBranchDirection(C_branchRndAngle, C_branchMinAngle) : RndBchDir = XYZfReturn
RandomLimbedBranchPosition(length) : RndBchPos = XYZfReturn
`pause("Branches")
DrawLimbedTree(n-1,BPL,obj,limb,RndBchDir,RndBchPos,LengthDeScale(n,length), SizeDeScale(n,width))
next i
endif
endif
rem draw leaves...
if n <= 1 and C_NumberOfLeaves > 0
for i = 1 to C_NumberOfLeaves
RndBchPos.x = 0
RndBchPos.y = (i-1.0)*1.0*(length*0.666666 / (C_NumberOfLeaves*1.0)) + (length*0.3)
RndBchpos.z = 0
RndBchDir.x = -10 + rnd(20)
RndBchDir.y = -20 + rnd(40)
RndBchDir.z = 0
DrawLimbedLeaf(obj, limb, RndBchPos, RndBchDir, 6, 3)
RndBchDir.x = -10 + rnd(20)
RndBchDir.y = 160 + rnd(40)
DrawLimbedLeaf(obj, limb, RndBchPos, RndBchDir, 6, 3)
next i
RndBchDir.x = rnd(360)
RndBchDir.y = 0
RndBchDir.z = 90
RndBchPos.y = length - length * 0.125
DrawLimbedLeaf(obj, limb, RndBchPos, RndBchDir, 6, 3)
endif
endfunction
function DrawLimbedTrunk(n, obj, limb, pos as XYZfloat, direction as XYZfloat, length as float, width as float)
local meshNum as integer
local newLimb as integer
meshNum = FreeMesh()
newLimb = FreeLimb(obj)
`clone object objnum, baseTrunkObj
if n <= 1
MemblockMeshCone(meshNum, n+4, width, length)
`MemblockMeshTCone(meshNum, n+4, C_BranchRadiusDecline * width, width, length)
else
MemblockMeshTCone(meshNum, n+4, C_BranchRadiusDecline * width, width, length)
endif
add limb obj, newLimb, meshNum
link limb obj, limb, newLimb
rotate limb obj, newLimb, direction.x, direction.y, direction.z
offset limb obj, newLimb, pos.x, pos.y, pos.z
texture limb obj, newLimb, C_BarkTextureStart + rnd(C_BarkTextureEnd-C_BarkTextureStart)
`scale limb texture obj, newLimb, width/C_textureDeScale, width/C_textureDeScale
endfunction newLimb
function DrawLimbedLeaf(obj, limb, pos as XYZfloat, direction as XYZfloat, length as float, width as float)
local meshNum as integer
local newLimb as integer
meshNum = FreeMesh()
newLimb = FreeLimb(obj)
`clone object objnum, baseTrunkObj
MemblockMeshPlain(meshNum, width, length)
add limb obj, newLimb, meshNum
link limb obj, limb, newLimb
rotate limb obj, newLimb, direction.x, direction.y, direction.z
offset limb obj, newLimb, pos.x, pos.y, pos.z
texture limb obj, newLimb, C_LeafTextureStart+rnd(C_LeafTextureEnd - C_LeafTextureStart)
endfunction
function RandomLimbedBranchDirection(randomAngle as float, minAngle as float)
XYZfReturn.x = minAngle + rnd(randomAngle)
XYZfReturn.y = rnd(360)
XYZfReturn.z = 0
endfunction
function NewLimbedTrunkPos(length as float)
XYZfReturn.x = 0
XYZfReturn.y = length - length/40.0
XYZfReturn.z = 0
endfunction
function RandomLimbedBranchPosition(length as float)
XYZfReturn.x = 0
XYZfReturn.y = length/2.0 + rnd(length/3.0)
XYZfReturn.z = 0
endfunction
function SizeDeScale(n as integer, size as float)
rem more work, for n anyways...
local rtrn as float
rtrn = size*C_BranchRadiusDecline
endfunction rtrn
function LengthDeScale(n as integer, size as float)
local rtrn as float
rtrn = size*C_BranchLengthDecline
endfunction rtrn
function BarkTexture(imgNum as integer)
local xSize as integer
local ySize as integer
local tmpXa as integer
local tmpYa as integer
local tmpXb as integer
local tmpYb as integer
local extream as integer
xSize = 255
ySize = 255
cls rgb(120,90,70)
for n = 1 to (xSize+ySize)*50
extream = -60 + rnd(100)
ink rgb(110+rnd(20)+extream,80+rnd(20)+extream,60+rnd(20)+extream),0
circle rnd(xSize), rnd(ySize),3
next n
for n = 1 to (xSize+ySize)*3
extream = -60 + rnd(100)
ink rgb(110+rnd(20)+extream,80+rnd(20)+extream,60+rnd(20)+extream),0
tmpXa = rnd(xSize)
tmpYa = rnd(ySize - ySize/3)
tmpXb = tmpXa-3+rnd(6)
if tmpXb < 0 then tmpXb = 0
if tmpXb > xSize then tmpXb = xSize
tmpYb = tmpYa + rnd(ySize/2)
if tmpYb > ySize then tmpYb = ySize
line tmpXa, tmpYa, tmpXb, tmpYb
extream = -60 + rnd(100)
ink rgb(110+rnd(20)+extream,80+rnd(20)+extream,60+rnd(20)+extream),0
tmpXa = rnd(10)
for x = 1 to 5
circle rnd(xSize), rnd(ySize),5+tmpXa+x
next x
next n
blur bitmap 0,2
get image imgNum,xSize/4,ySize/4,(xSize*3)/4,(ySize*3)/4,0
endfunction
function LeafTexture(imgNum as integer)
cls rgb(0,0,0)
local xSize as integer
local ySize as integer
local fractQty as integer
local tmpXa as integer
local tmpYa as integer
local tmpXb as integer
local tmpYb as integer
local color as dword
local extream as integer
xSize = 100
ySize = 200
fractQty = 100
ink rgb(rnd(40),150+rnd(40)+extream,rnd(40)),0
for n = 0 to ySize*2
tmpXb = (sin(180.0*n*1.0/ySize*2.0)+1.0)*xSize/2.0
tmpXa = (sin(180.0*n*1.0/ySize*2.0+180)+1.0)*xSize/2.0
tmpYa = (cos(180.0*n*1.0/ySize*2.0)+1.0)*(ySize)/2.0
tmpYb = (cos(180.0*(n+1)*1.0/ySize*2.0)+1.0)*(ySize)/2.0
box tmpXb, tmpYa, tmpXa, tmpYb
next n
for n = 1 to fractQty
tmpXa = xSize/2
tmpYa = ySize-(abs(n-fractQty/2)/(fractQty/2.0))*ySize*0.7
tmpXb = (sin(360.0*n*1.0/fractQty*1.0 + 180)+1.0)*xSize/2.0
tmpYb = (cos(360.0*n*1.0/fractQty*1.0 + 180)+1.0)*(ySize)/2.0
extream = -50 + rnd(100)
color = rgb(rnd(40),100+rnd(40)+extream,rnd(40))
fracture(tmpXa,tmpYa,tmpXb,tmpYb, 50, 7, color)
next n
get image imgNum,0,0,xSize,ySize,0
endfunction
function GroundTexture(imgNum as integer)
local xSize as integer
local ySize as integer
local tmpXa as integer
local tmpYa as integer
local tmpXb as integer
local tmpYb as integer
local extream as integer
xSize = 255
ySize = 255
cls rgb(120,90,70)
for n = 1 to (xSize+ySize)*50
extream = -60 + rnd(100)
ink rgb(110+rnd(20)+extream,80+rnd(20)+extream,60+rnd(20)+extream),0
circle rnd(xSize), rnd(ySize),3
next n
for n = 1 to (xSize+ySize)*3
extream = -60 + rnd(100)
ink rgb(110+rnd(20)+extream,80+rnd(20)+extream,60+rnd(20)+extream),0
tmpXa = rnd(xSize)
tmpYa = rnd(ySize)
tmpXb = rnd(xSize)
tmpYb = rnd(ySize)
line tmpXa, tmpYa, tmpXb, tmpYb
extream = -60 + rnd(100)
ink rgb(110+rnd(20)+extream,80+rnd(20)+extream,60+rnd(20)+extream),0
tmpXa = rnd(10)
for x = 1 to 5
circle rnd(xSize), rnd(ySize),5+tmpXa+x
next x
next n
blur bitmap 0,2
get image imgNum,xSize/4,ySize/4,(xSize*3)/4,(ySize*3)/4,0
endfunction
function RainTexture(imgNum as integer)
local xSize as integer
local ySize as integer
local tmpXa as integer
local tmpYa as integer
local tmpXb as integer
local tmpYb as integer
local extream as integer
cls rgb(0,0,0)
xSize = 1200
ySize = 1200
create bitmap 1, xSize, ySize
set current bitmap 1
cls rgb(0,0,0)
for n = 1 to (xSize)*4
extream = -120 + rnd(40)
ink rgb(200+rnd(10)+extream,200+rnd(10)+extream,210+rnd(10)+extream),0
tmpXa = rnd(xSize)
tmpYa = rnd(ySize - 20)
tmpXb = tmpXa-3+rnd(6)
if tmpXb < 0 then tmpXb = 0
if tmpXb > xSize then tmpXb = xSize
tmpYb = tmpYa + rnd(10) + 10
if tmpYb > ySize then tmpYb = ySize
line tmpXa, tmpYa, tmpXb, tmpYb
next n
get image imgNum,0,0,xSize,ySize,0
delete bitmap 1
set current bitmap 0
endfunction
function MemblockTCone(object as integer, density as integer, topSize as float, btmSize as float, height as float)
local tmpmesh as integer
tmpmesh = FreeMesh()
MemblockMeshTCone(tmpmesh, density, topSize, btmSize, height)
make object object, tmpmesh, 1
delete mesh tmpmesh
endfunction
function MemblockCone(object as integer, density as integer, size as float, height as float)
local tmpmesh as integer
tmpmesh = FreeMesh()
MemblockMeshCone(tmpmesh, density, size, height)
make object object, tmpmesh, 1
delete mesh tmpmesh
endfunction
function MemblockMeshTCone(mesh as integer, density as integer, topSize as float, btmSize as float, height as float)
local memblock as integer
local vertexCount as integer
local offset as integer
memblock = FreeMemblock()
make memblock memblock, 12 + (32 * density * 6)
write memblock dword memblock, 0, 275
write memblock dword memblock, 4, 32
write memblock dword memblock, 8, density * 6
offset = 12
for i = 1 to density
`write poly one and two-------------------------------------
writeVertex275(memblock, offset , sin((i-1.0)*360.0/density)*topSize/2.0, height, cos((i-1.0)*360.0/density)*topSize/2.0, cos((i-1.0)*360.0/density*1.0), 0, sin((i-1.0)*360.0/density), (i-1.0)/density, 0.0)
writeVertex275(memblock, offset+32 , sin((i-1.0)*360.0/density)*btmSize/2.0, 0, cos((i-1.0)*360.0/density)*btmSize/2.0, cos((i-1.0)*360.0/density*1.0), 0, sin((i-1.0)*360.0/density), (i-1.0)/density, 1.0)
writeVertex275(memblock, offset+64 , sin((i*1.0)*360.0/density)*topSize/2.0, height, cos((i*1.0)*360.0/density)*topSize/2.0, cos((i*1.0)*360.0/density*1.0), 0, sin((i*1.0)*360.0/density), (i*1.0)/density, 0.0)
writeVertex275(memblock, offset+96 , sin((i-1.0)*360.0/density)*btmSize/2.0, 0, cos((i-1.0)*360.0/density)*btmSize/2.0, cos((i-1.0)*360.0/density*1.0), 0, sin((i-1.0)*360.0/density), (i-1.0)/density, 1.0)
writeVertex275(memblock, offset+128, sin((i*1.0)*360.0/density)*btmSize/2.0, 0, cos((i*1.0)*360.0/density)*btmSize/2.0, cos((i*1.0)*360.0/density*1.0), 0, sin((i*1.0)*360.0/density), (i*1.0)/density, 1.0)
writeVertex275(memblock, offset+160, sin((i*1.0)*360.0/density)*topSize/2.0, height, cos((i*1.0)*360.0/density)*topSize/2.0, cos((i*1.0)*360.0/density*1.0), 0, sin((i*1.0)*360.0/density), (i*1.0)/density, 0.0)
inc offset, 192
next i
make mesh from memblock mesh, memblock
delete memblock memblock
endfunction
function MemblockMeshCone(mesh as integer, density as integer, size as float, height as float)
local memblock as integer
local vertexCount as integer
local offset as integer
memblock = FreeMemblock()
make memblock memblock, 12 + (32 * density * 3)
write memblock dword memblock, 0, 275
write memblock dword memblock, 4, 32
write memblock dword memblock, 8, density * 3
offset = 12
for i = 1 to density
`write poly one-------------------------------------
writeVertex275(memblock, offset , sin((i-1.0)*360.0/density)*size/2.0, 0, cos((i-1.0)*360.0/density)*size/2.0, cos((i-1.0)*360.0/density*1.0), 0, sin((i-1.0)*360.0/density), (i-1.0)/density , 1.0)
writeVertex275(memblock, offset+32, sin((i*1.0)*360.0/density)*size/2.0, 0, cos((i*1.0)*360.0/density)*size/2.0, cos((i*1.0)*360.0/density*1.0), 0, sin((i*1.0)*360.0/density), (i*1.0)/density , 1.0)
writeVertex275(memblock, offset+64, 0 , height, 0 , cos((i*1.0)*360.0/density*1.0), 0, sin((i*1.0)*360.0/density), (i-1.0)/(density-1), 0.0)
inc offset, 96
next i
make mesh from memblock mesh, memblock
delete memblock memblock
endfunction
function MemblockMeshPlain(mesh as integer, width as float, height as float)
local memblock as integer
local vertexCount as integer
local offset as integer
memblock = FreeMemblock()
make memblock memblock, 12 + (32 * 4 * 3)
write memblock dword memblock, 0, 275
write memblock dword memblock, 4, 32
write memblock dword memblock, 8, 12
offset = 12
`write poly one and two and invert-------------------------------------
writeVertex275(memblock, offset , 0 , 0, width/-2.0, 0, 1, 0, 0.0, 1.0)
writeVertex275(memblock, offset+32 , 0 , 0, width/2.0 , 0, 1, 0, 1.0, 1.0)
writeVertex275(memblock, offset+64 , height, 0, width/-2.0, 0, 1, 0, 0.0, 0.0)
inc offset, 96
writeVertex275(memblock, offset , 0 , 0, width/2.0 , 0, 1, 0, 1.0, 1.0)
writeVertex275(memblock, offset+32 , height, 0, width/2.0, 0, 1, 0, 1.0, 0.0)
writeVertex275(memblock, offset+64 , height, 0, width/-2.0, 0, 1, 0, 0.0, 0.0)
inc offset, 96
writeVertex275(memblock, offset , 0 , 0, width/2.0 , 0, -1, 0, 1.0, 1.0)
writeVertex275(memblock, offset+32 , 0 , 0, width/-2.0, 0, -1, 0, 0.0, 1.0)
writeVertex275(memblock, offset+64 , height, 0, width/-2.0, 0, -1, 0, 0.0, 0.0)
inc offset, 96
writeVertex275(memblock, offset , height, 0, width/2.0, 0, -1, 0, 1.0, 0.0)
writeVertex275(memblock, offset+32 , 0 , 0, width/2.0 , 0, -1, 0, 1.0, 1.0)
writeVertex275(memblock, offset+64 , height, 0, width/-2.0, 0, -1, 0, 0.0, 0.0)
make mesh from memblock mesh, memblock
delete memblock memblock
endfunction
function writeVertex275(memblock, offset, x#, y#, z#, nx#, ny#, nz#, u#, v#)
write memblock float memblock, offset + 0, x#
write memblock float memblock, offset + 4, y#
write memblock float memblock, offset + 8, z#
`write normal data
write memblock float memblock, offset + 12, nx#
write memblock float memblock, offset + 16, ny#
write memblock float memblock, offset + 20, nz#
`write UV information
write memblock float memblock, offset + 24, u#
write memblock float memblock, offset + 28, v#
endfunction
`an electric function pulled from one of my 20 liners that never went...
function fracture(startx, starty, endx, endy, devdegree, points, color)
rem this scales the number of points acording to the distance traversed
`test# = (2D_Distance(startx, starty, endx, endy)*density) / 2D_Distance(0, 0, screen width(), screen height())
dim lines(points,1)
#constant xposition=0
#constant yposition=1
lines(0,xposition) = startx
lines(0,yposition) = starty
alpha = 0
distance = 0
angle = 0
for n = 1 to points
angle = rnd(devdegree) - int(devdegree/2)
if n = points - 1
angle = 0
endif
distance = sqrt((startx - endx)*(startx - endx) + (starty - endy)*(starty - endy)) / (points - n)
alpha = atanfull((endy - starty),(endx - startx))
lines(n,xposition) = distance * cos(alpha + angle) + startx
lines(n,yposition) = distance * sin(alpha + angle) + starty
startx = lines(n,xposition)
starty = lines(n,yposition)
next n
ink color,0
for n = 1 to points
line lines(n-1,xposition),lines(n-1,yposition),lines(n,xposition),lines(n,yposition)
next n
endfunction
`pauses untill the space key is pressed
function pause(prompt as string)
repeat
center text screen width()/2, 15, prompt
MouseControl(0.5)
syn
il spacekey() = 1
repeat
center text screen width()/2, 15, prompt
MouseControl(0.5)
syn
il spacekey() = 0
endfunction
function MouseControl(Speed as float)
if shiftkey() = 1
xrotate camera camera angle x()+mousemovey()/3.0
yrotate camera camera angle y()+mousemovex()/6.0
if mouseclick()=1 then move camera Speed
if mouseclick()=2 then move camera (0-Speed)
endif
r=mousemovex()
r=mousemovey()
endfunction
`hides and or deletes objects
function ClearObjects(maxSearch as integer)
for i = 1 to maxSearch
`if object exist(i) = 1 then delete object i
if object exist(i) = 1 then hide object i
next i
endfunction
function FreeObject()
repeat
inc i
if object exist(i)=0 then found=1
until found
endfunction i
function FreeImage()
repeat
inc i
if image exist(i)=0 then found=1
until found
endfunction i
function FreeLimb(objNum)
repeat
inc i
if limb exist(objNum,i)=0 then found=1
until found
endfunction i
function FreeMemblock()
repeat
inc i
if memblock exist(i)=0 then found=1
until found
endfunction i
function FreeMesh()
repeat
inc i
if mesh exist(i)=0 then found=1
until found
endfunction i
A few explination of the constants:
#constant C_basicLengthFactor 75.0 ` length of the first "trunk"
#constant C_basicSizeFactor 15.0 `width of the first "trunk"
#constant C_BranchRadiusDecline 0.55 `multiplyed times each consecutive branch to the radius so that the branches get thiner
#constant C_BranchLengthDecline 0.70 `same as above except this relates to length
#constant C_maxDownAngle 135 ` unused i think
#constant C_branchMinAngle 30.0 ` for the "Branches" this is the min angle they stick out from vertical from the parent branch
#constant C_branchRndAngle 10.0 ` randomness added to the angle above
#constant C_trunkMinAngle 5.0 `same as above two except these apply to the strait branches to give the tree form.
#constant C_trunkRndAngle 5.5
#constant C_textureDeScale 5.0 `scaling of the texture
#constant C_BranchesPerLayer 3 `number of branches per layer, ex first trunk would have 3 offshoot branches and 1 continuing upward
#constant C_NumberOfLayers 5 `number of branch generations, leave it at 5 if you have leaves and don't go above 7 otherwise it gets realy dense and high poly
#constant C_NumberOfLeaves 2 ` number of leaves per small branch * 2 + 1, setting it to zero makes it so there are no leaves made
so, enjoy, and I look forward to seing tinkergirl decide between all these good entries...
Happy Codding!!
CPU
edit
Thought I'd mention that the tree has a "progressive" mesh, the first and biggest trunks has the most polys, while each consecutive one drops two polys per layer (since there cylinders) untill the last smallest branch which is a cone, and has only 4 polys. Just thought I'd mention it in case it matters to anyone, the memblock stuff in there has got to be usefull to someone, even if its only me...
[center]K-OS Battlefields
IS
///---///---///---UNDER CONSTRUCTION---\\\---\\\---\\\[center]