Well, this is the DarkBASIC Classic forum
Cel-shading is very possible in DBC, as this sample shows:
(Note: The two models and the textures are in a zip file on my website -
http://blanky.clearphp.com/tree.zip (160KB).)
set display mode 800,600,32
wait 200
load object "tree.3ds",1
load mesh "tree_mirror.3ds",1
`ADD LIMB Object Number, Limb Number, Mesh Number
add limb 1, 8, 1
`Don't need the mesh anymore...
delete mesh 1
scale limb 1,8,-105,-105,-105
`textures
load image "tree_greenclump2.jpg",1
load image "tree_trunk2.jpg",2
`model-specific numbers, don't use these on anything else...!
for i=1 to 6
texture limb 1,i,1
next i
texture limb 1,7,2
`color the last thing black
color limb 1,8,0
sync on
sync rate 0
speed#=1.0
`By default, we'll go dark... (vampire, bats, etc.)
Dark()
do
rotate object 1,wrapvalue(object angle x(1)+speed#),wrapvalue(object angle y(1)+speed#),wrapvalue(object angle z(1)+speed#)
text 0,0,"Vibes/second: "+str$(screen fps())
text 0,10,"- to slow down, + to speed up"
text 0,20,"[space] to change direction"
text 0,30,"[1] for extra-dark, [2] for extra-light"
sync
`Neat, non-cel-shading related stuff
if del=0
if inkey$()="-" then speed#=speed#-0.05
if inkey$()="+" then speed#=speed#+0.05
if spacekey()=1 then speed#=0-speed#:del=10
if inkey$()="1" then Dark():del=10
if inkey$()="2" then Light():del=10
else
dec del
endif
loop
function Dark()
set ambient light 0
color backdrop rgb(0,0,24)
color limb 1,8,0
endfunction
function Light()
set ambient light 100
color backdrop rgb(0,0,255)
color limb 1,8,16777215
endfunction

....would be the 'Dark' setting.
Indeed, if you can handle working with two rather than one objects, the code can be simplified to this:
set display mode 800,600,32
load object "tree.3ds",1
load object "tree_mirror.3ds",2
scale object 2,-105,-105,-105
`BLACK
color object 2,0
`Texturing code is a bit complicated,
`so we'll just use a colour for this 'simple' version.
color object 1,rgb(0,255,0)
`Bright 'cartoon lighting', this time:
set ambient light 100
color backdrop rgb(0,0,255)
do
rotate object 1,object angle x(1)+1.0,object angle y(1)+1.0, object angle z(1)+1.0
rotate object 2,object angle x(1),object angle y(1),object angle z(1)
sync
loop
It's all based around the fact that if you negatively scale an object, DB's z-buffer freaks out and makes it so that anything that's inside that object can still be seen. Kinda like transparency, only ... weirder.
And then you can always play around with the ambient light settings for 'cartoon lighting'...
Why is there a tree_mirror.3ds and a tree.3ds, I hear you ask? Well, try replacing 'tree_mirror' with 'tree', and you'll see the one problem with negative scaling.
Yes, it flips the object inside out.

So far, my only solution has been to make another copy of the object and apply (in 3ds max) three Mirror modifiers, one for each axis...
Hence the tree_mirror.3ds filename.
I'm still looking into flipping the object the right way round through memblock code, and I'll get back to you on it...
[Edit: Oops, I was wondering why the keys were a bit irresponsive ^_^ Fixed.
Also, the crap tree was made by yours truly (i.e., ME), and I say you can use it royalty-free because it's so crappy. Enjoy.]
[Insert extremely witty comment here] :: Add me to MSN if you like, but don't expect any big favours [unless you like VB6]. ... IDK!!