* Armatures that had constraint targets inside other armatures
weren't transform()-ing correctly
* Issues with lattice deformed objects that are parents of bones
when rendering an animation. Seems to be mostly OK now with the
exception of the first rendered frame -- weird bugs like this have
plagued blender for ages, which leads me to believe that
RE_rotateBlenderScene() is a piece of garbage that nobody understands
(especially me).
* made a few helper functions to clean up some repeated code related
to clearing constraint status and rebuilding displists.
Blender 'sphere' mode lights in yafray should now have more similar light levels
render shadow button in Blender must now be enabled to render shadows in yafray too
some other minor shadow related corrections
control how the intensity channel affects displacement. Nor
slider still controls how Nor channel affects displacement.
- Scaled Nor displacement to make Nor slider more usable.
- Removed Data scale from displacement routines. Made
sliders unusable for objects scaled in editmode. Displacement
now relative to unit sized object. Displace still tracks
with object scale, so scale out of editmode if you want a
large object with deep displacement.
This fixes bug in wrong flipping of normals during render in some cases
too. Most important, it also allows autosmooth and halos now with subsurf.
Particles do work, but still use the original geometry.
- I only coded 4 bytes of this, rest is from master zr!
properly, and uses the AutoTexSpace button to see if the size of the
data needs to be adjusted for.
- Scale now split to x/y/z components. Not sure if this is the most.
logical way to do it. Will have to reconsider later.
- removed rendermesh_uses_displist (no longer relevant)
- converted appropriate me->flag tests to using mesh_uses_displist
- made vert and face counting (for info header) use proper counts
- changed flip_subdivision to allow level==0 argument
- ps. thanks for subsurf orco fix ton
- when quads get split before render, the vertexcolors and texture face
(UV) info has to be corrected as well. This happens runtime during
render, no new data is created. The code was in previous versions, but
with raytrace and other new features it needed a rewrite
- this now also should work for the new smart split code from robert!
- cubemap relied on pointer to MFace, which is only available for Mesh
when directly converted to renderfaces.
It then checked the 'puno' flag where also bits were set to indicate
the optimal projection for a face (XY, XZ or YZ).
- I found out the renderface also has a puno flag, so the mface pointer
in a renderface is redundant. Is removed now
- added code in texture cubemap call, which checks on a projection flag
in 'puno'. If not set, it uses the orco's to calculate one.
- this means, that cubemap now also works for other objects than meshes,
provided they have an orco block while render.
- if no orco block available, it uses the 'global' projection to find which
of the cube sides map.
I couldnt find other errors with subsurf & orco though...
- reduced main subsurf interface to two functions to make DispListMesh
structures from an editmesh or a regular mesh. for the most part this
means that to implement a geometry modifier you only need to write
these two functions (not very plugable yet however).
- added displistmesh_from_mesh and displistmesh_from_editmesh functions
which allow simple support of subdivLevel(0) subsurfs, somewhat handy
for testing things (like why orco doesn't work for subsurf).
marginally suitable, like curves, because of relatively low renderface
count). Will have to thoroughly document pros and cons of each type.
Usefullness order (greatest to least):
CC Subsurf Meshes (Displacement likes the smooth normals)
Simple Subsurf Meshes
Manual subdivided meshes
MBalls
Surfaces (Normal errors/ hidden seams)
Curves (Large flat areas with few renderfaces to displace).
* Removed debug print in ftfont.
* Added FreeType/FTGL support to the Linux build.
NOTE: This feature is on by default, but depends on the pre-build libraries.
So checkout the lib directory. The lib dir should be on the same level as
the blender dir. (In case you didn't know).
- changed code to make use of actual textures, not the hackish
'externtex', which is only for tools
- added a 'displacement' vector in ShadeInput, and moved calculation of
displacement vector to texture.c itself. So it works with stencil, but
also for options as 'add', 'mult' and 'sub'.
- for RGB textures it uses the brightness value of color for displace
- for stucci, and plugin textures returning a normal, it uses that
- Also: wrote call in end of preparing renderfaces, to split non-flat
quad faces in triangles. gives a lot fewer errors in displace textures,
but also raytracing irregular subsurfs goes better now.
- texture mapping that works for displace: orco, sticky, global, obj, normal.
UV not yet. Reflection-displace? uhh! :)
yet (R.vn and R.vlr no longer exist, and were needed to get the image mapped
right). Works esp. well with Subsurfs. Sensitive to vertex normal issues
in Simple and Mesh modes.
-Also porting Simple Subdivide. Subdivides mesh at rendertime w/o changing
shape, for smooth displace and Radiosity.
-Removed an unused var from KnifeSubdivide.
Materials are exported the best we can do by now. It will look almost as in
blender except for the missing procedural textures and some minor issues.
You have to tweak normal modulation amount to get the desired result cause
is not the same in yafray.
We added a panel in render space to adjust some yafray settings (GI and so)
Also we export transparency and reflection using new raytracing settings,
but that will be changed and improved soon.
Remember that you have to set YFexport path in user defaults and yafray must
be on path (version 0.0.6)
We added the "yafray" button to activate all this stuff in the render window.
Panel and settings are only shown when checked.
So now when activated the code calls yafray export instead of the internal
renderer and finally the resulting image is loaded back into render window's
buffer. So animation is also possible and results can be saved using blender
usual scheme.
You'll need SCons (www.scons.org) to build.
Platforms currently working:
* Linux (me)
- options for quicktime, openal and international disabled
- uses the system libs and include files for building - no option to build
with the precompiled libraries yet.
* Windows (jesterKing)
- builds with quicktime (optional)
- builds with openal (optional)
- builds with international support (optional)
- Use the DOS box to build
- builds with precompiled libraries
* Irix (Hos)
- Uses default Irix compiler
- Not all optimization levels correct yet
- options for quicktime, openal and international disabled
- builds with precompiled libraries
* Cygwin (me)
- has a problem in the linking stage
- uses free build tools (gcc)
- options for quicktime, openal and international disabled
- uses the system libs and include files for building - no option to build
with the precompiled libraries yet.
* MacOS (sgefant)
- builds with quicktime (optional)
- options for openal and international disabled
- builds a nice bundle
- builds with precompiled libraries
Thanks to IanWill for a bugfix in the Linux build.
Note: This is a work in progress. A lot still has to be done - for example the
optional parts are only to be enabled by directly setting 'true' or
'false' in the SConstruct file. This needs to be moved to a user config
file. Also, the .o/.obj files are stored in the source tree. This needs
to be fixed as well.
The game engine is not yet built.
- based at 1.0-exp(-color) trick in Yafray. But to guarantee backwards
compatibility, and some more control, Stefano Selleri hacked a useful
formula for it.
- We now have 2 values to set:
- "exp": the exponential correction value (0-1)
- "range": the light range that maps on color 1.0 (0-5)
- Using exp(x) (is e^x) we can much better prevent overflows from render,
which are currently hard-clipped in Blender. Setting a small 'exp' value
wil efficiently smooth out high energy and map that back to a color for
display.
- total formula:
newcol= linfac*(1.0-exp(col*logfac))
col, newcol are colors
linfac= 1.0 + 1.0/((2.0*wrld.exp +0.5)^10)
logfac= log( (linfac-1.0)/linfac )/wrld.range
wrld.exp and wrld.range are the button values
- default setting: exp=0.0 and range=1.0 give results extremely close to
previous rendering.
- graph: http://www.selleri.org/Blender/buffer/Image1.png for 'exp' setting
ranging from 0-1, and with 'range'=2
Thanks Stefano for the help!
- New lamp type added "Area". This uses the radiosity formula (Stoke) to
calculate the amount of energy which is received from a plane. Result
is very nice local light, which nicely spreads out.
- Area lamps have a 'gamma' option to control the light spread
- Area lamp builtin sizes: square, rect, cube & box. Only first 2 are
implemented. Set a type, and define area size
- Button area size won't affect the amount of energy. But scaling the lamp
in 3d window will do. This is to cover the case when you scale an entire
scene, the light then will remain identical
If you just want to change area lamp size, use buttons when you dont want
to make the scene too bright or too dark
- Since area lights realistically are sensitive for distance (quadratic), the
effect it has is quickly too much, or too less. For this the "Dist" value
in Lamp can be used. Set it at Dist=10 to have reasonable light on distance
10 Blender units (assumed you didnt scale lamp object).
- I tried square sized specularity, but this looked totally weird. Not
committed
- Plan is to extend area light with 3d dimensions, boxes and cubes.
- Note that area light is one-sided, towards negative Z. I need to design
a nice drawing method for it.
Area Shadow
- Since there are a lot of variables associated with soft shadow, they now
only are available for Area lights. Allowing spot & normal lamp to have
soft shadow is possible though, but will require a reorganisation of the
Lamp buttons. Is a point of research & feedback still.
- Apart from area size, you now can individually set amount of samples in
X and Y direction (for area lamp type 'Rect'). For box type area lamp,
this will become 3 dimensions
- Area shadows have four options:
"Clip circle" : only uses a circular shape of samples, gives smoother
results
"Dither" : use a 2x2 dither mask
"Jitter" : applys a pseudo-random offset to samples
"Umbra" : extra emphasis on area that's fully in shadow.
Raytrace speedup
- improved filling in faces in Octree. Large faces occupied too many nodes
- added a coherence check; rays fired sequentially that begin and end in
same octree nodes, and that don't intersect, are quickly rejected
- rendering shadow scenes benefits from this 20-40%. My statue test monkey
file now renders in 19 seconds (was 30).
Plus:
- adjusted specular max to 511, and made sure Blinn spec has again this
incredible small spec size
- for UI rounded theme: the color "button" displayed RGB color too dark
- fixed countall() function, to also include Subsurf totals
- removed setting the 'near' clipping for pressing dot-key numpad
- when you press the buttons-window icon for 'Shading Context' the context
automaticilly switches as with F5 hotkey
Please be warned that this is not a release... settings in files might not
work as it did, nor guaranteed to work when we do a release. :)
Main target was to make the inner rendering loop using no globals anymore.
This is essential for proper usage while raytracing, it caused a lot of
hacks in the raycode as well, which even didn't work correctly for all
situations (textures especially).
Done this by creating a new local struct RenderInput, which replaces usage
of the global struct Render R. The latter now only is used to denote
image size, viewmatrix, and the like.
Making the inner render loops using no globals caused 1000s of vars to
be changed... but the result definitely is much nicer code, which enables
making 'real' shaders in a next stage.
It also enabled me to remove the hacks from ray.c
Then i went to the task of removing redundant code. Especially the calculus
of texture coords took place (identical) in three locations.
Most obvious is the change in the unified render part, which is much less
code now; it uses the same rendering routines as normal render now.
(Note; not for halos yet!)
I also removed 6 files called 'shadowbuffer' something. This was experimen-
tal stuff from NaN days. And again saved a lot of double used code.
Finally I went over the blenkernel and blender/src calls to render stuff.
Here the same local data is used now, resulting in less dependency.
I also moved render-texture to the render module, this was still in Kernel.
(new file: texture.c)
So! After this commit I will check on the autofiles, to try to fix that.
MSVC people have to do it themselves.
This commit will need quite some testing help, but I'm around!
Changelog:
- enable refraction with button "Ray Transp" in Material buttons.
- set "Angular Index" value for amount of refraction.
- use the "Alpha" value to define transparency.
- remember to set a higher "Depth" too... glass can bounce quite some
more than expected.
- for correct refraction, 3D models MUST have normals pointing in the
right direction (consistently pointing outside).
- refraction 'sees' the thickness of glass based on what you model. So
make for realistic glass both sides of a surface.
- I needed to do some rewriting for correct mirroring/refraction,
especially to prevent specularity being blended away.
Solved this with localizing shading results in the rendercore.c.
Now specularity correctly is added, and reduces the 'mirror' value.
- Localizing more parts of the render code is being planned. The old
render heavily relies on struct Render and struct Osa to store globals.
For scanline render no problem, but recursive raytracing dislikes that.
- done test with gamma-corrected summation of colors during tracing, is
commented out still. But this will give more balanced reflections. Now
dark reflections that are reflected in a bright surface seem incorrect.
- Introduced 'Fresnel' effect for Mirror and Transparency. This
influences the amount of mirror/transparency based at viewing angle.
Next to a new Fresnel slider, also a 'falloff' button has been added to
define the way it spreads.
- Fresnel also works for Ztransp rendering
- created new Panel for Raytrace options
I have to evaluate still where it all should be logically located.
- material preview shows fake reflection and fake refraction as well.
This is a revision of the old NeoGeo raytracer, dusted off, improved quite
a lot, and nicely integrated in the rest of rendering pipeline.
Enable it with F10-"Ray", and set either a 'ray-shadow' lamp or give the
Material a "RayMirror" value.
It has been added for 2 reasons:
- get feedback on validity... I need artists to play around with it if it's
actually useful. It still *is* raytracing, meaning complex scenes will
easily become slow.
- for educational purposes. All raytracing happens in ray.c, which can be
quite easily adjusted for other effects.
When too many disasters pop up with this, I'll make it a compile #ifdef.
But so far, it seems to do a decent job.
Demo files: http://www.blender.org/docs/ray_test.tgz
An article (tech) about how it works, and about the new octree invention
will be posted soon. :)
Note: it doesn't work with unified render yet.
Updated the Make environment to point to the correct location. The include
paths were still pointing to source/blender/bpython/include while it should be
source/blender/python.
I did not encounter the build problems because I'm always working with the
autoconf build environment.
when using linked-duplicated mesh, with subsurf and tfaces (UV texture)
the render crashed.
Found out the renderloop makes a new displaylist for each Mesh, also when
it is linked multiple times. That way pointers to previous created elements
in displaylists become invalid. Crash!
Result now it even renders faster for linked-duplis. :)
rendering uses data as set in active 3d window again. meaning it renders
localview or 'unlocked layers' correctly again.
in background render it uses the scene layers by default.
was disabled in 2.24 in NaN period... can't find the reason for it.
User Info:
Hard coded limits on the total number of face, verts, halos, and lamps
is gone. Blender now allocates the tables for these on an as needed
basis. As long as your system can come up with the memory, you won't
run out. As a bonus, it also uses slightly less memory on smaller scenes.
Coder info:
This has been in tuhopuu for a while, but I don't know how hard it
has been tested. Since it now allocates only an initial 1024 tables
(of 256 verts/faces/halos each), it seems like it has been put through
it's paces. Lamps are allocated one at a time, and I start with 256.
I rendered 2.5M Faces/Verts/Halos. 4444 lamps. None the less, I left
a few printf's in the realocation to hunt bugs. I'll take them out
just before the release freeze.
Also, be on the lookout for other "sanity checks" that assume
a limited number of the above items. I think I got them all, but
you never know.
Multiple environments now can be rendered in one pass. Previously the other objects with environment maps didn't show up in a reflection. Like this:
http://www.blender.org/bf/dep.jpg
By default, Blender renders now this result:
http://www.blender.org/bf/dep0.jpg
For a further 'recursive ray-tracing effect' you can give each EnvMap texture a higher "Depth" value. Here is a result with depth set at '2':
http://www.blender.org/bf/dep2.jpg
Related new options:
- in (F10) DisplayButtons, environment map rendering can be turned on and off.
- in EnvMap texture buttons you can free all environment maps
- Environment map sizes are also reduced with the (F10) 'percentage' option.
Tech note: with this commit the VlakRen struct has on *ob pointer!
- the link order for Blender has changed, the libradiosity.a has to be moved after the librender.a (obviously for a new dependency!). Check blender/source/Makefile
- there's a new file: blender/source/radiosity/intern/source/radrender.c
Here's what the new code does:
Using the core routines of the Radiosity tool, each renderface with 'emit material' and each renderface with 'radio material flag' set will be used to itterate to a global illumination solution. Per face with high energy (emit) little images are rendered (hemicubes) which makes up lookup tables to 'shoot' its energy to other faces.
In the end this energy - color - then is directly added to the pixel colors while rendering, Gouraud shaded.
Since it's done with renderfaces, it works for all primitives in Blender.
What is doesn't do yet:
- take into account textured color of faces. Currently it uses the material RGB color for filtering distributed energy.
- do some smart pre-subdividing. I don't know yet if this is useful... Right now it means that you'll have to balance the models yourself, to deliver small faces where you want a high accuracy for shadowing.
- unified render (is at my todo list)
User notes:
- per Material you want to have included in radiosity render: set the 'radio' flag. For newly added Materials it is ON by default now.
- the Ambient slider in Material controls the amount of radiosity color.
- for enabling radiosity rendering, set the F10 "Radio" button.
- the Radiosity buttons now only show the relevant radiosity rendering options. Pressing "collect meshes" will show all buttons again.
- for meshes, the faces who use Radio material always call the 'autosmooth' routine, this to make sure sharp angles (like corners in a room) do not have shared vertices. For some smooth models (like the raptor example) you might increase the standard smoothing angle from 30 to 45 degree.
Technical notes:
- I had to expand the renderface and rendervertices for it... shame on me! Faces have one pointer extra, render vertices four floats...
- The size of the hemicubes is now based at the boundbox of the entire scene (0.002 of it). This should be more reliable... to be done
- I fixed a bug in radiosity render, where sometimes backfaces where lit
In general:
I'd like everyone to play a bit with this system. It's not easy to get good results with it. A simple "hit and go" isn't there... maybe some good suggestions?
do a make clean in source/blender/ to be sure!
- Included the new shaders from Cessen... well, only the shader calls
themselves. To make sure the shaders work I nicely integrated it
- MaterialButtons: layout changed a bit, but still resembles the old
layout. The 'shader' options now are located together.
- Shaders are separated in 'diffuse' and 'specular'. You can combine them
freely.
- diffuse Lambert: old shader
diffuse Oren Nayar: new shader, gives sandy/silky/skinny material well
diffuse Toon: for cartoon render
- specular Phong: new spec, traditional 70ies spec
specular CookTorr: a reduced version of cook torrance shading, does
off specular peak well
specular Blinn: new spec, same features as CookTorr, but with extra
'refraction' setting
specular Toon: new spec for cartoon render
- default blender starts with settings that render compatible!
- works in shaded view and preview-render
- works in unified render
Further little changes:
- removed paranoia compile warnings from render/loader/blenlib
- and the warnings at files I worked at were removed.