Time for a creative, open-ended one, I think! Write a program to draw a Christmas wreath. Anything you like! Intertwining lines for the wreath itself? Holly leaves? “3D” baubles? Your choice!
Please post your effort(s) here for the pleasure of everyone else!
Christmas Wreath
Re: Christmas Wreath
You do not have the required permissions to view the files attached to this post.
Re: Christmas Wreath
Thanks, Richard, that's charming, and way beyond what I was expecting!
D
D
Re: Christmas Wreath
The code's quite short (and 95% of it is the standard 3D boilerplate):
Code: Select all
REM Holly_Berry_and_Leaf model from turbosquid.com
REM - MAY NOT BE REUSED WITHOUT BEING REPURCHASED!
REM This program is compatible with BBCSDL and BB4W + WEBGLLIB library
INSTALL @lib$+"webgllib"
nObj% = 20
DIM Object%(nObj%-1), nVert%(nObj%-1), vFormat%(nObj%-1), vSize%(nObj%-1)
DIM Texture%(nObj%-1), Material%(nObj%-1), Pan(nObj%-1), Tilt(nObj%-1)
DIM Roll(nObj%-1), Xpos(nObj%-1), Ypos(nObj%-1), Zpos(nObj%-1)
DIM Xfinal(nObj%-1), Yfinal(nObj%-1), Zfinal(nObj%-1)
DIM Pfinal(nObj%-1), Tfinal(nObj%-1), Rfinal(nObj%-1)
nLights% = 3
DIM Light{(nLights%-1)Type%, Diffuse{r%,g%,b%,a%}, Specular{r%,g%,b%,a%}, \
\ Ambient{r%,g%,b%,a%}, Position{x%,y%,z%}, Direction{x%,y%,z%}, \
\ Range%, Falloff%, Attenuation0%, Attenuation1%, Attenuation2%, \
\ Theta%, Phi%}
DIM Light%(nLights%-1)
DIM Material{Diffuse{r%,g%,b%,a%}, Ambient{r%,g%,b%,a%}, \
\ Specular{r%,g%,b%,a%}, Emissive{r%,g%,b%,a%}, Power%}
REM Initialise holly sprigs to random positions and orientations:
FOR I% = 0 TO nObj% - 1
Xpos(I%) = 300 * RND(1) - 150
Ypos(I%) = 300 * RND(1) - 150
Zpos(I%) = 300 * RND(1) - 150
Pan(I%) = 2 * PI * RND(1)
Tilt(I%) = 2 * PI * RND(1)
Roll(I%) = 2 * PI * RND(1)
NEXT
PRINT "Please wait..."
*REFRESH OFF
*REFRESH
ON CLOSE PROCcleanup : QUIT
ON ERROR PROCcleanup : IF ERR=17 CHAIN @lib$+"../examples/tools/touchide" ELSE MODE 3 : PRINT REPORT$ : END
ON MOVE Resize% OR= (@msg% = 5) : RETURN
Device% = 0
Object% = 0
Resize% = FALSE
PROCinitrender
REPEAT
WAIT 1
PROCanimate
UNTIL FALSE
END
DEF PROCanimate
LOCAL bgcolour%, viewangle, aspectratio, mindist, maxdist, cameraroll
LOCAL camera(), lookat(), temp() : DIM camera(2), lookat(2), temp(nObj% - 1)
lookat() = 0, 0, 0
bgcolour% = &FFC0C0F0
viewangle = RAD(40)
aspectratio = @size.x%/@size.y%
mindist = 3.0
maxdist = 300.0
cameraroll = TIME/1000
camera() = 0, 150, 10
temp() = Xfinal() - Xpos() : Xpos() += temp() * 0.01
temp() = Yfinal() - Ypos() : Ypos() += temp() * 0.01
temp() = Zfinal() - Zpos() : Zpos() += temp() * 0.01
temp() = Pfinal() - Pan() : Pan() += temp() * 0.01
temp() = Tfinal() - Tilt() : Tilt() += temp() * 0.01
temp() = Rfinal() - Roll() : Roll() += temp() * 0.01
PROC_render(Device%, bgcolour%, nLights%, Light%(), nObj%, Material%(), Texture%(), \
\ Object%(), nVert%(), vFormat%(), vSize%(), Pan(), Tilt(), Roll(), Xpos(), Ypos(), Zpos(), \
\ camera(), lookat(), viewangle, aspectratio, mindist, maxdist, cameraroll)
IF Resize% Resize% = FALSE : PROCcleanup : PROCinitrender
ENDPROC
DEF PROCinitrender
LOCAL I%, nvert%, vformat%, vsize%
VDU 26
IF POS REM SDL thread sync
Device% = FN_initgl(@hwnd%, 0, 3)
IF Device% = 0 ERROR 100, "Can't initialise 3D library"
REM Load the 3D object:
Object% = FN_load3d(Device%, @dir$+"holly.fvf", nvert%, vformat%, vsize%)
IF Object% = 0 ERROR 100, "Can't load holly.fvf"
Object%() = Object% : nVert%() = nvert% : vFormat%() = vformat% : vSize%() = vsize%
REM Final positions and orientations:
FOR I% = 0 TO 7
Pfinal(I%) = 2*PI*I%/8 + (RND(1) - 0.5) * 0.1
Xfinal(I%) = -22 * COS(-Pfinal(I%))
Zfinal(I%) = -22 * SIN(-Pfinal(I%))
NEXT
FOR I% = 8 TO nObj% - 1
Pfinal(I%) = 2*PI*(I% - 8 + 0.5)/(nObj% - 8) + (RND(1) - 0.5) * 0.1
Xfinal(I%) = -35 * COS(-Pfinal(I%))
Zfinal(I%) = -35 * SIN(-Pfinal(I%))
NEXT
Yfinal() = 0
Pfinal() += PI/6
Tfinal() = -0.85
Rfinal() = 0.1
REM Point-source lights:
Light{(0)}.Type% = 1 : REM point source
Light{(0)}.Diffuse.r% = FN_f4(0.5) : REM diffuse colour RGB
Light{(0)}.Diffuse.g% = FN_f4(0.5)
Light{(0)}.Diffuse.b% = FN_f4(0.5)
Light{(0)}.Diffuse.a% = FN_f4(1)
Light{(0)}.Specular.r% = FN_f4(1.0) : REM specular colour RGB
Light{(0)}.Specular.g% = FN_f4(1.0)
Light{(0)}.Specular.b% = FN_f4(1.0)
Light{(0)}.Position.x% = FN_f4(100) : REM position XYZ
Light{(0)}.Position.y% = FN_f4(200)
Light{(0)}.Position.z% = FN_f4(0)
Light{(0)}.Range% = FN_f4(500) : REM range
Light{(0)}.Attenuation0% = FN_f4(1) : REM attenuation (constant)
Light%(0) = Light{(0)} - PAGE + !340
REM Second light at +120°:
Light{(1)} = Light{(0)}
Light{(1)}.Position.x% = FN_f4(100*COS(2*PI/3))
Light{(1)}.Position.z% = FN_f4(100*SIN(2*PI/3))
Light%(1) = Light{(1)} - PAGE + !340
REM Third light at -120°:
Light{(2)} = Light{(0)}
Light{(2)}.Position.x% = FN_f4(100*COS(-2*PI/3))
Light{(2)}.Position.z% = FN_f4(100*SIN(-2*PI/3))
Light%(2) = Light{(2)} - PAGE + !340
REM Material to add specular reflection:
Material.Diffuse.r% = FN_f4(1.0)
Material.Diffuse.g% = FN_f4(1.0)
Material.Diffuse.b% = FN_f4(1.0)
Material.Specular.r% = FN_f4(.7)
Material.Specular.g% = FN_f4(.7)
Material.Specular.b% = FN_f4(.7)
Material.Power% = FN_f4(20.0)
Material%() = Material{} - PAGE + !340
ENDPROC
DEF PROCcleanup
Object% += 0 : IF Object% PROC_release(Object%) : Object% = 0
Device% += 0 : IF Device% PROC_release(Device%) : Device% = 0
*REFRESH ON
ENDPROC
Re: Christmas Wreath
The 3D model was very cheap too (in fact I think it was on sale at the time and even cheaper than the $2 it is now).Hated Moron wrote: ↑Wed 06 Dec 2023, 09:59 The code's quite short (and 95% of it is the standard 3D boilerplate):