This means the diffuse and specular shaders don't use the normal
for hair (which is actually undefined, a hair is micro cylinder) but
it uses the tangent vector (vector in direction of hair).
For Diffuse, it computes a fake normal now, representing the optimal
hair normal pointing towards the light. All current builtin shaders
work with this, including ramps.
For Specular, it uses another formula to remap dot products for all
lines that now use the tangent vector instead of the normal:
dot = vector * tangent
dot = sqrt(1.0 - dot*dot)
Gives better results than using the 'fake' normal for diffuse. Officially
(according the papers) this could be used for diffuse too, but then hair
becomes very flat. Now you can control the flatness easily with ramps or
using Oren-Nayer for example.
Example image (disappears in some weeks)
http://www.blender.org/bf/rt9.jpg
- Added new texture channel "Strand" to apply textures on hairs over the
length of hair (1 dimensional). Orco now gives 1 fixed coordinate for
the entire hair, based on where it starts.
Note; UV doesn't work yet. Nor vertexcolor.
http://www.blender.org/bf/rt10.jpg
User doc: http://www.blender3d.org/cms/Shape_Keys.678.0.html
- The mixed use of "Vertex Key","Key" or "RVK" in Blender was a bit
confusing. Also a 'vertex key' assumes keys per vertex, which actually is
only a single key for the entire shape. The discussions on blender.org
forums all mentioned "Shape" or "Blend Shapes", which I think is an OK
name for a "Vertex Key" in the UI. :)
- Most work was code spaghetti cleanup. Doing shape-keys now nicely goes
via the depgraph and DerivedMesh. That then allows to have different
shapes per object, with the new "Pin" feature.
Objects now define what Shape is shown (ob->shapenr)
- Added a Shape Panel in the Edit buttons with the various options
- Fixed a lot of issues in the IpoWindow, with drawing the channels.
For example, deleting a key-line there caused the entire Relative option to
go wrong, same for moving the lines up/down.
Changing key-line order now reflects in order of channels. The active
Shape is drawn more clear now too.
- Noticed it doesnt work yet for curves/lattice. Need modifier advise!
morning)
- fun for the whole family, boolean mesh modifier... doesn't work
with layered modifiers yet (just uses base mesh), although may
god have mercy on your soul if you want to run boolean on a
subsurf anyway
- added displistmesh_add_edges
This exposes a bug in boolean, apparently the output is somehow
random (hash on alloc'd pointer value perhaps) which is sortof
lame.
It also makes more apparent the desire for some level of control
over dep graph evaluation during editmode (at the moment dep
graph is reevaluated for a mesh object in editmode, but since
mesh changes are on editmesh other objects don't really see
any change, so it is a wasted recalc).
- "Flush" is now split into two seperate Alignment modes "Flush" and
"Justify":
- Justify does exactly the same as a normal word processor's justify
function does, and in addition, it uses *whitespace* instead of
*character spacing* (kerning) to fill lines. Much more readable.
- Flush is pretty much the old Blender "Flush" mode - and as such it
uses character spacing to fill lines. Just as Justify, this only
works with at least one textframe.
- Underlining for text objects. Not a lot to explain. New button "U" in
the editbuttons, and CTRL-U as hotkey toggle underlining for newly
entered characters or for the selection, just like CTRL-B/CTRL-I do for
bold/italic.
Underline height (thickness) and Underline position (vertical) can be
set in the editbuttons.
Implemented as CU_POLY polygon curves.
- The B, U and i buttons (and the corresponding CTRL-B/U/I keystrokes)
have been fixed to only affect *one* attribute at a time. Formerly,
hitting CTRL-B when no other style was active, on a text portion with
italics text, for example, would kill the italics and just apply bold.
Now, these attributes always add or substract only, but do not
replace the style.
- In the past, there were bugs with material indices uninitialized, and
thus crashes in the renderer with illegal material indices.
Even though I assume they have been fixed, I've put in a check that
checks (hah) if the material index of a character is illegal (bigger
than ob->totcol), and then sets it to zero, and spits out a warning
on stderr.
If you see such warnings, please report and link to the .blend.
- Bugfix: All alignment modes only worked if there were at least *two*
lines of text in the text object. Fixed
There's now a regression test file for text objects, please add to the
corresponding repository:
http://blender.instinctive.de/downloads/release/demo/text-regression.blend.gz
to get rid of faces with MFace.v3==0
- change all Mesh's to have ->medge now. This is forced by make_edges
on readfile, and in the various exotic important routines, and on
conversion back in python.
- make python NMesh structure always have medges now (needs testing)
- with above two changes it is guarenteed that mf->v3 is never ==0
in main blender code (i.e., all MFace's are actually triangles
or quads) and so I went through and removed all the historic tests
to deal with MFace.v3==0. Equals lots of deleting, I am in heaven!
- removed MEdge edcode flag, no longer needed
- added experimental replacement for edge flag system
Still are some inconsistencies in FACESELECT mode edge drawing to
be ironed out.
NOTE: This commit adds an experimental edge flag calc system, based
on 10-seconds-of-thought algorithm by yours truly. Would appreciate
feedback on how this system works, esp compared to old one and esp
on complex or interesting models.
To Use: New system is enabled by setting G.rt to a value between
1 and 1000 (Value of 0 uses old system). Value 1000 is reserved for
"auto" edge, which is more or less identical to old system but also
makes sure that at least 10% of edges are drawn (solves errors for
super subdivided meshes). Values between 1 and 999 act as percent
(out of 1000) of edges that should be drawn, starting with "most
interesting" edges first. Please try it and comment!
mapping (instead of Edit{Vert,Edge,Face} pointers)
- dropped convertToDispListMeshMapped (whew, glad of it too)
- added DerivedMesh drawMappedFaces function
- dropped EM suffix for DerivedMesh functions, it was neither
particularly correct nor descriptive
- converted test_index_mface to test_index_face that also corrects
MCol and TFace. Good thing we had three versions of this routine,
you never know when one might burn down.
- removed flipnorm_mesh, not used anymore (and was incorrect to
boot)
- Getting face select to work with modifiers turned out to be much
more complicated than expected. Reworked mapping architecture for
modifiers - basically elements in a DispListMesh are now required
to be stored in an order that corresponds exactly to original
ordering. MVert/MEdge/MFace all have a new flag ME_XXX_STEPINDEX
that is set on each element that is set on the first derived element
of each original element. I can't say the code to follow these
requirements for subsurf is particularly transparent, but on the
upside it is a reasonably consistent and simple system that is memory
efficient and allows keeping the DispListMesh structure.
- rewrote mirror modifier to be simpler/conform to new requirements
for mapped DispListMesh structure. This also means that mirror interacts
much better with incremental subsurf calculation (it used to recalc
one entire side on any topology change, now it generally avoids that).
- added EM_{init,free}_index_arrays and EM_get_{vert,edge,face}_for_index
functions to handle mapping indices back into appropriate EditMesh
structures.
- bug fix, make edges didn't recalc object data
- bug fix, initial image assignment to TFace's didn't recalc object data
- new feature, added circle select support for FACESELECT
- bug fix, creating new faces in editmode duplicated the TFACE active
flag - but there should only be one active tface
- bug fix, possible crash when deleting all faces in faceselect mode
on mesh with tfaces...
Still todo: TFace edge drawing is still not always correct in face
mode, in particular with a mirror modifier when mesh has edges (and
no preceeding subsurf). Have not yet decided how to deal with this.
Best solution is probably to do switch to meshes all having MEdge's,
in which case I can get rid of TFace edge flags (and need to recalc
modifiers on tface selection change).
- new feature, twiddled with lattice resizing to try to maintain
existing vertex changes... much nicer than just resetting the
lattice if you decide you need more detail in the lattice.
- modifiers work with lattices now. yes, that does mean you
can make a chain of lattices effecting each other 8 miles
long.
- some cleanup of softbody code, was rather splintered and call
path was twisted and confusing. reworked main object step
routine to do things in a more obvious and consistent manner
and without duplicate code
- added ob->softflag OB_SB_RESET instead of sbObjectReset
call
- modifier changes reset softbody now
- moved curve_getVertexCos/curve_applyVertexCos into curve.c
- update curve modifier eval to work with virtual modifiers
- update modifier apply to work with curves/surfs
- update make parent to also recalc object data
NOTE: Although you can turn SB on for curve/font objects at the
moment it doesn't really work because they call deform in
multiple steps and this confuses SB. Not sure how to deal with
atm.
- removed {lattice,curve}_modifier functions
- changed render code to use displist for curve rendering
instead of making its own. required adding a bevelSplitFlag
field to DispList. I also fixed the bevel face splitting
which did not work correctly in many situations.
- changed so all curve data creation happens in makeDispListCurveTypes,
includes making bevel list and filling polys
- changed render code to use displist for surface rendering
- removed Curve.orco variable, built as needed now
- removed stupid BLI_setScanFill* functions... why use a function
argument when you can use a global and two functions! Why indeed.
(this fixed crash when reloading a file with filled curves and
toggling editmode)
- bug fix, setting curve width!=1 disabled simple bevel for no
apparent reason
- cleaned up lots and lots of curve/displist code (fun example:
"if(dl->type==DL_INDEX3 || dl->type==DL_INDEX3)"). Hmmm!
- switched almost all lattice calls to go through lattice_deform_verts,
only exception left is particles
- added DBG_show_shared_render_faces function in render, just
helps to visualize which verts are shared while testing (no
user interface).
- renamed some curve bevel buttons and rewrote tooltips to be
more obvious
- made CU_FAST work without dupfontbase hack
Also by the way I wrote down some notes on how curve code
works, nothing spiffy but it is at:
http://wiki.blender.org/bin/view.pl/Blenderdev/CurveNotes
sticky, dvert, and keys if number of verts don't match)
- changed modifier panel to not allow manual addition of hook or
softbody modifiers
- changed apply modifier to apply to existing mesh (fixes bug with
materials) and to warn about loss of tface/mcol/keys/dvert/sticky
for all modifier types
- changed modifier UI to not display disclosure triangle for virtual
modifiers
- changed softbody ui to allow enable/disable
DLM to share data from DerivedMesh (reduces some copying/memory allocation)
- added displistmesh_copyShared function to copy a DLM but not duplicate any
internal data
- changed crease drawing to use DerivedMesh functions... this means varying
edge width style of creases had to go, I replaced by using varying color to
show crease weight instead. Don't think this is a big loss since the subsurf
result gives you a much better indication of the crease weight anyway.
- bug fix in mirror modifier, didn't copy edge creases from editmesh correctly
- moved back to editing buttons, where life is now cramped... switched
to constraint style foldout panes, still a WIP. In particular not
sure what buttons should be in header (and if current toggles stay
in header if they should also be in an expanded pane). Also need
new icons for move up/move down (and drag and drop would of course
be nice). Finally current plane is to make it so modifiers will
expand out in modifier pane for horizontal orientations instead of
just going down down down to goblin town.
- added error field to modifiers that is displayed in UI, need to have
some way for modifiers to return errors back to interface (esp. important
for python)
- tweaked cage determination and handling, currently the editmode cage
is determined by last modifier with OnCage set that is preceeded completely
by modifiers that support mapping or are disabled in editmode. it is
kinda confusing, but the interface only lets you toggle OnCage for modifiers
that support it - it just might not be clear all the time why you can't
toggle a certain modifier OnCage.
- update displistmesh_copy to only copy edges if non-NULL
There is a display bug that already existed but is more obvious with
new modifiers where parts of the pane get drawn in a different area
after toggling editmode. It has to do with drawing parts of the interface
using GL instead of 100% buttons. I try to keep my grubby little toes
out of the interface code so this can wait for Ton to return.
- remove python access to Optimal and Subsurf flags (they don't
work this way anymore, I suppose need to replace with python
access to modifiers but not going to do right now).
- removed interface access to OPTIMAL mode, needs to be rethough...
this means at the moment subsurfs outside editmode always draw
and render all edges
with MSVS 8)
- broke mesh_create_shadedColors out of shadeDispList, used to
build vertex colors for mesh in vpaint as well (also fixed
bug where they were not initialized correctly for subsurfs)
- added modifier_copyData and modifier_findByType functions
- change editmode modifiers to only calculate if Realtime and
Editmode bits are both set, makes more sense for copying
modifiers
- update object_copy to correctly copy modifiers
- removed duplicate redefinition of ME_ attributes in python,
this is a horrible idea, why was it done in the first place?
- update armature auto vertex group code to check for subsurf
in modifier stack
- fixed flip_subdivision to work with move to modifier stack
- added copymenu_modifiers, can copy all modifiers or just
data from first modifier of a certain type (not sure how
to deal with multiple modifiers of same type... not
a big issue though I think)
- added verteCos argument to sbObjectReset, lack of this was
causing softbody objects to not be initialized with deform
- made convert-to-mesh option call DAG_scene_sort, prevents
crashes due to obsolete object pointer
and this is better left to user (whee this was a fun commit! so
much deleting!)
- removed mesh_calculate_vertex_normals (replaced by mesh_calc_normals)
to write one that is based on geometry (and not just vertex position)
- added editmode versions of modifier deform/apply calls and flag
to tag modifiers that support editmode
- added isFinalCalc param to applyModifier, basically a switch to let
subsurf know if it is calc'ng orco or not (so it can deal with cache
appropriately). This is kinda hacky and perhaps I can come up with
a better solution (its also a waste to do a complete subdivide just
to get vertex locations).
- changed ccgsubsurf to not preallocate hash's to be approximately correct
size... this was probably not a big performance savings but means that
the order of faces returned by the iterator can vary after the first
call, this messes up orco calculation so dropped for time being.
- minor bug fix, meshes with only key didn't get vertex normals correctly
calc'd
- updated editmesh derivedmesh to support auxiliary locations
- changed mesh_calc_modifiers to alloc deformVerts on demand
- added editmesh_calc_modifiers for calculating editmesh cage and final
derivedmesh's
- bug fix, update shadedisplist to always calc colors (even if totvert==0)
- changed load_editMesh and make_edge to build me->medge even if totedge==0
(incremental subsurf checks this)
todo: add drawFacesTex for ccgderivedmesh
So, modifiers in editmode are back (which means auto-mirror
in edit mode works now) although still not finished. Currently
no cage is computed, the cage is always the base mesh (in
other words, Optimal edge style editing is off), and the final
mesh currently includes all modifiers that work in edit mode
(including lattice and curve). At some point there will be toggles
for which modifiers affect the final/cage editmode derivedmesh's.
Also, very nice new feature is that incremental subsurf in object
mode returns a ccgderivedmesh object instead of copying to a new
displistmesh. This can make a *huge* speed difference, and is very
nice for working with deformed armatures (esp. with only small
per frame changes).
builds new DerivedMesh... caching can come later)
- split DerivedMesh returning functions into editmesh and mesh groups
- got rid of DL_NORS displist type (get built on fly for mesh when
needed)
- got rid of Mesh.disp (yay!)
- started to punch DerivedMesh returning functions into shape to introduce
modifier stack
- added mesh_create_derived_no_deform[_render]
- mesh_create_orco now always goes through a DerivedMesh, some
redundant copying atm but can be fixed (and orco generation is
not a big bottleneck)
New feature: TexMesh (texcomesh) works with subsurf now (are
you listening rob?)
- switch renderer to store orco's in a hash table instead of
caching in mesh (I don't like the renderer caching data
in the actual mesh structure)
- added mesh_create_orco[_render] function
- fix DerivedMesh.getMinMax implementations to set min & max when
there are no vertices
- mesh boundbox calc was wrong in some cases, messed up HOMEKEY
and localview zooming
- convert MeshDerivedMesh to calculate new vertex normals and such
on initialize, means copy free conversion to DispListMesh
- replace vertex access through function by direct access fo
MeshDerivedMesh
- shadeDispList was not getting correct orco's
mesh_get_derived_final... a bit slower atm because of extraneous
copying (will be fixed shortly) but normals are correct for deformed
meshes now (don't think they ever have been)
leaving in a DL_VERTS type displist (and modifying mesh)
- removed DL_VERTS displist type (woot woot)
- makeDispListMesh now puts deformed verts in object->derivedDeform
- switch over other system parts to new deformed vert storage,
still kinda hacky and maybe some inconsistencies... will be
sorted out soon enough.
- moved build_particle_system to makeDispListMesh... this may have
adverse side effects, needs to be sorted out with depgraph system
- changed mesh_get_derived_render to always return a DerivedMesh (even if
no subsurf)
- changed init_render_mesh to always get the mesh data through a
DerivedMesh
situations where data can be shared easily.
- added convertDisplistToMesh function for regular mesh DerivedMesh
interface (how many times can *you* use mesh in one sentence?)
- do_puno was uninitialized in init_render_mesh
- added mesh_get_derived_final (temporary), difference from
mesh_get_derived is it always returns a derived mesh, even if
no subsurf.
The B-Bones!
(where the B can be read as 'block' or 'bezier' or 'b-spline')
- set option on/off in edit buttons, armature panel
- scaling of B-bones only works in editmode, use ALT+S to make bones fatter
or thinner. Also works for constrainted transform
- In pose mode, you now have a buttons panel with per-bone settings too
Here you can find the "segments" button, which allows bones to
interpolate between previous/next bones, including roll.
- Buttons to control interpolation ("In" and "Out" are disabled, doesn't
work satisfying yet
NOTE: this doesn't give deform yet! Main purpose for now is to test if this
drawing method serves to animate/pose armatures well.
Still need to review proper interpolation methods... maybe bezier is too
limited.
- appropriate callers of makeDispList replaced with depgraph calls
- unappropriate places just killed... small chance this gives some
errors in corner cases if dep graph isn't notified (example, font
family displists) but these can be tracked down as they show up.
- still a large number of callers of makeDispListCurveTypes, but
makeDispListMesh has just a few.
which calculates texspace on demand if need be.
- removed almost all calls to tex_space_mesh
There may be a few corner cases where this goes wrong (meshes with vertex
keys) but these should get ironed out by coming modifier system.
- switch all mesh boundbox access to go through mesh_get_bb
- switch object_handle_update to call mesh_changed instead of making
the displist data immediately (delayed calculation)
still a makeDispList that dispatches to the appropriate one.
makeDispList is on the way out and this makes it easier to track down
exactly which places use makedispList and for what types of objects.
- switch calls to makeDispList to appropriate more specific function (if
the object type is known by caller).
- added mesh_changed function that invalidates cached mesh data (but does
not rebuild, mesh data gets rebuilt on access). Most old calls to
makeDispListMesh use this instead now.
Aim was to get a total refresh of the animation system. This
is needed because;
- we need to upgrade it with 21st century features
- current code is spaghetti/hack combo, and hides good design
- it should become lag-free with using dependency graphs
A full log, with complete code API/structure/design explanation
will follow, that's a load of work... so here below the list with
hot changes;
- The entire object update system (matrices, geometry) is now
centralized. Calls to where_is_object and makeDispList are
forbidden, instead we tag objects 'changed' and let the
depgraph code sort it out
- Removed all old "Ika" code
- Depgraph is aware of all relationships, including meta balls,
constraints, bevelcurve, and so on.
- Made depgraph aware of relation types and layers, to do smart
flushing of 'changed' events. Nothing gets calculated too often!
- Transform uses depgraph to detect changes
- On frame-advance, depgraph flushes animated changes
Armatures;
Almost all armature related code has been fully built from scratch.
It now reveils the original design much better, with a very clean
implementation, lag free without even calculating each Bone more than
once. Result is quite a speedup yes!
Important to note is;
1) Armature is data containing the 'rest position'
2) Pose is the changes of rest position, and always on object level.
That way more Objects can use same Pose. Also constraints are in Pose
3) Actions only contain the Ipos to change values in Poses.
- Bones draw unrotated now
- Drawing bones speedup enormously (10-20 times)
- Bone selecting in EditMode, selection state is saved for PoseMode,
and vice-versa
- Undo in editmode
- Bone renaming does vertexgroups, constraints, posechannels, actions,
for all users of Armature in entire file
- Added Bone renaming in NKey panel
- Nkey PoseMode shows eulers now
- EditMode and PoseMode now have 'active' bone too (last clicked)
- Parenting in EditMode' CTRL+P, ALT+P, with nice options!
- Pose is added in Outliner now, with showing that constraints are in
the Pose, not Armature
- Disconnected IK solving from constraints. It's a separate phase now,
on top of the full Pose calculations
- Pose itself has a dependency graph too, so evaluation order is lag free.
TODO NOW;
- Rotating in Posemode has incorrect inverse transform (Martin will fix)
- Python Bone/Armature/Pose API disabled... needs full recode too
(wait for my doc!)
- Game engine will need upgrade too
- Depgraph code needs revision, cleanup, can be much faster!
(But, compliments for Jean-Luc, it works like a charm!)
- IK changed, it now doesnt use previous position to advance to next
position anymore. That system looks nice (no flips) but is not well
suited for NLA and background render.
TODO LATER;
We now can do loadsa new nifty features as well; like:
- Kill PoseMode (can be option for armatures itself)
- Make B-Bones (Bezier, Bspline, like for spines)
- Move all silly button level edit to 3d window (like CTRL+I = add
IK)
- Much better & informative drawing
- Fix action/nla editors
- Put all ipos in Actions (object, mesh key, lamp color)
- Add hooks
- Null bones
- Much more advanced constraints...
Bugfixes;
- OGL render (view3d header) had wrong first frame on anim render
- Ipo 'recording' mode had wrong playback speed
- Vertex-key mode now sticks to show 'active key', until frame change
-Ton-
- Improved text editing for justified ('Flush') text: Line will not
be filled up until it is completed (wordwrap or Enter)
- Fixed waitcursor flickering in displist.c
Important notes:
- Full compatibility with old text objects not fully restored
(word spacing will be 0.0, need to set it manually to 1.0), will
either need version upgrade to 238 or a hack. Will check.
- lorem.c (about to be committed) contains BF copyright notice, but as
BF did not exist a few hundred years ago, probably best to remove it :)
- If you notice any cross-platform issues (especially beloved windows),
please report
- A few tiny warnings left, I will fix those issues still.
The rest has been said already - so have fun testing. And please do!
=== Reminder:
=== Documentation at http://blender.instinctive.de/docs/textobject.txt ===
((me->flag&ME_SUBSURF) && me->subdiv)
In build_mesh_data(). This because meshes with subdiv==0 were calling a
MakeDisplist() for each redraw otherwise, disabling for example the
posemode "delay deform" feature. (bug #2700)
Daniel; it would help if you would add comments in the code, for example
to understand the difference between;
mesh_get_base_derived()
mesh_get_derived()
and how it relates to
build_mesh_data()
I realize most of the mess is in displist code... and confusing use
of features while editing, posemode, & render. Nevertheless, it's not
clear at first sight which parts of derivedmesh is design, and which
part reflects the hacks to make it work. :)
Aye... OpenGL cannot draw concave (C shaped) polygons... that screws up the
Lasso tool, when it uses backbuffer selection.
Examined for little while the GLU Tesselation library, but apart from its
nightmarish structure, it's even stupid (no builtin clock/counterclock).
So, instead coded a DispList based function using Blender's edgefill.
Works like a charm! :)
Works as follows;
- press the 'show bake settings' button (no space left... :)
- define start/end frame for bake, and an interval step.
The baked result interpolates nicely (Bspline, 4 keys) so in general a
step size of 2 or 3 still gives OK results.
- Press "BAKE". This will do a full animation + playback. Press ESC if it
you don't want it.
Once Baked, the BAKE button becomes a FREE BAKE. As reminder the softbody
buttons get blocked with error() menu.
This saves OK in a file. Renders any frame, including fields and moblur.
You can also set a "Timeoffs" for the softbody. And yes, this should be
in the NLA once... :)
NOTE! With this commit, files saved with the old (first commit) version by
Jens Ole won't read the settings back... he stored all sofbody variables in
Object, which was moved to a new struct when I did my first commit on SB
(over a month ago)
Also note that I moved particle deflecting & softbody to a new include.
This will add Minneart diffuse and WardIso specular to our shader menu.
Minneart gives nice control over darkness/brightness areas, the wardIso
over 'plastic' style sharp or fuzzy specular.
Webpage is being made with nice samples. Will be in release log.
Jorge: one change is in the do_versions, you inserted it on wrong location.