2002-10-12 13:37:38 +02:00
|
|
|
|
2003-04-26 13:56:44 +02:00
|
|
|
/* material.c
|
|
|
|
*
|
2002-10-12 13:37:38 +02:00
|
|
|
*
|
|
|
|
* $Id$
|
|
|
|
*
|
2008-01-07 20:13:47 +01:00
|
|
|
* ***** BEGIN GPL LICENSE BLOCK *****
|
2002-10-12 13:37:38 +02:00
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
2008-01-07 20:13:47 +01:00
|
|
|
* of the License, or (at your option) any later version.
|
2002-10-12 13:37:38 +02:00
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software Foundation,
|
2010-02-12 14:34:04 +01:00
|
|
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
2002-10-12 13:37:38 +02:00
|
|
|
*
|
|
|
|
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
|
|
|
* All rights reserved.
|
|
|
|
*
|
|
|
|
* The Original Code is: all of this file.
|
|
|
|
*
|
|
|
|
* Contributor(s): none yet.
|
|
|
|
*
|
2008-01-07 20:13:47 +01:00
|
|
|
* ***** END GPL LICENSE BLOCK *****
|
2002-10-12 13:37:38 +02:00
|
|
|
*/
|
|
|
|
|
|
|
|
#include <string.h>
|
Giant commit!
A full detailed description of this will be done later... is several days
of work. Here's a summary:
Render:
- Full cleanup of render code, removing *all* globals and bad level calls
all over blender. Render module is now not called abusive anymore
- API-fied calls to rendering
- Full recode of internal render pipeline. Is now rendering tiles by
default, prepared for much smarter 'bucket' render later.
- Each thread now can render a full part
- Renders were tested with 4 threads, goes fine, apart from some lookup
tables in softshadow and AO still
- Rendering is prepared to do multiple layers and passes
- No single 32 bits trick in render code anymore, all 100% floats now.
Writing images/movies
- moved writing images to blender kernel (bye bye 'schrijfplaatje'!)
- made a new Movie handle system, also in kernel. This will enable much
easier use of movies in Blender
PreviewRender:
- Using new render API, previewrender (in buttons) now uses regular render
code to generate images.
- new datafile 'preview.blend.c' has the preview scenes in it
- previews get rendered in exact displayed size (1 pixel = 1 pixel)
3D Preview render
- new; press Pkey in 3d window, for a panel that continuously renders
(pkey is for games, i know... but we dont do that in orange now!)
- this render works nearly identical to buttons-preview render, so it stops
rendering on any event (mouse, keyboard, etc)
- on moving/scaling the panel, the render code doesn't recreate all geometry
- same for shifting/panning view
- all other operations (now) regenerate the full render database still.
- this is WIP... but big fun, especially for simple scenes!
Compositor
- Using same node system as now in use for shaders, you can composit images
- works pretty straightforward... needs much more options/tools and integration
with rendering still
- is not threaded yet, nor is so smart to only recalculate changes... will be
done soon!
- the "Render Result" node will get all layers/passes as output sockets
- The "Output" node renders to a builtin image, which you can view in the Image
window. (yes, output nodes to render-result, and to files, is on the list!)
The Bad News
- "Unified Render" is removed. It might come back in some stage, but this
system should be built from scratch. I can't really understand this code...
I expect it is not much needed, especially with advanced layer/passes
control
- Panorama render, Field render, Motion blur, is not coded yet... (I had to
recode every single feature in render, so...!)
- Lens Flare is also not back... needs total revision, might become composit
effect though (using zbuffer for visibility)
- Part render is gone! (well, thats obvious, its default now).
- The render window is only restored with limited functionality... I am going
to check first the option to render to a Image window, so Blender can become
a true single-window application. :)
For example, the 'Spare render buffer' (jkey) doesnt work.
- Render with border, now default creates a smaller image
- No zbuffers are written yet... on the todo!
- Scons files and MSVC will need work to get compiling again
OK... thats what I can quickly recall. Now go compiling!
2006-01-23 23:05:47 +01:00
|
|
|
#include <math.h>
|
|
|
|
|
2002-10-12 13:37:38 +02:00
|
|
|
#include "MEM_guardedalloc.h"
|
|
|
|
|
Orange branch feature; Material Layering
(WIP, don't bugs for this in tracker yet please!)
- New Panel "Layers" in Material buttons, allows to add unlimited amount
of materials on top of each other.
- Every Layer is actually just another Material, which gets rendered/shaded
(including texture), and then added on top of previous layer with an
operation like Mix, Add, Mult, etc.
- Layers render fully independent, so bumpmaps are not passed on to next
layers.
- Per Layer you can set if it influences Diffuse, Specular or Alpha
- If a Material returns alpha (like from texture), the alpha value is
used for adding the layers too.
- New texture "Map To" channel allows to have a texture work on a Layer
- Each layer, including basis Material, can be turned on/off individually
Notes:
- at this moment, the full shading pass happens for each layer, including
shadow, AO and raytraced mirror or transparency...
- I had to remove old hacks from preview render, which corrected reflected
normals for preview texturing.
- still needs loadsa testing!
2005-12-04 15:32:21 +01:00
|
|
|
#include "DNA_curve_types.h"
|
2002-10-12 13:37:38 +02:00
|
|
|
#include "DNA_material_types.h"
|
|
|
|
#include "DNA_mesh_types.h"
|
|
|
|
#include "DNA_meta_types.h"
|
Christmas coding work!
********* Node editor work:
- To enable Nodes for Materials, you have to set the "Use Nodes"
button, in the new Material buttons "Nodes" Panel or in header
of the Node editor. Doing this will disable Material-Layers.
- Nodes now execute materials ("shaders"), but still only using the
previewrender code.
- Nodes have (optional) previews for rendered images.
- Node headers allow to hide buttons and/or preview image
- Nodes can be dragged larger/smaller (right-bottom corner)
- Nodes can be hidden (minimized) with hotkey H
- CTRL+click on an Input Socket gives a popup with default values.
- Changing Material/Texture or Mix node will adjust Node title.
- Click-drag outside of a Node changes cursor to "Knife' and allows to
draw a rect where to cut Links.
- Added new node types RGBtoBW, Texture, In/Output, ColorRamp
- Material Nodes have options to ouput diffuse or specular, or to use
a negative normal. The input socket 'Normal' will force the material
to use that normal, otherwise it uses the normal from the Material
that has the node tree.
- When drawing a link between two not-matching sockets, Blender inserts
a converting node (now only for value/rgb combos)
- When drawing a link to an input socket that's already in use, the
old link will either disappear or flip to another unused socket.
- A click on a Material Node will activate it, and show all its settings
in the Material Buttons. Active Material Nodes draw the material icon
in red.
- A click on any node will show its options in the Node Panel in the
Material buttons.
- Multiple Output Nodes can be used, to sample contents of a tree, but
only one Output is the real one, which is indicated in a different
color and red material icon.
- Added ThemeColors for node types
- ALT+C will convert existing Material-Layers to Node... this currently
only adds the material/mix nodes and connects them. Dunno if this is
worth a lot of coding work to make perfect?
- Press C to call another "Solve order", which will show all possible
cyclic conflicts (if there are).
- Technical: nodes now use "Type" structs which define the
structure of nodes and in/output sockets. The Type structs store all
fixed info, callbacks, and allow to reconstruct saved Nodes to match
what is required by Blender.
- Defining (new) nodes now is as simple as filling in a fixed
Type struct, plus code some callbacks. A doc will be made!
- Node preview images are by default float
********* Icon drawing:
- Cleanup of how old icons were implemented in new system, making
them 16x16 too, correctly centered *and* scaled.
- Made drawing Icons use float coordinates
- Moved BIF_calcpreview_image() into interface_icons.c, renamed it
icon_from_image(). Removed a lot of unneeded Imbuf magic here! :)
- Skipped scaling and imbuf copying when icons are OK size
********* Preview render:
- Huge cleanup of code....
- renaming BIF_xxx calls that only were used internally
- BIF_previewrender() now accepts an argument for rendering method,
so it supports icons, buttonwindow previewrender and node editor
- Only a single BIF_preview_changed() call now exists, supporting all
signals as needed for buttos and node editor
********* More stuff:
- glutil.c, glaDrawPixelsSafe() and glaDrawPixelsTex() now accept format
argument for GL_FLOAT rects
- Made the ColorBand become a built-in button for interface.c
Was a load of cleanup work in buttons_shading.c...
- removed a load of unneeded glBlendFunc() calls
- Fixed bug in calculating text length for buttons (ancient!)
2005-12-28 16:42:51 +01:00
|
|
|
#include "DNA_node_types.h"
|
Orange branch feature; Material Layering
(WIP, don't bugs for this in tracker yet please!)
- New Panel "Layers" in Material buttons, allows to add unlimited amount
of materials on top of each other.
- Every Layer is actually just another Material, which gets rendered/shaded
(including texture), and then added on top of previous layer with an
operation like Mix, Add, Mult, etc.
- Layers render fully independent, so bumpmaps are not passed on to next
layers.
- Per Layer you can set if it influences Diffuse, Specular or Alpha
- If a Material returns alpha (like from texture), the alpha value is
used for adding the layers too.
- New texture "Map To" channel allows to have a texture work on a Layer
- Each layer, including basis Material, can be turned on/off individually
Notes:
- at this moment, the full shading pass happens for each layer, including
shadow, AO and raytraced mirror or transparency...
- I had to remove old hacks from preview render, which corrected reflected
normals for preview texturing.
- still needs loadsa testing!
2005-12-04 15:32:21 +01:00
|
|
|
#include "DNA_object_types.h"
|
2002-10-12 13:37:38 +02:00
|
|
|
#include "DNA_scene_types.h"
|
|
|
|
|
2009-11-10 21:43:45 +01:00
|
|
|
#include "BLI_math.h"
|
2010-12-19 21:12:12 +01:00
|
|
|
#include "BLI_listbase.h"
|
2002-10-12 13:37:38 +02:00
|
|
|
|
2009-01-18 11:41:45 +01:00
|
|
|
#include "BKE_animsys.h"
|
Orange branch feature; Material Layering
(WIP, don't bugs for this in tracker yet please!)
- New Panel "Layers" in Material buttons, allows to add unlimited amount
of materials on top of each other.
- Every Layer is actually just another Material, which gets rendered/shaded
(including texture), and then added on top of previous layer with an
operation like Mix, Add, Mult, etc.
- Layers render fully independent, so bumpmaps are not passed on to next
layers.
- Per Layer you can set if it influences Diffuse, Specular or Alpha
- If a Material returns alpha (like from texture), the alpha value is
used for adding the layers too.
- New texture "Map To" channel allows to have a texture work on a Layer
- Each layer, including basis Material, can be turned on/off individually
Notes:
- at this moment, the full shading pass happens for each layer, including
shadow, AO and raytraced mirror or transparency...
- I had to remove old hacks from preview render, which corrected reflected
normals for preview texturing.
- still needs loadsa testing!
2005-12-04 15:32:21 +01:00
|
|
|
#include "BKE_displist.h"
|
2002-10-12 13:37:38 +02:00
|
|
|
#include "BKE_global.h"
|
2005-12-21 23:21:43 +01:00
|
|
|
#include "BKE_icons.h"
|
2002-10-12 13:37:38 +02:00
|
|
|
#include "BKE_library.h"
|
Orange branch feature; Material Layering
(WIP, don't bugs for this in tracker yet please!)
- New Panel "Layers" in Material buttons, allows to add unlimited amount
of materials on top of each other.
- Every Layer is actually just another Material, which gets rendered/shaded
(including texture), and then added on top of previous layer with an
operation like Mix, Add, Mult, etc.
- Layers render fully independent, so bumpmaps are not passed on to next
layers.
- Per Layer you can set if it influences Diffuse, Specular or Alpha
- If a Material returns alpha (like from texture), the alpha value is
used for adding the layers too.
- New texture "Map To" channel allows to have a texture work on a Layer
- Each layer, including basis Material, can be turned on/off individually
Notes:
- at this moment, the full shading pass happens for each layer, including
shadow, AO and raytraced mirror or transparency...
- I had to remove old hacks from preview render, which corrected reflected
normals for preview texturing.
- still needs loadsa testing!
2005-12-04 15:32:21 +01:00
|
|
|
#include "BKE_main.h"
|
2002-10-12 13:37:38 +02:00
|
|
|
#include "BKE_material.h"
|
Orange branch feature; Material Layering
(WIP, don't bugs for this in tracker yet please!)
- New Panel "Layers" in Material buttons, allows to add unlimited amount
of materials on top of each other.
- Every Layer is actually just another Material, which gets rendered/shaded
(including texture), and then added on top of previous layer with an
operation like Mix, Add, Mult, etc.
- Layers render fully independent, so bumpmaps are not passed on to next
layers.
- Per Layer you can set if it influences Diffuse, Specular or Alpha
- If a Material returns alpha (like from texture), the alpha value is
used for adding the layers too.
- New texture "Map To" channel allows to have a texture work on a Layer
- Each layer, including basis Material, can be turned on/off individually
Notes:
- at this moment, the full shading pass happens for each layer, including
shadow, AO and raytraced mirror or transparency...
- I had to remove old hacks from preview render, which corrected reflected
normals for preview texturing.
- still needs loadsa testing!
2005-12-04 15:32:21 +01:00
|
|
|
#include "BKE_mesh.h"
|
Christmas coding work!
********* Node editor work:
- To enable Nodes for Materials, you have to set the "Use Nodes"
button, in the new Material buttons "Nodes" Panel or in header
of the Node editor. Doing this will disable Material-Layers.
- Nodes now execute materials ("shaders"), but still only using the
previewrender code.
- Nodes have (optional) previews for rendered images.
- Node headers allow to hide buttons and/or preview image
- Nodes can be dragged larger/smaller (right-bottom corner)
- Nodes can be hidden (minimized) with hotkey H
- CTRL+click on an Input Socket gives a popup with default values.
- Changing Material/Texture or Mix node will adjust Node title.
- Click-drag outside of a Node changes cursor to "Knife' and allows to
draw a rect where to cut Links.
- Added new node types RGBtoBW, Texture, In/Output, ColorRamp
- Material Nodes have options to ouput diffuse or specular, or to use
a negative normal. The input socket 'Normal' will force the material
to use that normal, otherwise it uses the normal from the Material
that has the node tree.
- When drawing a link between two not-matching sockets, Blender inserts
a converting node (now only for value/rgb combos)
- When drawing a link to an input socket that's already in use, the
old link will either disappear or flip to another unused socket.
- A click on a Material Node will activate it, and show all its settings
in the Material Buttons. Active Material Nodes draw the material icon
in red.
- A click on any node will show its options in the Node Panel in the
Material buttons.
- Multiple Output Nodes can be used, to sample contents of a tree, but
only one Output is the real one, which is indicated in a different
color and red material icon.
- Added ThemeColors for node types
- ALT+C will convert existing Material-Layers to Node... this currently
only adds the material/mix nodes and connects them. Dunno if this is
worth a lot of coding work to make perfect?
- Press C to call another "Solve order", which will show all possible
cyclic conflicts (if there are).
- Technical: nodes now use "Type" structs which define the
structure of nodes and in/output sockets. The Type structs store all
fixed info, callbacks, and allow to reconstruct saved Nodes to match
what is required by Blender.
- Defining (new) nodes now is as simple as filling in a fixed
Type struct, plus code some callbacks. A doc will be made!
- Node preview images are by default float
********* Icon drawing:
- Cleanup of how old icons were implemented in new system, making
them 16x16 too, correctly centered *and* scaled.
- Made drawing Icons use float coordinates
- Moved BIF_calcpreview_image() into interface_icons.c, renamed it
icon_from_image(). Removed a lot of unneeded Imbuf magic here! :)
- Skipped scaling and imbuf copying when icons are OK size
********* Preview render:
- Huge cleanup of code....
- renaming BIF_xxx calls that only were used internally
- BIF_previewrender() now accepts an argument for rendering method,
so it supports icons, buttonwindow previewrender and node editor
- Only a single BIF_preview_changed() call now exists, supporting all
signals as needed for buttos and node editor
********* More stuff:
- glutil.c, glaDrawPixelsSafe() and glaDrawPixelsTex() now accept format
argument for GL_FLOAT rects
- Made the ColorBand become a built-in button for interface.c
Was a load of cleanup work in buttons_shading.c...
- removed a load of unneeded glBlendFunc() calls
- Fixed bug in calculating text length for buttons (ancient!)
2005-12-28 16:42:51 +01:00
|
|
|
#include "BKE_node.h"
|
Orange branch feature; Material Layering
(WIP, don't bugs for this in tracker yet please!)
- New Panel "Layers" in Material buttons, allows to add unlimited amount
of materials on top of each other.
- Every Layer is actually just another Material, which gets rendered/shaded
(including texture), and then added on top of previous layer with an
operation like Mix, Add, Mult, etc.
- Layers render fully independent, so bumpmaps are not passed on to next
layers.
- Per Layer you can set if it influences Diffuse, Specular or Alpha
- If a Material returns alpha (like from texture), the alpha value is
used for adding the layers too.
- New texture "Map To" channel allows to have a texture work on a Layer
- Each layer, including basis Material, can be turned on/off individually
Notes:
- at this moment, the full shading pass happens for each layer, including
shadow, AO and raytraced mirror or transparency...
- I had to remove old hacks from preview render, which corrected reflected
normals for preview texturing.
- still needs loadsa testing!
2005-12-04 15:32:21 +01:00
|
|
|
#include "BKE_utildefines.h"
|
2002-10-12 13:37:38 +02:00
|
|
|
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 22:51:28 +02:00
|
|
|
#include "GPU_material.h"
|
2003-11-23 15:28:46 +01:00
|
|
|
|
Giant commit!
A full detailed description of this will be done later... is several days
of work. Here's a summary:
Render:
- Full cleanup of render code, removing *all* globals and bad level calls
all over blender. Render module is now not called abusive anymore
- API-fied calls to rendering
- Full recode of internal render pipeline. Is now rendering tiles by
default, prepared for much smarter 'bucket' render later.
- Each thread now can render a full part
- Renders were tested with 4 threads, goes fine, apart from some lookup
tables in softshadow and AO still
- Rendering is prepared to do multiple layers and passes
- No single 32 bits trick in render code anymore, all 100% floats now.
Writing images/movies
- moved writing images to blender kernel (bye bye 'schrijfplaatje'!)
- made a new Movie handle system, also in kernel. This will enable much
easier use of movies in Blender
PreviewRender:
- Using new render API, previewrender (in buttons) now uses regular render
code to generate images.
- new datafile 'preview.blend.c' has the preview scenes in it
- previews get rendered in exact displayed size (1 pixel = 1 pixel)
3D Preview render
- new; press Pkey in 3d window, for a panel that continuously renders
(pkey is for games, i know... but we dont do that in orange now!)
- this render works nearly identical to buttons-preview render, so it stops
rendering on any event (mouse, keyboard, etc)
- on moving/scaling the panel, the render code doesn't recreate all geometry
- same for shifting/panning view
- all other operations (now) regenerate the full render database still.
- this is WIP... but big fun, especially for simple scenes!
Compositor
- Using same node system as now in use for shaders, you can composit images
- works pretty straightforward... needs much more options/tools and integration
with rendering still
- is not threaded yet, nor is so smart to only recalculate changes... will be
done soon!
- the "Render Result" node will get all layers/passes as output sockets
- The "Output" node renders to a builtin image, which you can view in the Image
window. (yes, output nodes to render-result, and to files, is on the list!)
The Bad News
- "Unified Render" is removed. It might come back in some stage, but this
system should be built from scratch. I can't really understand this code...
I expect it is not much needed, especially with advanced layer/passes
control
- Panorama render, Field render, Motion blur, is not coded yet... (I had to
recode every single feature in render, so...!)
- Lens Flare is also not back... needs total revision, might become composit
effect though (using zbuffer for visibility)
- Part render is gone! (well, thats obvious, its default now).
- The render window is only restored with limited functionality... I am going
to check first the option to render to a Image window, so Blender can become
a true single-window application. :)
For example, the 'Spare render buffer' (jkey) doesnt work.
- Render with border, now default creates a smaller image
- No zbuffers are written yet... on the todo!
- Scons files and MSVC will need work to get compiling again
OK... thats what I can quickly recall. Now go compiling!
2006-01-23 23:05:47 +01:00
|
|
|
/* used in UI and render */
|
|
|
|
Material defmaterial;
|
|
|
|
|
|
|
|
/* called on startup, creator.c */
|
|
|
|
void init_def_material(void)
|
|
|
|
{
|
|
|
|
init_material(&defmaterial);
|
|
|
|
}
|
|
|
|
|
Orange branch feature; Material Layering
(WIP, don't bugs for this in tracker yet please!)
- New Panel "Layers" in Material buttons, allows to add unlimited amount
of materials on top of each other.
- Every Layer is actually just another Material, which gets rendered/shaded
(including texture), and then added on top of previous layer with an
operation like Mix, Add, Mult, etc.
- Layers render fully independent, so bumpmaps are not passed on to next
layers.
- Per Layer you can set if it influences Diffuse, Specular or Alpha
- If a Material returns alpha (like from texture), the alpha value is
used for adding the layers too.
- New texture "Map To" channel allows to have a texture work on a Layer
- Each layer, including basis Material, can be turned on/off individually
Notes:
- at this moment, the full shading pass happens for each layer, including
shadow, AO and raytraced mirror or transparency...
- I had to remove old hacks from preview render, which corrected reflected
normals for preview texturing.
- still needs loadsa testing!
2005-12-04 15:32:21 +01:00
|
|
|
/* not material itself */
|
2002-10-12 13:37:38 +02:00
|
|
|
void free_material(Material *ma)
|
|
|
|
{
|
|
|
|
MTex *mtex;
|
Orange branch feature; Material Layering
(WIP, don't bugs for this in tracker yet please!)
- New Panel "Layers" in Material buttons, allows to add unlimited amount
of materials on top of each other.
- Every Layer is actually just another Material, which gets rendered/shaded
(including texture), and then added on top of previous layer with an
operation like Mix, Add, Mult, etc.
- Layers render fully independent, so bumpmaps are not passed on to next
layers.
- Per Layer you can set if it influences Diffuse, Specular or Alpha
- If a Material returns alpha (like from texture), the alpha value is
used for adding the layers too.
- New texture "Map To" channel allows to have a texture work on a Layer
- Each layer, including basis Material, can be turned on/off individually
Notes:
- at this moment, the full shading pass happens for each layer, including
shadow, AO and raytraced mirror or transparency...
- I had to remove old hacks from preview render, which corrected reflected
normals for preview texturing.
- still needs loadsa testing!
2005-12-04 15:32:21 +01:00
|
|
|
int a;
|
2002-10-12 13:37:38 +02:00
|
|
|
|
2004-12-04 22:49:02 +01:00
|
|
|
for(a=0; a<MAX_MTEX; a++) {
|
2002-10-12 13:37:38 +02:00
|
|
|
mtex= ma->mtex[a];
|
|
|
|
if(mtex && mtex->tex) mtex->tex->id.us--;
|
|
|
|
if(mtex) MEM_freeN(mtex);
|
|
|
|
}
|
2004-06-30 20:54:09 +02:00
|
|
|
|
|
|
|
if(ma->ramp_col) MEM_freeN(ma->ramp_col);
|
|
|
|
if(ma->ramp_spec) MEM_freeN(ma->ramp_spec);
|
Orange branch feature; Material Layering
(WIP, don't bugs for this in tracker yet please!)
- New Panel "Layers" in Material buttons, allows to add unlimited amount
of materials on top of each other.
- Every Layer is actually just another Material, which gets rendered/shaded
(including texture), and then added on top of previous layer with an
operation like Mix, Add, Mult, etc.
- Layers render fully independent, so bumpmaps are not passed on to next
layers.
- Per Layer you can set if it influences Diffuse, Specular or Alpha
- If a Material returns alpha (like from texture), the alpha value is
used for adding the layers too.
- New texture "Map To" channel allows to have a texture work on a Layer
- Each layer, including basis Material, can be turned on/off individually
Notes:
- at this moment, the full shading pass happens for each layer, including
shadow, AO and raytraced mirror or transparency...
- I had to remove old hacks from preview render, which corrected reflected
normals for preview texturing.
- still needs loadsa testing!
2005-12-04 15:32:21 +01:00
|
|
|
|
2009-01-18 11:41:45 +01:00
|
|
|
BKE_free_animdata((ID *)ma);
|
|
|
|
|
2011-01-02 20:46:32 +01:00
|
|
|
if(ma->preview)
|
|
|
|
BKE_previewimg_free(&ma->preview);
|
2005-12-21 23:21:43 +01:00
|
|
|
BKE_icon_delete((struct ID*)ma);
|
|
|
|
ma->id.icon_id = 0;
|
Christmas coding work!
********* Node editor work:
- To enable Nodes for Materials, you have to set the "Use Nodes"
button, in the new Material buttons "Nodes" Panel or in header
of the Node editor. Doing this will disable Material-Layers.
- Nodes now execute materials ("shaders"), but still only using the
previewrender code.
- Nodes have (optional) previews for rendered images.
- Node headers allow to hide buttons and/or preview image
- Nodes can be dragged larger/smaller (right-bottom corner)
- Nodes can be hidden (minimized) with hotkey H
- CTRL+click on an Input Socket gives a popup with default values.
- Changing Material/Texture or Mix node will adjust Node title.
- Click-drag outside of a Node changes cursor to "Knife' and allows to
draw a rect where to cut Links.
- Added new node types RGBtoBW, Texture, In/Output, ColorRamp
- Material Nodes have options to ouput diffuse or specular, or to use
a negative normal. The input socket 'Normal' will force the material
to use that normal, otherwise it uses the normal from the Material
that has the node tree.
- When drawing a link between two not-matching sockets, Blender inserts
a converting node (now only for value/rgb combos)
- When drawing a link to an input socket that's already in use, the
old link will either disappear or flip to another unused socket.
- A click on a Material Node will activate it, and show all its settings
in the Material Buttons. Active Material Nodes draw the material icon
in red.
- A click on any node will show its options in the Node Panel in the
Material buttons.
- Multiple Output Nodes can be used, to sample contents of a tree, but
only one Output is the real one, which is indicated in a different
color and red material icon.
- Added ThemeColors for node types
- ALT+C will convert existing Material-Layers to Node... this currently
only adds the material/mix nodes and connects them. Dunno if this is
worth a lot of coding work to make perfect?
- Press C to call another "Solve order", which will show all possible
cyclic conflicts (if there are).
- Technical: nodes now use "Type" structs which define the
structure of nodes and in/output sockets. The Type structs store all
fixed info, callbacks, and allow to reconstruct saved Nodes to match
what is required by Blender.
- Defining (new) nodes now is as simple as filling in a fixed
Type struct, plus code some callbacks. A doc will be made!
- Node preview images are by default float
********* Icon drawing:
- Cleanup of how old icons were implemented in new system, making
them 16x16 too, correctly centered *and* scaled.
- Made drawing Icons use float coordinates
- Moved BIF_calcpreview_image() into interface_icons.c, renamed it
icon_from_image(). Removed a lot of unneeded Imbuf magic here! :)
- Skipped scaling and imbuf copying when icons are OK size
********* Preview render:
- Huge cleanup of code....
- renaming BIF_xxx calls that only were used internally
- BIF_previewrender() now accepts an argument for rendering method,
so it supports icons, buttonwindow previewrender and node editor
- Only a single BIF_preview_changed() call now exists, supporting all
signals as needed for buttos and node editor
********* More stuff:
- glutil.c, glaDrawPixelsSafe() and glaDrawPixelsTex() now accept format
argument for GL_FLOAT rects
- Made the ColorBand become a built-in button for interface.c
Was a load of cleanup work in buttons_shading.c...
- removed a load of unneeded glBlendFunc() calls
- Fixed bug in calculating text length for buttons (ancient!)
2005-12-28 16:42:51 +01:00
|
|
|
|
Orange: more noodle updates!
**** NEW: Group Nodes
Node trees usually become messy and confusing quickly, so we need
not only a way to collapse Nodes into single 'groups', but also a
way to re-use that data to create libraries of effects.
This has been done by making a new Library data type, the NodeTree.
Everything that has been grouped is stored here, and available for
re-use, appending or linking. These NodeTrees are fully generic,
i.e. can store shader trees, composit trees, and so on. The 'type'
value as stored in the NodeTree will keep track of internal type
definitions and execute/drawing callbacks. Needless to say, re-using
shader trees in a composit tree is a bit useless, and will be
prevented in the browsing code. :)
So; any NodeTree can become a "Goup Node" inside in a NodeTree. This
Group Node then works just like any Node.
To prevent the current code to become too complex, I've disabled
the possibility to insert Groups inside of Groups. That might be
enabled later, but is a real nasty piece of code to get OK.
Since Group Nodes are a dynamic Node type, a lot of work has been
done to ensure Node definitions can be dynamic too, but still allow
to be stored in files, and allow to be verified for type-definition
changes on reloading. This system needs a little bit maturing still,
so the Python gurus should better wait a little bit! (Also for me to
write the definite API docs for it).
What works now:
- Press CTRL+G to create a new Group. The grouping code checks for
impossible selections (like an unselected node between selected nodes).
Everthing that's selected then gets removed from the current tree, and
inserted in a new NodeTree library data block. A Group Node then is
added which links to this new NodeTree.
- Press ALT+G to ungroup. This will not delete the NodeTree library
data, but just duplicate the Group into the current tree.
- Press TAB, or click on the NodeTree icon to edit Groups. Note that
NodeTrees are instances, so editing one Group will also change the
other users.
This also means that when removing nodes in a Group (or hiding sockets
or changing internal links) this is immediately corrected for all users
of this Group, also in other Materials.
- While editing Groups, only the internal Nodes can be edited. A single
click outside of the Group boundary will close this 'edit mode'.
What needs to be done:
- SHIFT+A menu in toolbox style, also including a list of Groups
- Enable the single-user button in the Group Node
- Displaying all (visible) internal group UI elements in the Node Panel
- Enable Library linking and prevent editing of Groups then.
**** NEW: Socket Visibility control
Node types will be generated with a lot of possible inputs or outputs,
and drawing all sockets all the time isn't very useful then.
A new option in the Node header ('plus' icon) allows to either hide all
unused sockets (first keypress) or to reveil them (when there are hidden
sockets, the icon displays black, otherwise it's blended).
Hidden sockets in Nodes also are not exported to a Group, so this way
you can control what options (in/outputs) exactly are available.
To be done:
- a way to hide individual sockets, like with a RMB click on it.
**** NEW: Nodes now render!
This is still quite primitive, more on a level to replace the (now
obsolete and disabled) Material Layers.
What needs to be done:
- make the "Geometry" node work properly, also for AA textures
- make the Texture Node work (does very little at the moment)
- give Material Nodes all inputs as needed (like Map-to Panel)
- find a way to export more data from a Material Node, like the
shadow value, or light intensity only, etc
Very important also to separate from the Material Buttons the
"global" options, like "Ztransp" or "Wire" or "Halo". These can not
be set for each Material-Node individually.
Also note that the Preview Render (Buttons window) now renders a bit
differently. This was a horrid piece of antique code, using a totally
incompatible way of rendering. Target is to fully re-use internal
render code for previews.
OK... that's it mostly. Now test!
2006-01-02 14:06:05 +01:00
|
|
|
/* is no lib link block, but material extension */
|
|
|
|
if(ma->nodetree) {
|
Christmas coding work!
********* Node editor work:
- To enable Nodes for Materials, you have to set the "Use Nodes"
button, in the new Material buttons "Nodes" Panel or in header
of the Node editor. Doing this will disable Material-Layers.
- Nodes now execute materials ("shaders"), but still only using the
previewrender code.
- Nodes have (optional) previews for rendered images.
- Node headers allow to hide buttons and/or preview image
- Nodes can be dragged larger/smaller (right-bottom corner)
- Nodes can be hidden (minimized) with hotkey H
- CTRL+click on an Input Socket gives a popup with default values.
- Changing Material/Texture or Mix node will adjust Node title.
- Click-drag outside of a Node changes cursor to "Knife' and allows to
draw a rect where to cut Links.
- Added new node types RGBtoBW, Texture, In/Output, ColorRamp
- Material Nodes have options to ouput diffuse or specular, or to use
a negative normal. The input socket 'Normal' will force the material
to use that normal, otherwise it uses the normal from the Material
that has the node tree.
- When drawing a link between two not-matching sockets, Blender inserts
a converting node (now only for value/rgb combos)
- When drawing a link to an input socket that's already in use, the
old link will either disappear or flip to another unused socket.
- A click on a Material Node will activate it, and show all its settings
in the Material Buttons. Active Material Nodes draw the material icon
in red.
- A click on any node will show its options in the Node Panel in the
Material buttons.
- Multiple Output Nodes can be used, to sample contents of a tree, but
only one Output is the real one, which is indicated in a different
color and red material icon.
- Added ThemeColors for node types
- ALT+C will convert existing Material-Layers to Node... this currently
only adds the material/mix nodes and connects them. Dunno if this is
worth a lot of coding work to make perfect?
- Press C to call another "Solve order", which will show all possible
cyclic conflicts (if there are).
- Technical: nodes now use "Type" structs which define the
structure of nodes and in/output sockets. The Type structs store all
fixed info, callbacks, and allow to reconstruct saved Nodes to match
what is required by Blender.
- Defining (new) nodes now is as simple as filling in a fixed
Type struct, plus code some callbacks. A doc will be made!
- Node preview images are by default float
********* Icon drawing:
- Cleanup of how old icons were implemented in new system, making
them 16x16 too, correctly centered *and* scaled.
- Made drawing Icons use float coordinates
- Moved BIF_calcpreview_image() into interface_icons.c, renamed it
icon_from_image(). Removed a lot of unneeded Imbuf magic here! :)
- Skipped scaling and imbuf copying when icons are OK size
********* Preview render:
- Huge cleanup of code....
- renaming BIF_xxx calls that only were used internally
- BIF_previewrender() now accepts an argument for rendering method,
so it supports icons, buttonwindow previewrender and node editor
- Only a single BIF_preview_changed() call now exists, supporting all
signals as needed for buttos and node editor
********* More stuff:
- glutil.c, glaDrawPixelsSafe() and glaDrawPixelsTex() now accept format
argument for GL_FLOAT rects
- Made the ColorBand become a built-in button for interface.c
Was a load of cleanup work in buttons_shading.c...
- removed a load of unneeded glBlendFunc() calls
- Fixed bug in calculating text length for buttons (ancient!)
2005-12-28 16:42:51 +01:00
|
|
|
ntreeFreeTree(ma->nodetree);
|
Orange: more noodle updates!
**** NEW: Group Nodes
Node trees usually become messy and confusing quickly, so we need
not only a way to collapse Nodes into single 'groups', but also a
way to re-use that data to create libraries of effects.
This has been done by making a new Library data type, the NodeTree.
Everything that has been grouped is stored here, and available for
re-use, appending or linking. These NodeTrees are fully generic,
i.e. can store shader trees, composit trees, and so on. The 'type'
value as stored in the NodeTree will keep track of internal type
definitions and execute/drawing callbacks. Needless to say, re-using
shader trees in a composit tree is a bit useless, and will be
prevented in the browsing code. :)
So; any NodeTree can become a "Goup Node" inside in a NodeTree. This
Group Node then works just like any Node.
To prevent the current code to become too complex, I've disabled
the possibility to insert Groups inside of Groups. That might be
enabled later, but is a real nasty piece of code to get OK.
Since Group Nodes are a dynamic Node type, a lot of work has been
done to ensure Node definitions can be dynamic too, but still allow
to be stored in files, and allow to be verified for type-definition
changes on reloading. This system needs a little bit maturing still,
so the Python gurus should better wait a little bit! (Also for me to
write the definite API docs for it).
What works now:
- Press CTRL+G to create a new Group. The grouping code checks for
impossible selections (like an unselected node between selected nodes).
Everthing that's selected then gets removed from the current tree, and
inserted in a new NodeTree library data block. A Group Node then is
added which links to this new NodeTree.
- Press ALT+G to ungroup. This will not delete the NodeTree library
data, but just duplicate the Group into the current tree.
- Press TAB, or click on the NodeTree icon to edit Groups. Note that
NodeTrees are instances, so editing one Group will also change the
other users.
This also means that when removing nodes in a Group (or hiding sockets
or changing internal links) this is immediately corrected for all users
of this Group, also in other Materials.
- While editing Groups, only the internal Nodes can be edited. A single
click outside of the Group boundary will close this 'edit mode'.
What needs to be done:
- SHIFT+A menu in toolbox style, also including a list of Groups
- Enable the single-user button in the Group Node
- Displaying all (visible) internal group UI elements in the Node Panel
- Enable Library linking and prevent editing of Groups then.
**** NEW: Socket Visibility control
Node types will be generated with a lot of possible inputs or outputs,
and drawing all sockets all the time isn't very useful then.
A new option in the Node header ('plus' icon) allows to either hide all
unused sockets (first keypress) or to reveil them (when there are hidden
sockets, the icon displays black, otherwise it's blended).
Hidden sockets in Nodes also are not exported to a Group, so this way
you can control what options (in/outputs) exactly are available.
To be done:
- a way to hide individual sockets, like with a RMB click on it.
**** NEW: Nodes now render!
This is still quite primitive, more on a level to replace the (now
obsolete and disabled) Material Layers.
What needs to be done:
- make the "Geometry" node work properly, also for AA textures
- make the Texture Node work (does very little at the moment)
- give Material Nodes all inputs as needed (like Map-to Panel)
- find a way to export more data from a Material Node, like the
shadow value, or light intensity only, etc
Very important also to separate from the Material Buttons the
"global" options, like "Ztransp" or "Wire" or "Halo". These can not
be set for each Material-Node individually.
Also note that the Preview Render (Buttons window) now renders a bit
differently. This was a horrid piece of antique code, using a totally
incompatible way of rendering. Target is to fully re-use internal
render code for previews.
OK... that's it mostly. Now test!
2006-01-02 14:06:05 +01:00
|
|
|
MEM_freeN(ma->nodetree);
|
|
|
|
}
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 22:51:28 +02:00
|
|
|
|
|
|
|
if(ma->gpumaterial.first)
|
|
|
|
GPU_material_free(ma);
|
2002-10-12 13:37:38 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void init_material(Material *ma)
|
|
|
|
{
|
2003-07-19 22:31:29 +02:00
|
|
|
ma->r= ma->g= ma->b= ma->ref= 0.8;
|
|
|
|
ma->specr= ma->specg= ma->specb= 1.0;
|
|
|
|
ma->mirr= ma->mirg= ma->mirb= 1.0;
|
2003-12-16 15:12:01 +01:00
|
|
|
ma->spectra= 1.0;
|
2010-01-27 22:40:08 +01:00
|
|
|
ma->amb= 1.0;
|
2003-07-19 22:31:29 +02:00
|
|
|
ma->alpha= 1.0;
|
|
|
|
ma->spec= ma->hasize= 0.5;
|
2002-10-12 13:37:38 +02:00
|
|
|
ma->har= 50;
|
|
|
|
ma->starc= ma->ringc= 4;
|
|
|
|
ma->linec= 12;
|
|
|
|
ma->flarec= 1;
|
2003-07-19 22:31:29 +02:00
|
|
|
ma->flaresize= ma->subsize= 1.0;
|
2003-10-12 00:00:30 +02:00
|
|
|
ma->flareboost= 1;
|
|
|
|
ma->seed2= 6;
|
2003-07-19 22:31:29 +02:00
|
|
|
ma->friction= 0.5;
|
|
|
|
ma->refrac= 4.0;
|
|
|
|
ma->roughness= 0.5;
|
|
|
|
ma->param[0]= 0.5;
|
|
|
|
ma->param[1]= 0.1;
|
|
|
|
ma->param[2]= 0.5;
|
|
|
|
ma->param[3]= 0.1;
|
2005-11-12 17:22:10 +01:00
|
|
|
ma->rms= 0.1;
|
|
|
|
ma->darkness= 1.0;
|
|
|
|
|
|
|
|
ma->strand_sta= ma->strand_end= 1.0f;
|
2003-07-19 22:31:29 +02:00
|
|
|
|
2003-12-16 15:12:01 +01:00
|
|
|
ma->ang= 1.0;
|
|
|
|
ma->ray_depth= 2;
|
|
|
|
ma->ray_depth_tra= 2;
|
2003-12-23 23:31:48 +01:00
|
|
|
ma->fresnel_mir= 0.0;
|
|
|
|
ma->fresnel_tra= 0.0;
|
|
|
|
ma->fresnel_tra_i= 1.25;
|
|
|
|
ma->fresnel_mir_i= 1.25;
|
2007-02-11 15:59:01 +01:00
|
|
|
ma->tx_limit= 0.0;
|
2006-06-16 15:11:21 +02:00
|
|
|
ma->tx_falloff= 1.0;
|
2006-10-14 15:50:11 +02:00
|
|
|
ma->shad_alpha= 1.0f;
|
2002-10-12 13:37:38 +02:00
|
|
|
|
2007-09-07 05:48:50 +02:00
|
|
|
ma->gloss_mir = ma->gloss_tra= 1.0;
|
|
|
|
ma->samp_gloss_mir = ma->samp_gloss_tra= 18;
|
|
|
|
ma->adapt_thresh_mir = ma->adapt_thresh_tra = 0.005;
|
|
|
|
ma->dist_mir = 0.0;
|
|
|
|
ma->fadeto_mir = MA_RAYMIR_FADETOSKY;
|
|
|
|
|
2004-06-30 20:54:09 +02:00
|
|
|
ma->rampfac_col= 1.0;
|
|
|
|
ma->rampfac_spec= 1.0;
|
Orange branch feature; Material Layering
(WIP, don't bugs for this in tracker yet please!)
- New Panel "Layers" in Material buttons, allows to add unlimited amount
of materials on top of each other.
- Every Layer is actually just another Material, which gets rendered/shaded
(including texture), and then added on top of previous layer with an
operation like Mix, Add, Mult, etc.
- Layers render fully independent, so bumpmaps are not passed on to next
layers.
- Per Layer you can set if it influences Diffuse, Specular or Alpha
- If a Material returns alpha (like from texture), the alpha value is
used for adding the layers too.
- New texture "Map To" channel allows to have a texture work on a Layer
- Each layer, including basis Material, can be turned on/off individually
Notes:
- at this moment, the full shading pass happens for each layer, including
shadow, AO and raytraced mirror or transparency...
- I had to remove old hacks from preview render, which corrected reflected
normals for preview texturing.
- still needs loadsa testing!
2005-12-04 15:32:21 +01:00
|
|
|
ma->pr_lamp= 3; /* two lamps, is bits */
|
2006-11-13 02:24:46 +01:00
|
|
|
ma->pr_type= MA_SPHERE;
|
Orange branch feature; Material Layering
(WIP, don't bugs for this in tracker yet please!)
- New Panel "Layers" in Material buttons, allows to add unlimited amount
of materials on top of each other.
- Every Layer is actually just another Material, which gets rendered/shaded
(including texture), and then added on top of previous layer with an
operation like Mix, Add, Mult, etc.
- Layers render fully independent, so bumpmaps are not passed on to next
layers.
- Per Layer you can set if it influences Diffuse, Specular or Alpha
- If a Material returns alpha (like from texture), the alpha value is
used for adding the layers too.
- New texture "Map To" channel allows to have a texture work on a Layer
- Each layer, including basis Material, can be turned on/off individually
Notes:
- at this moment, the full shading pass happens for each layer, including
shadow, AO and raytraced mirror or transparency...
- I had to remove old hacks from preview render, which corrected reflected
normals for preview texturing.
- still needs loadsa testing!
2005-12-04 15:32:21 +01:00
|
|
|
|
2007-05-03 23:37:52 +02:00
|
|
|
ma->sss_radius[0]= 1.0f;
|
|
|
|
ma->sss_radius[1]= 1.0f;
|
|
|
|
ma->sss_radius[2]= 1.0f;
|
2009-09-14 21:12:29 +02:00
|
|
|
ma->sss_col[0]= 1.0f;
|
|
|
|
ma->sss_col[1]= 1.0f;
|
|
|
|
ma->sss_col[2]= 1.0f;
|
2007-05-03 23:37:52 +02:00
|
|
|
ma->sss_error= 0.05f;
|
|
|
|
ma->sss_scale= 0.1f;
|
|
|
|
ma->sss_ior= 1.3f;
|
|
|
|
ma->sss_colfac= 1.0f;
|
|
|
|
ma->sss_texfac= 0.0f;
|
|
|
|
ma->sss_front= 1.0f;
|
|
|
|
ma->sss_back= 1.0f;
|
|
|
|
|
2009-08-16 08:10:31 +02:00
|
|
|
ma->vol.density = 1.0f;
|
|
|
|
ma->vol.emission = 0.0f;
|
2009-08-13 07:21:25 +02:00
|
|
|
ma->vol.scattering = 1.0f;
|
Rework of volume shading
After code review and experimentation, this commit makes some changes to the way that volumes are shaded. Previously, there were problems with the 'scattering' component, in that it wasn't physically correct - it didn't conserve energy and was just acting as a brightness multiplier. This has been changed to be more correct, so that as the light is scattered out of the volume, there is less remaining to penetrate through.
Since this behaviour is very similar to absorption but more useful, absorption has been removed and has been replaced by a 'transmission colour' - controlling the colour of light penetrating through the volume after it has been scattered/absorbed. As well as this, there's now 'reflection', a non-physically correct RGB multiplier for out-scattered light. This is handy for tweaking the overall colour of the volume, without having to worry about wavelength dependent absorption, and its effects on transmitted light. Now at least, even though there is the ability to tweak things non-physically, volume shading is physically based by default, and has a better combination of correctness and ease of use.
There's more detailed information and example images here:
http://wiki.blender.org/index.php/User:Broken/VolumeRendering
Also did some tweaks/optimisation:
* Removed shading step size (was a bit annoying, if it comes back, it will be in a different form)
* Removed phase function options, now just one asymmetry slider controls the range between back-scattering, isotropic scattering, and forward scattering. (note, more extreme values gives artifacts with light cache, will fix...)
* Disabled the extra 'bounce lights' from the preview render for volumes, speeds updates significantly
* Enabled voxeldata texture in preview render
* Fixed volume shadows (they were too dark, fixed by avoiding using the shadfac/AddAlphaLight stuff)
More revisions to come later...
2009-09-30 00:01:32 +02:00
|
|
|
ma->vol.reflection = 1.0f;
|
|
|
|
ma->vol.transmission_col[0] = ma->vol.transmission_col[1] = ma->vol.transmission_col[2] = 1.0f;
|
|
|
|
ma->vol.reflection_col[0] = ma->vol.reflection_col[1] = ma->vol.reflection_col[2] = 1.0f;
|
2009-08-16 08:10:31 +02:00
|
|
|
ma->vol.emission_col[0] = ma->vol.emission_col[1] = ma->vol.emission_col[2] = 1.0f;
|
|
|
|
ma->vol.density_scale = 1.0f;
|
|
|
|
ma->vol.depth_cutoff = 0.01f;
|
|
|
|
ma->vol.stepsize_type = MA_VOL_STEP_RANDOMIZED;
|
|
|
|
ma->vol.stepsize = 0.2f;
|
* changes/additions to volume lighting
Volumes can now receive shadows from external objects, either raytraced shadows or shadow maps.
To use external shadows, enable 'external shadows' in volume material 'lighting' panel. This an extra toggle since it causes a performance hit, but this can probably be revisited/optimised when the new raytrace accelerator is integrated. For shadow maps at least, it's still very quick.
Renamed 'scattering mode' to 'lighting mode' (a bit simpler to understand), and the options inside. Now there's:
- Shadeless
takes light contribution, but without shadowing or self-shading (fast)
good for fog-like volumes, such as mist, or underwater effects
- Shadowed (new)
takes light contribution with shadows, but no self-shading. (medium)
good for mist etc. with directional light sources
eg. http://vimeo.com/6901636
- Shaded
takes light contribution with internal/external shadows, and self shading (slower)
good for thicker/textured volumes like smoke
- Multiple scattering etc (still doesn't work properly, on the todo).
2009-10-05 04:59:47 +02:00
|
|
|
ma->vol.shade_type = MA_VOL_SHADE_SHADED;
|
2009-08-16 08:10:31 +02:00
|
|
|
ma->vol.shadeflag |= MA_VOL_PRECACHESHADING;
|
2009-08-13 07:21:25 +02:00
|
|
|
ma->vol.precache_resolution = 50;
|
2010-01-04 00:45:13 +01:00
|
|
|
ma->vol.ms_spread = 0.2f;
|
|
|
|
ma->vol.ms_diff = 1.f;
|
|
|
|
ma->vol.ms_intensity = 1.f;
|
2008-09-26 09:12:36 +02:00
|
|
|
|
2010-02-11 19:36:47 +01:00
|
|
|
ma->mode= MA_TRACEBLE|MA_SHADBUF|MA_SHADOW|MA_RAYBIAS|MA_TANGENT_STR|MA_ZTRANSP;
|
|
|
|
ma->shade_flag= MA_APPROX_OCCLUSION;
|
2007-09-02 19:25:03 +02:00
|
|
|
ma->preview = NULL;
|
2002-10-12 13:37:38 +02:00
|
|
|
}
|
|
|
|
|
2010-11-17 10:45:45 +01:00
|
|
|
Material *add_material(const char *name)
|
2002-10-12 13:37:38 +02:00
|
|
|
{
|
|
|
|
Material *ma;
|
|
|
|
|
|
|
|
ma= alloc_libblock(&G.main->mat, ID_MA, name);
|
|
|
|
|
|
|
|
init_material(ma);
|
|
|
|
|
|
|
|
return ma;
|
|
|
|
}
|
|
|
|
|
2010-12-19 21:12:12 +01:00
|
|
|
/* XXX keep synced with next function */
|
2010-02-17 12:35:20 +01:00
|
|
|
Material *copy_material(Material *ma)
|
2002-10-12 13:37:38 +02:00
|
|
|
{
|
|
|
|
Material *man;
|
|
|
|
int a;
|
|
|
|
|
|
|
|
man= copy_libblock(ma);
|
|
|
|
|
2010-07-13 18:53:17 +02:00
|
|
|
id_lib_extern((ID *)man->group);
|
2002-10-12 13:37:38 +02:00
|
|
|
|
2004-12-04 22:49:02 +01:00
|
|
|
for(a=0; a<MAX_MTEX; a++) {
|
2002-10-12 13:37:38 +02:00
|
|
|
if(ma->mtex[a]) {
|
|
|
|
man->mtex[a]= MEM_mallocN(sizeof(MTex), "copymaterial");
|
|
|
|
memcpy(man->mtex[a], ma->mtex[a], sizeof(MTex));
|
2010-02-17 12:35:20 +01:00
|
|
|
id_us_plus((ID *)man->mtex[a]->tex);
|
2002-10-12 13:37:38 +02:00
|
|
|
}
|
|
|
|
}
|
Orange branch feature; Material Layering
(WIP, don't bugs for this in tracker yet please!)
- New Panel "Layers" in Material buttons, allows to add unlimited amount
of materials on top of each other.
- Every Layer is actually just another Material, which gets rendered/shaded
(including texture), and then added on top of previous layer with an
operation like Mix, Add, Mult, etc.
- Layers render fully independent, so bumpmaps are not passed on to next
layers.
- Per Layer you can set if it influences Diffuse, Specular or Alpha
- If a Material returns alpha (like from texture), the alpha value is
used for adding the layers too.
- New texture "Map To" channel allows to have a texture work on a Layer
- Each layer, including basis Material, can be turned on/off individually
Notes:
- at this moment, the full shading pass happens for each layer, including
shadow, AO and raytraced mirror or transparency...
- I had to remove old hacks from preview render, which corrected reflected
normals for preview texturing.
- still needs loadsa testing!
2005-12-04 15:32:21 +01:00
|
|
|
|
2004-06-30 20:54:09 +02:00
|
|
|
if(ma->ramp_col) man->ramp_col= MEM_dupallocN(ma->ramp_col);
|
|
|
|
if(ma->ramp_spec) man->ramp_spec= MEM_dupallocN(ma->ramp_spec);
|
2002-10-12 13:37:38 +02:00
|
|
|
|
2007-09-02 19:25:03 +02:00
|
|
|
if (ma->preview) man->preview = BKE_previewimg_copy(ma->preview);
|
|
|
|
|
Christmas coding work!
********* Node editor work:
- To enable Nodes for Materials, you have to set the "Use Nodes"
button, in the new Material buttons "Nodes" Panel or in header
of the Node editor. Doing this will disable Material-Layers.
- Nodes now execute materials ("shaders"), but still only using the
previewrender code.
- Nodes have (optional) previews for rendered images.
- Node headers allow to hide buttons and/or preview image
- Nodes can be dragged larger/smaller (right-bottom corner)
- Nodes can be hidden (minimized) with hotkey H
- CTRL+click on an Input Socket gives a popup with default values.
- Changing Material/Texture or Mix node will adjust Node title.
- Click-drag outside of a Node changes cursor to "Knife' and allows to
draw a rect where to cut Links.
- Added new node types RGBtoBW, Texture, In/Output, ColorRamp
- Material Nodes have options to ouput diffuse or specular, or to use
a negative normal. The input socket 'Normal' will force the material
to use that normal, otherwise it uses the normal from the Material
that has the node tree.
- When drawing a link between two not-matching sockets, Blender inserts
a converting node (now only for value/rgb combos)
- When drawing a link to an input socket that's already in use, the
old link will either disappear or flip to another unused socket.
- A click on a Material Node will activate it, and show all its settings
in the Material Buttons. Active Material Nodes draw the material icon
in red.
- A click on any node will show its options in the Node Panel in the
Material buttons.
- Multiple Output Nodes can be used, to sample contents of a tree, but
only one Output is the real one, which is indicated in a different
color and red material icon.
- Added ThemeColors for node types
- ALT+C will convert existing Material-Layers to Node... this currently
only adds the material/mix nodes and connects them. Dunno if this is
worth a lot of coding work to make perfect?
- Press C to call another "Solve order", which will show all possible
cyclic conflicts (if there are).
- Technical: nodes now use "Type" structs which define the
structure of nodes and in/output sockets. The Type structs store all
fixed info, callbacks, and allow to reconstruct saved Nodes to match
what is required by Blender.
- Defining (new) nodes now is as simple as filling in a fixed
Type struct, plus code some callbacks. A doc will be made!
- Node preview images are by default float
********* Icon drawing:
- Cleanup of how old icons were implemented in new system, making
them 16x16 too, correctly centered *and* scaled.
- Made drawing Icons use float coordinates
- Moved BIF_calcpreview_image() into interface_icons.c, renamed it
icon_from_image(). Removed a lot of unneeded Imbuf magic here! :)
- Skipped scaling and imbuf copying when icons are OK size
********* Preview render:
- Huge cleanup of code....
- renaming BIF_xxx calls that only were used internally
- BIF_previewrender() now accepts an argument for rendering method,
so it supports icons, buttonwindow previewrender and node editor
- Only a single BIF_preview_changed() call now exists, supporting all
signals as needed for buttos and node editor
********* More stuff:
- glutil.c, glaDrawPixelsSafe() and glaDrawPixelsTex() now accept format
argument for GL_FLOAT rects
- Made the ColorBand become a built-in button for interface.c
Was a load of cleanup work in buttons_shading.c...
- removed a load of unneeded glBlendFunc() calls
- Fixed bug in calculating text length for buttons (ancient!)
2005-12-28 16:42:51 +01:00
|
|
|
if(ma->nodetree) {
|
|
|
|
man->nodetree= ntreeCopyTree(ma->nodetree, 0); /* 0 == full new tree */
|
|
|
|
}
|
Merge of first part of changes from the apricot branch, especially
the features that are needed to run the game. Compile tested with
scons, make, but not cmake, that seems to have an issue not related
to these changes. The changes include:
* GLSL support in the viewport and game engine, enable in the game
menu in textured draw mode.
* Synced and merged part of the duplicated blender and gameengine/
gameplayer drawing code.
* Further refactoring of game engine drawing code, especially mesh
storage changed a lot.
* Optimizations in game engine armatures to avoid recomputations.
* A python function to get the framerate estimate in game.
* An option take object color into account in materials.
* An option to restrict shadow casters to a lamp's layers.
* Increase from 10 to 18 texture slots for materials, lamps, word.
An extra texture slot shows up once the last slot is used.
* Memory limit for undo, not enabled by default yet because it
needs the .B.blend to be changed.
* Multiple undo for image painting.
* An offset for dupligroups, so not all objects in a group have to
be at the origin.
2008-09-04 22:51:28 +02:00
|
|
|
|
|
|
|
man->gpumaterial.first= man->gpumaterial.last= NULL;
|
Christmas coding work!
********* Node editor work:
- To enable Nodes for Materials, you have to set the "Use Nodes"
button, in the new Material buttons "Nodes" Panel or in header
of the Node editor. Doing this will disable Material-Layers.
- Nodes now execute materials ("shaders"), but still only using the
previewrender code.
- Nodes have (optional) previews for rendered images.
- Node headers allow to hide buttons and/or preview image
- Nodes can be dragged larger/smaller (right-bottom corner)
- Nodes can be hidden (minimized) with hotkey H
- CTRL+click on an Input Socket gives a popup with default values.
- Changing Material/Texture or Mix node will adjust Node title.
- Click-drag outside of a Node changes cursor to "Knife' and allows to
draw a rect where to cut Links.
- Added new node types RGBtoBW, Texture, In/Output, ColorRamp
- Material Nodes have options to ouput diffuse or specular, or to use
a negative normal. The input socket 'Normal' will force the material
to use that normal, otherwise it uses the normal from the Material
that has the node tree.
- When drawing a link between two not-matching sockets, Blender inserts
a converting node (now only for value/rgb combos)
- When drawing a link to an input socket that's already in use, the
old link will either disappear or flip to another unused socket.
- A click on a Material Node will activate it, and show all its settings
in the Material Buttons. Active Material Nodes draw the material icon
in red.
- A click on any node will show its options in the Node Panel in the
Material buttons.
- Multiple Output Nodes can be used, to sample contents of a tree, but
only one Output is the real one, which is indicated in a different
color and red material icon.
- Added ThemeColors for node types
- ALT+C will convert existing Material-Layers to Node... this currently
only adds the material/mix nodes and connects them. Dunno if this is
worth a lot of coding work to make perfect?
- Press C to call another "Solve order", which will show all possible
cyclic conflicts (if there are).
- Technical: nodes now use "Type" structs which define the
structure of nodes and in/output sockets. The Type structs store all
fixed info, callbacks, and allow to reconstruct saved Nodes to match
what is required by Blender.
- Defining (new) nodes now is as simple as filling in a fixed
Type struct, plus code some callbacks. A doc will be made!
- Node preview images are by default float
********* Icon drawing:
- Cleanup of how old icons were implemented in new system, making
them 16x16 too, correctly centered *and* scaled.
- Made drawing Icons use float coordinates
- Moved BIF_calcpreview_image() into interface_icons.c, renamed it
icon_from_image(). Removed a lot of unneeded Imbuf magic here! :)
- Skipped scaling and imbuf copying when icons are OK size
********* Preview render:
- Huge cleanup of code....
- renaming BIF_xxx calls that only were used internally
- BIF_previewrender() now accepts an argument for rendering method,
so it supports icons, buttonwindow previewrender and node editor
- Only a single BIF_preview_changed() call now exists, supporting all
signals as needed for buttos and node editor
********* More stuff:
- glutil.c, glaDrawPixelsSafe() and glaDrawPixelsTex() now accept format
argument for GL_FLOAT rects
- Made the ColorBand become a built-in button for interface.c
Was a load of cleanup work in buttons_shading.c...
- removed a load of unneeded glBlendFunc() calls
- Fixed bug in calculating text length for buttons (ancient!)
2005-12-28 16:42:51 +01:00
|
|
|
|
2002-10-12 13:37:38 +02:00
|
|
|
return man;
|
|
|
|
}
|
|
|
|
|
2010-12-19 21:12:12 +01:00
|
|
|
/* XXX (see above) material copy without adding to main dbase */
|
|
|
|
Material *localize_material(Material *ma)
|
|
|
|
{
|
|
|
|
Material *man;
|
|
|
|
int a;
|
|
|
|
|
|
|
|
man= copy_libblock(ma);
|
|
|
|
BLI_remlink(&G.main->mat, man);
|
|
|
|
|
|
|
|
for(a=0; a<MAX_MTEX; a++) {
|
|
|
|
if(ma->mtex[a]) {
|
|
|
|
man->mtex[a]= MEM_mallocN(sizeof(MTex), "copymaterial");
|
|
|
|
memcpy(man->mtex[a], ma->mtex[a], sizeof(MTex));
|
|
|
|
/* free_material decrements! */
|
|
|
|
id_us_plus((ID *)man->mtex[a]->tex);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if(ma->ramp_col) man->ramp_col= MEM_dupallocN(ma->ramp_col);
|
|
|
|
if(ma->ramp_spec) man->ramp_spec= MEM_dupallocN(ma->ramp_spec);
|
|
|
|
|
2011-01-02 20:46:32 +01:00
|
|
|
man->preview = NULL;
|
2010-12-19 21:12:12 +01:00
|
|
|
|
|
|
|
if(ma->nodetree) {
|
|
|
|
man->nodetree= ntreeLocalize(ma->nodetree);
|
|
|
|
}
|
|
|
|
|
|
|
|
man->gpumaterial.first= man->gpumaterial.last= NULL;
|
|
|
|
|
|
|
|
return man;
|
|
|
|
}
|
|
|
|
|
2002-10-12 13:37:38 +02:00
|
|
|
void make_local_material(Material *ma)
|
|
|
|
{
|
2010-08-13 16:23:44 +02:00
|
|
|
Main *bmain= G.main;
|
2002-10-12 13:37:38 +02:00
|
|
|
Object *ob;
|
|
|
|
Mesh *me;
|
|
|
|
Curve *cu;
|
|
|
|
MetaBall *mb;
|
|
|
|
Material *man;
|
|
|
|
int a, local=0, lib=0;
|
2003-04-26 13:56:44 +02:00
|
|
|
|
|
|
|
/* - only lib users: do nothing
|
2010-03-22 10:30:00 +01:00
|
|
|
* - only local users: set flag
|
|
|
|
* - mixed: make copy
|
|
|
|
*/
|
2002-10-12 13:37:38 +02:00
|
|
|
|
|
|
|
if(ma->id.lib==0) return;
|
|
|
|
if(ma->id.us==1) {
|
|
|
|
ma->id.lib= 0;
|
|
|
|
ma->id.flag= LIB_LOCAL;
|
|
|
|
new_id(0, (ID *)ma, 0);
|
2004-12-04 22:49:02 +01:00
|
|
|
for(a=0; a<MAX_MTEX; a++) {
|
2002-10-12 13:37:38 +02:00
|
|
|
if(ma->mtex[a]) id_lib_extern((ID *)ma->mtex[a]->tex);
|
|
|
|
}
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* test objects */
|
2010-08-13 16:23:44 +02:00
|
|
|
ob= bmain->object.first;
|
2002-10-12 13:37:38 +02:00
|
|
|
while(ob) {
|
|
|
|
if(ob->mat) {
|
|
|
|
for(a=0; a<ob->totcol; a++) {
|
|
|
|
if(ob->mat[a]==ma) {
|
|
|
|
if(ob->id.lib) lib= 1;
|
|
|
|
else local= 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
ob= ob->id.next;
|
|
|
|
}
|
|
|
|
/* test meshes */
|
2010-08-13 16:23:44 +02:00
|
|
|
me= bmain->mesh.first;
|
2002-10-12 13:37:38 +02:00
|
|
|
while(me) {
|
|
|
|
if(me->mat) {
|
|
|
|
for(a=0; a<me->totcol; a++) {
|
|
|
|
if(me->mat[a]==ma) {
|
|
|
|
if(me->id.lib) lib= 1;
|
|
|
|
else local= 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
me= me->id.next;
|
|
|
|
}
|
|
|
|
/* test curves */
|
2010-08-13 16:23:44 +02:00
|
|
|
cu= bmain->curve.first;
|
2002-10-12 13:37:38 +02:00
|
|
|
while(cu) {
|
|
|
|
if(cu->mat) {
|
|
|
|
for(a=0; a<cu->totcol; a++) {
|
|
|
|
if(cu->mat[a]==ma) {
|
|
|
|
if(cu->id.lib) lib= 1;
|
|
|
|
else local= 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
cu= cu->id.next;
|
|
|
|
}
|
|
|
|
/* test mballs */
|
2010-08-13 16:23:44 +02:00
|
|
|
mb= bmain->mball.first;
|
2002-10-12 13:37:38 +02:00
|
|
|
while(mb) {
|
|
|
|
if(mb->mat) {
|
|
|
|
for(a=0; a<mb->totcol; a++) {
|
|
|
|
if(mb->mat[a]==ma) {
|
|
|
|
if(mb->id.lib) lib= 1;
|
|
|
|
else local= 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
mb= mb->id.next;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(local && lib==0) {
|
|
|
|
ma->id.lib= 0;
|
|
|
|
ma->id.flag= LIB_LOCAL;
|
|
|
|
|
2004-12-04 22:49:02 +01:00
|
|
|
for(a=0; a<MAX_MTEX; a++) {
|
2002-10-12 13:37:38 +02:00
|
|
|
if(ma->mtex[a]) id_lib_extern((ID *)ma->mtex[a]->tex);
|
|
|
|
}
|
|
|
|
|
|
|
|
new_id(0, (ID *)ma, 0);
|
|
|
|
}
|
|
|
|
else if(local && lib) {
|
Orange branch feature; Material Layering
(WIP, don't bugs for this in tracker yet please!)
- New Panel "Layers" in Material buttons, allows to add unlimited amount
of materials on top of each other.
- Every Layer is actually just another Material, which gets rendered/shaded
(including texture), and then added on top of previous layer with an
operation like Mix, Add, Mult, etc.
- Layers render fully independent, so bumpmaps are not passed on to next
layers.
- Per Layer you can set if it influences Diffuse, Specular or Alpha
- If a Material returns alpha (like from texture), the alpha value is
used for adding the layers too.
- New texture "Map To" channel allows to have a texture work on a Layer
- Each layer, including basis Material, can be turned on/off individually
Notes:
- at this moment, the full shading pass happens for each layer, including
shadow, AO and raytraced mirror or transparency...
- I had to remove old hacks from preview render, which corrected reflected
normals for preview texturing.
- still needs loadsa testing!
2005-12-04 15:32:21 +01:00
|
|
|
|
2002-10-12 13:37:38 +02:00
|
|
|
man= copy_material(ma);
|
|
|
|
man->id.us= 0;
|
|
|
|
|
|
|
|
/* do objects */
|
2010-08-13 16:23:44 +02:00
|
|
|
ob= bmain->object.first;
|
2002-10-12 13:37:38 +02:00
|
|
|
while(ob) {
|
|
|
|
if(ob->mat) {
|
|
|
|
for(a=0; a<ob->totcol; a++) {
|
|
|
|
if(ob->mat[a]==ma) {
|
|
|
|
if(ob->id.lib==0) {
|
|
|
|
ob->mat[a]= man;
|
|
|
|
man->id.us++;
|
|
|
|
ma->id.us--;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
ob= ob->id.next;
|
|
|
|
}
|
|
|
|
/* do meshes */
|
2010-08-13 16:23:44 +02:00
|
|
|
me= bmain->mesh.first;
|
2002-10-12 13:37:38 +02:00
|
|
|
while(me) {
|
|
|
|
if(me->mat) {
|
|
|
|
for(a=0; a<me->totcol; a++) {
|
|
|
|
if(me->mat[a]==ma) {
|
|
|
|
if(me->id.lib==0) {
|
|
|
|
me->mat[a]= man;
|
|
|
|
man->id.us++;
|
|
|
|
ma->id.us--;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
me= me->id.next;
|
|
|
|
}
|
|
|
|
/* do curves */
|
2010-08-13 16:23:44 +02:00
|
|
|
cu= bmain->curve.first;
|
2002-10-12 13:37:38 +02:00
|
|
|
while(cu) {
|
|
|
|
if(cu->mat) {
|
|
|
|
for(a=0; a<cu->totcol; a++) {
|
|
|
|
if(cu->mat[a]==ma) {
|
|
|
|
if(cu->id.lib==0) {
|
|
|
|
cu->mat[a]= man;
|
|
|
|
man->id.us++;
|
|
|
|
ma->id.us--;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
cu= cu->id.next;
|
|
|
|
}
|
|
|
|
/* do mballs */
|
2010-08-13 16:23:44 +02:00
|
|
|
mb= bmain->mball.first;
|
2002-10-12 13:37:38 +02:00
|
|
|
while(mb) {
|
|
|
|
if(mb->mat) {
|
|
|
|
for(a=0; a<mb->totcol; a++) {
|
|
|
|
if(mb->mat[a]==ma) {
|
|
|
|
if(mb->id.lib==0) {
|
|
|
|
mb->mat[a]= man;
|
|
|
|
man->id.us++;
|
|
|
|
ma->id.us--;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
mb= mb->id.next;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Material ***give_matarar(Object *ob)
|
|
|
|
{
|
|
|
|
Mesh *me;
|
|
|
|
Curve *cu;
|
|
|
|
MetaBall *mb;
|
|
|
|
|
|
|
|
if(ob->type==OB_MESH) {
|
|
|
|
me= ob->data;
|
|
|
|
return &(me->mat);
|
|
|
|
}
|
|
|
|
else if ELEM3(ob->type, OB_CURVE, OB_FONT, OB_SURF) {
|
|
|
|
cu= ob->data;
|
|
|
|
return &(cu->mat);
|
|
|
|
}
|
|
|
|
else if(ob->type==OB_MBALL) {
|
|
|
|
mb= ob->data;
|
|
|
|
return &(mb->mat);
|
|
|
|
}
|
2007-03-20 16:34:00 +01:00
|
|
|
return NULL;
|
2002-10-12 13:37:38 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
short *give_totcolp(Object *ob)
|
|
|
|
{
|
|
|
|
Mesh *me;
|
|
|
|
Curve *cu;
|
|
|
|
MetaBall *mb;
|
|
|
|
|
|
|
|
if(ob->type==OB_MESH) {
|
|
|
|
me= ob->data;
|
|
|
|
return &(me->totcol);
|
|
|
|
}
|
|
|
|
else if ELEM3(ob->type, OB_CURVE, OB_FONT, OB_SURF) {
|
|
|
|
cu= ob->data;
|
|
|
|
return &(cu->totcol);
|
|
|
|
}
|
|
|
|
else if(ob->type==OB_MBALL) {
|
|
|
|
mb= ob->data;
|
|
|
|
return &(mb->totcol);
|
|
|
|
}
|
2007-03-20 16:34:00 +01:00
|
|
|
return NULL;
|
2002-10-12 13:37:38 +02:00
|
|
|
}
|
|
|
|
|
2010-09-03 09:25:37 +02:00
|
|
|
/* same as above but for ID's */
|
|
|
|
Material ***give_matarar_id(ID *id)
|
|
|
|
{
|
|
|
|
switch(GS(id->name)) {
|
|
|
|
case ID_ME:
|
|
|
|
return &(((Mesh *)id)->mat);
|
|
|
|
break;
|
|
|
|
case ID_CU:
|
|
|
|
return &(((Curve *)id)->mat);
|
|
|
|
break;
|
|
|
|
case ID_MB:
|
2010-12-09 16:49:05 +01:00
|
|
|
return &(((MetaBall *)id)->mat);
|
2010-09-03 09:25:37 +02:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
short *give_totcolp_id(ID *id)
|
|
|
|
{
|
|
|
|
switch(GS(id->name)) {
|
|
|
|
case ID_ME:
|
|
|
|
return &(((Mesh *)id)->totcol);
|
|
|
|
break;
|
|
|
|
case ID_CU:
|
|
|
|
return &(((Curve *)id)->totcol);
|
|
|
|
break;
|
|
|
|
case ID_MB:
|
2010-12-09 16:49:05 +01:00
|
|
|
return &(((MetaBall *)id)->totcol);
|
2010-09-03 09:25:37 +02:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
void material_append_id(ID *id, Material *ma)
|
|
|
|
{
|
|
|
|
Material ***matar;
|
|
|
|
if((matar= give_matarar_id(id))) {
|
|
|
|
short *totcol= give_totcolp_id(id);
|
2010-09-03 18:23:31 +02:00
|
|
|
Material **mat= MEM_callocN(sizeof(void *) * ((*totcol) + 1), "newmatar");
|
2010-09-03 09:25:37 +02:00
|
|
|
if(*totcol) memcpy(mat, *matar, sizeof(void *) * (*totcol));
|
|
|
|
if(*matar) MEM_freeN(*matar);
|
|
|
|
|
|
|
|
*matar= mat;
|
|
|
|
(*matar)[(*totcol)++]= ma;
|
|
|
|
|
|
|
|
id_us_plus((ID *)ma);
|
|
|
|
test_object_materials(id);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Material *material_pop_id(ID *id, int index)
|
|
|
|
{
|
|
|
|
Material *ret= NULL;
|
|
|
|
Material ***matar;
|
|
|
|
if((matar= give_matarar_id(id))) {
|
|
|
|
short *totcol= give_totcolp_id(id);
|
|
|
|
if(index >= 0 && index < (*totcol)) {
|
|
|
|
ret= (*matar)[index];
|
2010-11-16 03:23:20 +01:00
|
|
|
id_us_min((ID *)ret);
|
2010-09-03 09:25:37 +02:00
|
|
|
if(*totcol <= 1) {
|
|
|
|
*totcol= 0;
|
|
|
|
MEM_freeN(*matar);
|
|
|
|
*matar= NULL;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
Material **mat;
|
|
|
|
|
|
|
|
if(index + 1 != (*totcol))
|
|
|
|
memmove((*matar), (*matar) + 1, (*totcol) - (index + 1));
|
|
|
|
|
|
|
|
(*totcol)--;
|
|
|
|
|
|
|
|
mat= MEM_callocN(sizeof(void *) * (*totcol), "newmatar");
|
|
|
|
memcpy(mat, *matar, sizeof(void *) * (*totcol));
|
|
|
|
MEM_freeN(*matar);
|
|
|
|
|
|
|
|
*matar= mat;
|
|
|
|
test_object_materials(id);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2002-10-12 13:37:38 +02:00
|
|
|
Material *give_current_material(Object *ob, int act)
|
|
|
|
{
|
|
|
|
Material ***matarar, *ma;
|
2007-03-20 16:34:00 +01:00
|
|
|
short *totcolp;
|
2002-10-12 13:37:38 +02:00
|
|
|
|
2007-03-20 16:34:00 +01:00
|
|
|
if(ob==NULL) return NULL;
|
|
|
|
|
|
|
|
/* if object cannot have material, totcolp==NULL */
|
|
|
|
totcolp= give_totcolp(ob);
|
|
|
|
if(totcolp==NULL || ob->totcol==0) return NULL;
|
2002-10-12 13:37:38 +02:00
|
|
|
|
2010-12-09 16:49:05 +01:00
|
|
|
if(act<0) {
|
|
|
|
printf("no!\n");
|
|
|
|
}
|
|
|
|
|
2002-10-12 13:37:38 +02:00
|
|
|
if(act>ob->totcol) act= ob->totcol;
|
2006-06-20 17:44:25 +02:00
|
|
|
else if(act<=0) act= 1;
|
2002-10-12 13:37:38 +02:00
|
|
|
|
2010-04-20 18:12:39 +02:00
|
|
|
if(ob->matbits && ob->matbits[act-1]) { /* in object */
|
2002-10-12 13:37:38 +02:00
|
|
|
ma= ob->mat[act-1];
|
|
|
|
}
|
2003-04-26 13:56:44 +02:00
|
|
|
else { /* in data */
|
2006-11-25 19:15:55 +01:00
|
|
|
|
2010-09-02 09:00:34 +02:00
|
|
|
/* check for inconsistency */
|
2006-11-25 19:15:55 +01:00
|
|
|
if(*totcolp < ob->totcol)
|
|
|
|
ob->totcol= *totcolp;
|
|
|
|
if(act>ob->totcol) act= ob->totcol;
|
|
|
|
|
2002-10-12 13:37:38 +02:00
|
|
|
matarar= give_matarar(ob);
|
|
|
|
|
|
|
|
if(matarar && *matarar) ma= (*matarar)[act-1];
|
|
|
|
else ma= 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return ma;
|
|
|
|
}
|
|
|
|
|
|
|
|
ID *material_from(Object *ob, int act)
|
|
|
|
{
|
|
|
|
|
|
|
|
if(ob==0) return 0;
|
|
|
|
|
|
|
|
if(ob->totcol==0) return ob->data;
|
|
|
|
if(act==0) act= 1;
|
|
|
|
|
2009-07-13 02:40:20 +02:00
|
|
|
if(ob->matbits[act-1]) return (ID *)ob;
|
2002-10-12 13:37:38 +02:00
|
|
|
else return ob->data;
|
|
|
|
}
|
|
|
|
|
2009-10-19 16:03:02 +02:00
|
|
|
Material *give_node_material(Material *ma)
|
|
|
|
{
|
|
|
|
if(ma && ma->use_nodes && ma->nodetree) {
|
|
|
|
bNode *node= nodeGetActiveID(ma->nodetree, ID_MA);
|
|
|
|
|
|
|
|
if(node)
|
|
|
|
return (Material *)node->id;
|
|
|
|
}
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2002-10-12 13:37:38 +02:00
|
|
|
/* GS reads the memory pointed at in a specific ordering. There are,
|
|
|
|
* however two definitions for it. I have jotted them down here, both,
|
|
|
|
* but I think the first one is actually used. The thing is that
|
|
|
|
* big-endian systems might read this the wrong way round. OTOH, we
|
|
|
|
* constructed the IDs that are read out with this macro explicitly as
|
|
|
|
* well. I expect we'll sort it out soon... */
|
|
|
|
|
|
|
|
/* from blendef: */
|
|
|
|
#define GS(a) (*((short *)(a)))
|
|
|
|
|
|
|
|
/* from misc_util: flip the bytes from x */
|
|
|
|
/* #define GS(x) (((unsigned char *)(x))[0] << 8 | ((unsigned char *)(x))[1]) */
|
|
|
|
|
2010-12-06 03:32:16 +01:00
|
|
|
void resize_object_material(Object *ob, const short totcol)
|
2002-10-12 13:37:38 +02:00
|
|
|
{
|
|
|
|
Material **newmatar;
|
2009-07-13 02:40:20 +02:00
|
|
|
char *newmatbits;
|
2002-10-12 13:37:38 +02:00
|
|
|
|
2010-12-06 03:32:16 +01:00
|
|
|
if(totcol==0) {
|
|
|
|
if(ob->totcol) {
|
|
|
|
MEM_freeN(ob->mat);
|
|
|
|
MEM_freeN(ob->matbits);
|
|
|
|
ob->mat= NULL;
|
|
|
|
ob->matbits= NULL;
|
|
|
|
}
|
2002-10-12 13:37:38 +02:00
|
|
|
}
|
2010-12-06 03:32:16 +01:00
|
|
|
else if(ob->totcol<totcol) {
|
|
|
|
newmatar= MEM_callocN(sizeof(void *)*totcol, "newmatar");
|
|
|
|
newmatbits= MEM_callocN(sizeof(char)*totcol, "newmatbits");
|
|
|
|
if(ob->totcol) {
|
|
|
|
memcpy(newmatar, ob->mat, sizeof(void *)*ob->totcol);
|
|
|
|
memcpy(newmatbits, ob->matbits, sizeof(char)*ob->totcol);
|
|
|
|
MEM_freeN(ob->mat);
|
|
|
|
MEM_freeN(ob->matbits);
|
|
|
|
}
|
|
|
|
ob->mat= newmatar;
|
|
|
|
ob->matbits= newmatbits;
|
2002-10-12 13:37:38 +02:00
|
|
|
}
|
2010-12-06 03:32:16 +01:00
|
|
|
ob->totcol= totcol;
|
|
|
|
if(ob->totcol && ob->actcol==0) ob->actcol= 1;
|
|
|
|
if(ob->actcol>ob->totcol) ob->actcol= ob->totcol;
|
|
|
|
}
|
|
|
|
|
|
|
|
void test_object_materials(ID *id)
|
|
|
|
{
|
|
|
|
/* make the ob mat-array same size as 'ob->data' mat-array */
|
|
|
|
Object *ob;
|
|
|
|
short *totcol;
|
|
|
|
|
2010-12-07 09:52:12 +01:00
|
|
|
if(id==NULL || (totcol=give_totcolp_id(id))==NULL) {
|
2010-12-06 03:32:16 +01:00
|
|
|
return;
|
2002-10-12 13:37:38 +02:00
|
|
|
}
|
|
|
|
|
2010-12-06 03:32:16 +01:00
|
|
|
for(ob= G.main->object.first; ob; ob= ob->id.next) {
|
2002-10-12 13:37:38 +02:00
|
|
|
if(ob->data==id) {
|
2010-12-06 03:32:16 +01:00
|
|
|
resize_object_material(ob, *totcol);
|
2002-10-12 13:37:38 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void assign_material(Object *ob, Material *ma, int act)
|
|
|
|
{
|
|
|
|
Material *mao, **matar, ***matarar;
|
2009-07-13 02:40:20 +02:00
|
|
|
char *matbits;
|
2002-10-12 13:37:38 +02:00
|
|
|
short *totcolp;
|
|
|
|
|
|
|
|
if(act>MAXMAT) return;
|
|
|
|
if(act<1) act= 1;
|
|
|
|
|
|
|
|
/* test arraylens */
|
|
|
|
|
|
|
|
totcolp= give_totcolp(ob);
|
|
|
|
matarar= give_matarar(ob);
|
|
|
|
|
|
|
|
if(totcolp==0 || matarar==0) return;
|
|
|
|
|
2009-07-13 02:40:20 +02:00
|
|
|
if(act > *totcolp) {
|
2002-10-12 13:37:38 +02:00
|
|
|
matar= MEM_callocN(sizeof(void *)*act, "matarray1");
|
2009-07-13 02:40:20 +02:00
|
|
|
|
|
|
|
if(*totcolp) {
|
|
|
|
memcpy(matar, *matarar, sizeof(void *)*(*totcolp));
|
2002-10-12 13:37:38 +02:00
|
|
|
MEM_freeN(*matarar);
|
|
|
|
}
|
2009-07-13 02:40:20 +02:00
|
|
|
|
2002-10-12 13:37:38 +02:00
|
|
|
*matarar= matar;
|
|
|
|
*totcolp= act;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(act > ob->totcol) {
|
|
|
|
matar= MEM_callocN(sizeof(void *)*act, "matarray2");
|
2009-07-13 02:40:20 +02:00
|
|
|
matbits= MEM_callocN(sizeof(char)*act, "matbits1");
|
2002-10-12 13:37:38 +02:00
|
|
|
if( ob->totcol) {
|
|
|
|
memcpy(matar, ob->mat, sizeof(void *)*( ob->totcol ));
|
2009-07-13 02:40:20 +02:00
|
|
|
memcpy(matbits, ob->matbits, sizeof(char)*(*totcolp));
|
2002-10-12 13:37:38 +02:00
|
|
|
MEM_freeN(ob->mat);
|
2009-07-13 02:40:20 +02:00
|
|
|
MEM_freeN(ob->matbits);
|
2002-10-12 13:37:38 +02:00
|
|
|
}
|
|
|
|
ob->mat= matar;
|
2009-07-13 02:40:20 +02:00
|
|
|
ob->matbits= matbits;
|
2002-10-12 13:37:38 +02:00
|
|
|
ob->totcol= act;
|
2009-07-13 02:40:20 +02:00
|
|
|
|
|
|
|
/* copy object/mesh linking, or assign based on userpref */
|
|
|
|
if(ob->actcol)
|
|
|
|
ob->matbits[act-1]= ob->matbits[ob->actcol-1];
|
|
|
|
else
|
|
|
|
ob->matbits[act-1]= (U.flag & USER_MAT_ON_OB)? 1: 0;
|
2002-10-12 13:37:38 +02:00
|
|
|
}
|
|
|
|
|
2003-04-26 13:56:44 +02:00
|
|
|
/* do it */
|
2002-10-12 13:37:38 +02:00
|
|
|
|
2009-07-13 02:40:20 +02:00
|
|
|
if(ob->matbits[act-1]) { /* in object */
|
2002-10-12 13:37:38 +02:00
|
|
|
mao= ob->mat[act-1];
|
|
|
|
if(mao) mao->id.us--;
|
|
|
|
ob->mat[act-1]= ma;
|
|
|
|
}
|
2003-04-26 13:56:44 +02:00
|
|
|
else { /* in data */
|
2002-10-12 13:37:38 +02:00
|
|
|
mao= (*matarar)[act-1];
|
|
|
|
if(mao) mao->id.us--;
|
|
|
|
(*matarar)[act-1]= ma;
|
|
|
|
}
|
2009-07-13 02:40:20 +02:00
|
|
|
|
2009-07-15 21:20:59 +02:00
|
|
|
if(ma)
|
|
|
|
id_us_plus((ID *)ma);
|
2002-10-12 13:37:38 +02:00
|
|
|
test_object_materials(ob->data);
|
|
|
|
}
|
|
|
|
|
2009-10-07 18:32:55 +02:00
|
|
|
/* XXX - this calls many more update calls per object then are needed, could be optimized */
|
|
|
|
void assign_matarar(struct Object *ob, struct Material ***matar, int totcol)
|
|
|
|
{
|
|
|
|
int i, actcol_orig= ob->actcol;
|
|
|
|
|
2009-10-08 11:22:39 +02:00
|
|
|
while(object_remove_material_slot(ob)) {};
|
2009-10-07 18:32:55 +02:00
|
|
|
|
|
|
|
/* now we have the right number of slots */
|
|
|
|
for(i=0; i<totcol; i++)
|
|
|
|
assign_material(ob, (*matar)[i], i+1);
|
|
|
|
|
|
|
|
if(actcol_orig > ob->totcol)
|
|
|
|
actcol_orig= ob->totcol;
|
|
|
|
|
|
|
|
ob->actcol= actcol_orig;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2007-11-28 19:43:09 +01:00
|
|
|
int find_material_index(Object *ob, Material *ma)
|
|
|
|
{
|
|
|
|
Material ***matarar;
|
|
|
|
short a, *totcolp;
|
|
|
|
|
|
|
|
if(ma==NULL) return 0;
|
|
|
|
|
|
|
|
totcolp= give_totcolp(ob);
|
|
|
|
matarar= give_matarar(ob);
|
|
|
|
|
|
|
|
if(totcolp==NULL || matarar==NULL) return 0;
|
|
|
|
|
|
|
|
for(a=0; a<*totcolp; a++)
|
|
|
|
if((*matarar)[a]==ma)
|
|
|
|
break;
|
|
|
|
if(a<*totcolp)
|
|
|
|
return a+1;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2009-10-08 11:22:39 +02:00
|
|
|
int object_add_material_slot(Object *ob)
|
2002-10-12 13:37:38 +02:00
|
|
|
{
|
|
|
|
Material *ma;
|
|
|
|
|
2009-10-08 11:22:39 +02:00
|
|
|
if(ob==0) return FALSE;
|
|
|
|
if(ob->totcol>=MAXMAT) return FALSE;
|
2002-10-12 13:37:38 +02:00
|
|
|
|
|
|
|
ma= give_current_material(ob, ob->actcol);
|
2009-07-15 21:20:59 +02:00
|
|
|
|
2011-01-05 14:15:29 +01:00
|
|
|
if(ma == NULL)
|
|
|
|
ma= add_material("Material");
|
|
|
|
else
|
|
|
|
ma= copy_material(ma);
|
|
|
|
|
|
|
|
id_us_min(&ma->id);
|
|
|
|
|
2002-10-12 13:37:38 +02:00
|
|
|
assign_material(ob, ma, ob->totcol+1);
|
|
|
|
ob->actcol= ob->totcol;
|
2009-10-08 11:22:39 +02:00
|
|
|
return TRUE;
|
2002-10-12 13:37:38 +02:00
|
|
|
}
|
|
|
|
|
2006-12-05 17:44:57 +01:00
|
|
|
static void do_init_render_material(Material *ma, int r_mode, float *amb)
|
2002-10-12 13:37:38 +02:00
|
|
|
{
|
|
|
|
MTex *mtex;
|
2007-11-28 23:21:12 +01:00
|
|
|
int a, needuv=0, needtang=0;
|
2002-10-12 13:37:38 +02:00
|
|
|
|
|
|
|
if(ma->flarec==0) ma->flarec= 1;
|
|
|
|
|
2008-03-14 19:08:27 +01:00
|
|
|
/* add all texcoflags from mtex, texco and mapto were cleared in advance */
|
2004-12-04 22:49:02 +01:00
|
|
|
for(a=0; a<MAX_MTEX; a++) {
|
2006-04-10 12:14:26 +02:00
|
|
|
|
|
|
|
/* separate tex switching */
|
|
|
|
if(ma->septex & (1<<a)) continue;
|
|
|
|
|
2002-10-12 13:37:38 +02:00
|
|
|
mtex= ma->mtex[a];
|
2008-11-12 23:03:11 +01:00
|
|
|
if(mtex && mtex->tex && (mtex->tex->type | (mtex->tex->use_nodes && mtex->tex->nodetree) )) {
|
2002-10-12 13:37:38 +02:00
|
|
|
|
|
|
|
ma->texco |= mtex->texco;
|
|
|
|
ma->mapto |= mtex->mapto;
|
2011-01-07 15:42:01 +01:00
|
|
|
|
|
|
|
/* always get derivatives for these textures */
|
|
|
|
if ELEM3(mtex->tex->type, TEX_IMAGE, TEX_PLUGIN, TEX_ENVMAP) ma->texco |= TEXCO_OSA;
|
|
|
|
else if(mtex->texflag & MTEX_NEW_BUMP) ma->texco |= TEXCO_OSA;
|
2002-10-12 13:37:38 +02:00
|
|
|
|
2005-12-08 23:05:42 +01:00
|
|
|
if(ma->texco & (TEXCO_ORCO|TEXCO_REFL|TEXCO_NORM|TEXCO_STRAND|TEXCO_STRESS)) needuv= 1;
|
2006-01-31 22:49:05 +01:00
|
|
|
else if(ma->texco & (TEXCO_GLOB|TEXCO_UV|TEXCO_OBJECT|TEXCO_SPEED)) needuv= 1;
|
2005-09-29 15:19:07 +02:00
|
|
|
else if(ma->texco & (TEXCO_LAVECTOR|TEXCO_VIEW|TEXCO_STICKY)) needuv= 1;
|
2007-11-28 23:21:12 +01:00
|
|
|
|
|
|
|
if((ma->mapto & MAP_NORM) && (mtex->normapspace == MTEX_NSPACE_TANGENT))
|
|
|
|
needtang= 1;
|
2002-10-12 13:37:38 +02:00
|
|
|
}
|
|
|
|
}
|
2007-11-28 23:21:12 +01:00
|
|
|
|
|
|
|
if(needtang) ma->mode |= MA_NORMAP_TANG;
|
|
|
|
else ma->mode &= ~MA_NORMAP_TANG;
|
2002-10-12 13:37:38 +02:00
|
|
|
|
2005-07-25 11:19:23 +02:00
|
|
|
if(ma->mode & (MA_VERTEXCOL|MA_VERTEXCOLP|MA_FACETEXTURE)) {
|
2002-10-12 13:37:38 +02:00
|
|
|
needuv= 1;
|
2006-12-05 17:44:57 +01:00
|
|
|
if(r_mode & R_OSA) ma->texco |= TEXCO_OSA; /* for texfaces */
|
2002-10-12 13:37:38 +02:00
|
|
|
}
|
|
|
|
if(needuv) ma->texco |= NEED_UV;
|
2004-12-03 11:16:29 +01:00
|
|
|
|
2006-12-05 17:44:57 +01:00
|
|
|
/* since the raytracer doesnt recalc O structs for each ray, we have to preset them all */
|
|
|
|
if(r_mode & R_RAYTRACE) {
|
2010-04-17 17:47:00 +02:00
|
|
|
if((ma->mode & (MA_RAYMIRROR|MA_SHADOW_TRA)) || ((ma->mode & MA_TRANSP) && (ma->mode & MA_RAYTRANSP))) {
|
2006-12-05 17:44:57 +01:00
|
|
|
ma->texco |= NEED_UV|TEXCO_ORCO|TEXCO_REFL|TEXCO_NORM;
|
|
|
|
if(r_mode & R_OSA) ma->texco |= TEXCO_OSA;
|
|
|
|
}
|
2003-12-10 21:41:53 +01:00
|
|
|
}
|
2006-12-05 17:44:57 +01:00
|
|
|
|
2006-06-20 16:32:42 +02:00
|
|
|
if(amb) {
|
|
|
|
ma->ambr= ma->amb*amb[0];
|
|
|
|
ma->ambg= ma->amb*amb[1];
|
|
|
|
ma->ambb= ma->amb*amb[2];
|
|
|
|
}
|
Giant commit!
A full detailed description of this will be done later... is several days
of work. Here's a summary:
Render:
- Full cleanup of render code, removing *all* globals and bad level calls
all over blender. Render module is now not called abusive anymore
- API-fied calls to rendering
- Full recode of internal render pipeline. Is now rendering tiles by
default, prepared for much smarter 'bucket' render later.
- Each thread now can render a full part
- Renders were tested with 4 threads, goes fine, apart from some lookup
tables in softshadow and AO still
- Rendering is prepared to do multiple layers and passes
- No single 32 bits trick in render code anymore, all 100% floats now.
Writing images/movies
- moved writing images to blender kernel (bye bye 'schrijfplaatje'!)
- made a new Movie handle system, also in kernel. This will enable much
easier use of movies in Blender
PreviewRender:
- Using new render API, previewrender (in buttons) now uses regular render
code to generate images.
- new datafile 'preview.blend.c' has the preview scenes in it
- previews get rendered in exact displayed size (1 pixel = 1 pixel)
3D Preview render
- new; press Pkey in 3d window, for a panel that continuously renders
(pkey is for games, i know... but we dont do that in orange now!)
- this render works nearly identical to buttons-preview render, so it stops
rendering on any event (mouse, keyboard, etc)
- on moving/scaling the panel, the render code doesn't recreate all geometry
- same for shifting/panning view
- all other operations (now) regenerate the full render database still.
- this is WIP... but big fun, especially for simple scenes!
Compositor
- Using same node system as now in use for shaders, you can composit images
- works pretty straightforward... needs much more options/tools and integration
with rendering still
- is not threaded yet, nor is so smart to only recalculate changes... will be
done soon!
- the "Render Result" node will get all layers/passes as output sockets
- The "Output" node renders to a builtin image, which you can view in the Image
window. (yes, output nodes to render-result, and to files, is on the list!)
The Bad News
- "Unified Render" is removed. It might come back in some stage, but this
system should be built from scratch. I can't really understand this code...
I expect it is not much needed, especially with advanced layer/passes
control
- Panorama render, Field render, Motion blur, is not coded yet... (I had to
recode every single feature in render, so...!)
- Lens Flare is also not back... needs total revision, might become composit
effect though (using zbuffer for visibility)
- Part render is gone! (well, thats obvious, its default now).
- The render window is only restored with limited functionality... I am going
to check first the option to render to a Image window, so Blender can become
a true single-window application. :)
For example, the 'Spare render buffer' (jkey) doesnt work.
- Render with border, now default creates a smaller image
- No zbuffers are written yet... on the todo!
- Scons files and MSVC will need work to get compiling again
OK... thats what I can quickly recall. Now go compiling!
2006-01-23 23:05:47 +01:00
|
|
|
/* will become or-ed result of all node modes */
|
Orange branch feature; Material Layering
(WIP, don't bugs for this in tracker yet please!)
- New Panel "Layers" in Material buttons, allows to add unlimited amount
of materials on top of each other.
- Every Layer is actually just another Material, which gets rendered/shaded
(including texture), and then added on top of previous layer with an
operation like Mix, Add, Mult, etc.
- Layers render fully independent, so bumpmaps are not passed on to next
layers.
- Per Layer you can set if it influences Diffuse, Specular or Alpha
- If a Material returns alpha (like from texture), the alpha value is
used for adding the layers too.
- New texture "Map To" channel allows to have a texture work on a Layer
- Each layer, including basis Material, can be turned on/off individually
Notes:
- at this moment, the full shading pass happens for each layer, including
shadow, AO and raytraced mirror or transparency...
- I had to remove old hacks from preview render, which corrected reflected
normals for preview texturing.
- still needs loadsa testing!
2005-12-04 15:32:21 +01:00
|
|
|
ma->mode_l= ma->mode;
|
2006-12-05 20:47:45 +01:00
|
|
|
ma->mode_l &= ~MA_SHLESS;
|
2007-12-04 14:57:28 +01:00
|
|
|
|
|
|
|
if(ma->strand_surfnor > 0.0f)
|
|
|
|
ma->mode_l |= MA_STR_SURFDIFF;
|
2002-10-12 13:37:38 +02:00
|
|
|
}
|
|
|
|
|
2006-12-05 17:44:57 +01:00
|
|
|
static void init_render_nodetree(bNodeTree *ntree, Material *basemat, int r_mode, float *amb)
|
Orange: more noodle updates!
**** NEW: Group Nodes
Node trees usually become messy and confusing quickly, so we need
not only a way to collapse Nodes into single 'groups', but also a
way to re-use that data to create libraries of effects.
This has been done by making a new Library data type, the NodeTree.
Everything that has been grouped is stored here, and available for
re-use, appending or linking. These NodeTrees are fully generic,
i.e. can store shader trees, composit trees, and so on. The 'type'
value as stored in the NodeTree will keep track of internal type
definitions and execute/drawing callbacks. Needless to say, re-using
shader trees in a composit tree is a bit useless, and will be
prevented in the browsing code. :)
So; any NodeTree can become a "Goup Node" inside in a NodeTree. This
Group Node then works just like any Node.
To prevent the current code to become too complex, I've disabled
the possibility to insert Groups inside of Groups. That might be
enabled later, but is a real nasty piece of code to get OK.
Since Group Nodes are a dynamic Node type, a lot of work has been
done to ensure Node definitions can be dynamic too, but still allow
to be stored in files, and allow to be verified for type-definition
changes on reloading. This system needs a little bit maturing still,
so the Python gurus should better wait a little bit! (Also for me to
write the definite API docs for it).
What works now:
- Press CTRL+G to create a new Group. The grouping code checks for
impossible selections (like an unselected node between selected nodes).
Everthing that's selected then gets removed from the current tree, and
inserted in a new NodeTree library data block. A Group Node then is
added which links to this new NodeTree.
- Press ALT+G to ungroup. This will not delete the NodeTree library
data, but just duplicate the Group into the current tree.
- Press TAB, or click on the NodeTree icon to edit Groups. Note that
NodeTrees are instances, so editing one Group will also change the
other users.
This also means that when removing nodes in a Group (or hiding sockets
or changing internal links) this is immediately corrected for all users
of this Group, also in other Materials.
- While editing Groups, only the internal Nodes can be edited. A single
click outside of the Group boundary will close this 'edit mode'.
What needs to be done:
- SHIFT+A menu in toolbox style, also including a list of Groups
- Enable the single-user button in the Group Node
- Displaying all (visible) internal group UI elements in the Node Panel
- Enable Library linking and prevent editing of Groups then.
**** NEW: Socket Visibility control
Node types will be generated with a lot of possible inputs or outputs,
and drawing all sockets all the time isn't very useful then.
A new option in the Node header ('plus' icon) allows to either hide all
unused sockets (first keypress) or to reveil them (when there are hidden
sockets, the icon displays black, otherwise it's blended).
Hidden sockets in Nodes also are not exported to a Group, so this way
you can control what options (in/outputs) exactly are available.
To be done:
- a way to hide individual sockets, like with a RMB click on it.
**** NEW: Nodes now render!
This is still quite primitive, more on a level to replace the (now
obsolete and disabled) Material Layers.
What needs to be done:
- make the "Geometry" node work properly, also for AA textures
- make the Texture Node work (does very little at the moment)
- give Material Nodes all inputs as needed (like Map-to Panel)
- find a way to export more data from a Material Node, like the
shadow value, or light intensity only, etc
Very important also to separate from the Material Buttons the
"global" options, like "Ztransp" or "Wire" or "Halo". These can not
be set for each Material-Node individually.
Also note that the Preview Render (Buttons window) now renders a bit
differently. This was a horrid piece of antique code, using a totally
incompatible way of rendering. Target is to fully re-use internal
render code for previews.
OK... that's it mostly. Now test!
2006-01-02 14:06:05 +01:00
|
|
|
{
|
2006-06-17 14:26:28 +02:00
|
|
|
bNode *node;
|
Orange: more noodle updates!
**** NEW: Group Nodes
Node trees usually become messy and confusing quickly, so we need
not only a way to collapse Nodes into single 'groups', but also a
way to re-use that data to create libraries of effects.
This has been done by making a new Library data type, the NodeTree.
Everything that has been grouped is stored here, and available for
re-use, appending or linking. These NodeTrees are fully generic,
i.e. can store shader trees, composit trees, and so on. The 'type'
value as stored in the NodeTree will keep track of internal type
definitions and execute/drawing callbacks. Needless to say, re-using
shader trees in a composit tree is a bit useless, and will be
prevented in the browsing code. :)
So; any NodeTree can become a "Goup Node" inside in a NodeTree. This
Group Node then works just like any Node.
To prevent the current code to become too complex, I've disabled
the possibility to insert Groups inside of Groups. That might be
enabled later, but is a real nasty piece of code to get OK.
Since Group Nodes are a dynamic Node type, a lot of work has been
done to ensure Node definitions can be dynamic too, but still allow
to be stored in files, and allow to be verified for type-definition
changes on reloading. This system needs a little bit maturing still,
so the Python gurus should better wait a little bit! (Also for me to
write the definite API docs for it).
What works now:
- Press CTRL+G to create a new Group. The grouping code checks for
impossible selections (like an unselected node between selected nodes).
Everthing that's selected then gets removed from the current tree, and
inserted in a new NodeTree library data block. A Group Node then is
added which links to this new NodeTree.
- Press ALT+G to ungroup. This will not delete the NodeTree library
data, but just duplicate the Group into the current tree.
- Press TAB, or click on the NodeTree icon to edit Groups. Note that
NodeTrees are instances, so editing one Group will also change the
other users.
This also means that when removing nodes in a Group (or hiding sockets
or changing internal links) this is immediately corrected for all users
of this Group, also in other Materials.
- While editing Groups, only the internal Nodes can be edited. A single
click outside of the Group boundary will close this 'edit mode'.
What needs to be done:
- SHIFT+A menu in toolbox style, also including a list of Groups
- Enable the single-user button in the Group Node
- Displaying all (visible) internal group UI elements in the Node Panel
- Enable Library linking and prevent editing of Groups then.
**** NEW: Socket Visibility control
Node types will be generated with a lot of possible inputs or outputs,
and drawing all sockets all the time isn't very useful then.
A new option in the Node header ('plus' icon) allows to either hide all
unused sockets (first keypress) or to reveil them (when there are hidden
sockets, the icon displays black, otherwise it's blended).
Hidden sockets in Nodes also are not exported to a Group, so this way
you can control what options (in/outputs) exactly are available.
To be done:
- a way to hide individual sockets, like with a RMB click on it.
**** NEW: Nodes now render!
This is still quite primitive, more on a level to replace the (now
obsolete and disabled) Material Layers.
What needs to be done:
- make the "Geometry" node work properly, also for AA textures
- make the Texture Node work (does very little at the moment)
- give Material Nodes all inputs as needed (like Map-to Panel)
- find a way to export more data from a Material Node, like the
shadow value, or light intensity only, etc
Very important also to separate from the Material Buttons the
"global" options, like "Ztransp" or "Wire" or "Halo". These can not
be set for each Material-Node individually.
Also note that the Preview Render (Buttons window) now renders a bit
differently. This was a horrid piece of antique code, using a totally
incompatible way of rendering. Target is to fully re-use internal
render code for previews.
OK... that's it mostly. Now test!
2006-01-02 14:06:05 +01:00
|
|
|
|
2006-06-17 14:26:28 +02:00
|
|
|
for(node=ntree->nodes.first; node; node= node->next) {
|
|
|
|
if(node->id) {
|
|
|
|
if(GS(node->id->name)==ID_MA) {
|
Orange: more noodle updates!
**** NEW: Group Nodes
Node trees usually become messy and confusing quickly, so we need
not only a way to collapse Nodes into single 'groups', but also a
way to re-use that data to create libraries of effects.
This has been done by making a new Library data type, the NodeTree.
Everything that has been grouped is stored here, and available for
re-use, appending or linking. These NodeTrees are fully generic,
i.e. can store shader trees, composit trees, and so on. The 'type'
value as stored in the NodeTree will keep track of internal type
definitions and execute/drawing callbacks. Needless to say, re-using
shader trees in a composit tree is a bit useless, and will be
prevented in the browsing code. :)
So; any NodeTree can become a "Goup Node" inside in a NodeTree. This
Group Node then works just like any Node.
To prevent the current code to become too complex, I've disabled
the possibility to insert Groups inside of Groups. That might be
enabled later, but is a real nasty piece of code to get OK.
Since Group Nodes are a dynamic Node type, a lot of work has been
done to ensure Node definitions can be dynamic too, but still allow
to be stored in files, and allow to be verified for type-definition
changes on reloading. This system needs a little bit maturing still,
so the Python gurus should better wait a little bit! (Also for me to
write the definite API docs for it).
What works now:
- Press CTRL+G to create a new Group. The grouping code checks for
impossible selections (like an unselected node between selected nodes).
Everthing that's selected then gets removed from the current tree, and
inserted in a new NodeTree library data block. A Group Node then is
added which links to this new NodeTree.
- Press ALT+G to ungroup. This will not delete the NodeTree library
data, but just duplicate the Group into the current tree.
- Press TAB, or click on the NodeTree icon to edit Groups. Note that
NodeTrees are instances, so editing one Group will also change the
other users.
This also means that when removing nodes in a Group (or hiding sockets
or changing internal links) this is immediately corrected for all users
of this Group, also in other Materials.
- While editing Groups, only the internal Nodes can be edited. A single
click outside of the Group boundary will close this 'edit mode'.
What needs to be done:
- SHIFT+A menu in toolbox style, also including a list of Groups
- Enable the single-user button in the Group Node
- Displaying all (visible) internal group UI elements in the Node Panel
- Enable Library linking and prevent editing of Groups then.
**** NEW: Socket Visibility control
Node types will be generated with a lot of possible inputs or outputs,
and drawing all sockets all the time isn't very useful then.
A new option in the Node header ('plus' icon) allows to either hide all
unused sockets (first keypress) or to reveil them (when there are hidden
sockets, the icon displays black, otherwise it's blended).
Hidden sockets in Nodes also are not exported to a Group, so this way
you can control what options (in/outputs) exactly are available.
To be done:
- a way to hide individual sockets, like with a RMB click on it.
**** NEW: Nodes now render!
This is still quite primitive, more on a level to replace the (now
obsolete and disabled) Material Layers.
What needs to be done:
- make the "Geometry" node work properly, also for AA textures
- make the Texture Node work (does very little at the moment)
- give Material Nodes all inputs as needed (like Map-to Panel)
- find a way to export more data from a Material Node, like the
shadow value, or light intensity only, etc
Very important also to separate from the Material Buttons the
"global" options, like "Ztransp" or "Wire" or "Halo". These can not
be set for each Material-Node individually.
Also note that the Preview Render (Buttons window) now renders a bit
differently. This was a horrid piece of antique code, using a totally
incompatible way of rendering. Target is to fully re-use internal
render code for previews.
OK... that's it mostly. Now test!
2006-01-02 14:06:05 +01:00
|
|
|
Material *ma= (Material *)node->id;
|
2006-06-17 14:26:28 +02:00
|
|
|
if(ma!=basemat) {
|
2006-12-05 17:44:57 +01:00
|
|
|
do_init_render_material(ma, r_mode, amb);
|
2006-06-17 14:26:28 +02:00
|
|
|
basemat->texco |= ma->texco;
|
|
|
|
basemat->mode_l |= ma->mode_l;
|
Orange: more noodle updates!
**** NEW: Group Nodes
Node trees usually become messy and confusing quickly, so we need
not only a way to collapse Nodes into single 'groups', but also a
way to re-use that data to create libraries of effects.
This has been done by making a new Library data type, the NodeTree.
Everything that has been grouped is stored here, and available for
re-use, appending or linking. These NodeTrees are fully generic,
i.e. can store shader trees, composit trees, and so on. The 'type'
value as stored in the NodeTree will keep track of internal type
definitions and execute/drawing callbacks. Needless to say, re-using
shader trees in a composit tree is a bit useless, and will be
prevented in the browsing code. :)
So; any NodeTree can become a "Goup Node" inside in a NodeTree. This
Group Node then works just like any Node.
To prevent the current code to become too complex, I've disabled
the possibility to insert Groups inside of Groups. That might be
enabled later, but is a real nasty piece of code to get OK.
Since Group Nodes are a dynamic Node type, a lot of work has been
done to ensure Node definitions can be dynamic too, but still allow
to be stored in files, and allow to be verified for type-definition
changes on reloading. This system needs a little bit maturing still,
so the Python gurus should better wait a little bit! (Also for me to
write the definite API docs for it).
What works now:
- Press CTRL+G to create a new Group. The grouping code checks for
impossible selections (like an unselected node between selected nodes).
Everthing that's selected then gets removed from the current tree, and
inserted in a new NodeTree library data block. A Group Node then is
added which links to this new NodeTree.
- Press ALT+G to ungroup. This will not delete the NodeTree library
data, but just duplicate the Group into the current tree.
- Press TAB, or click on the NodeTree icon to edit Groups. Note that
NodeTrees are instances, so editing one Group will also change the
other users.
This also means that when removing nodes in a Group (or hiding sockets
or changing internal links) this is immediately corrected for all users
of this Group, also in other Materials.
- While editing Groups, only the internal Nodes can be edited. A single
click outside of the Group boundary will close this 'edit mode'.
What needs to be done:
- SHIFT+A menu in toolbox style, also including a list of Groups
- Enable the single-user button in the Group Node
- Displaying all (visible) internal group UI elements in the Node Panel
- Enable Library linking and prevent editing of Groups then.
**** NEW: Socket Visibility control
Node types will be generated with a lot of possible inputs or outputs,
and drawing all sockets all the time isn't very useful then.
A new option in the Node header ('plus' icon) allows to either hide all
unused sockets (first keypress) or to reveil them (when there are hidden
sockets, the icon displays black, otherwise it's blended).
Hidden sockets in Nodes also are not exported to a Group, so this way
you can control what options (in/outputs) exactly are available.
To be done:
- a way to hide individual sockets, like with a RMB click on it.
**** NEW: Nodes now render!
This is still quite primitive, more on a level to replace the (now
obsolete and disabled) Material Layers.
What needs to be done:
- make the "Geometry" node work properly, also for AA textures
- make the Texture Node work (does very little at the moment)
- give Material Nodes all inputs as needed (like Map-to Panel)
- find a way to export more data from a Material Node, like the
shadow value, or light intensity only, etc
Very important also to separate from the Material Buttons the
"global" options, like "Ztransp" or "Wire" or "Halo". These can not
be set for each Material-Node individually.
Also note that the Preview Render (Buttons window) now renders a bit
differently. This was a horrid piece of antique code, using a totally
incompatible way of rendering. Target is to fully re-use internal
render code for previews.
OK... that's it mostly. Now test!
2006-01-02 14:06:05 +01:00
|
|
|
}
|
|
|
|
}
|
2006-06-17 14:26:28 +02:00
|
|
|
else if(node->type==NODE_GROUP)
|
2006-12-05 17:44:57 +01:00
|
|
|
init_render_nodetree((bNodeTree *)node->id, basemat, r_mode, amb);
|
Orange: more noodle updates!
**** NEW: Group Nodes
Node trees usually become messy and confusing quickly, so we need
not only a way to collapse Nodes into single 'groups', but also a
way to re-use that data to create libraries of effects.
This has been done by making a new Library data type, the NodeTree.
Everything that has been grouped is stored here, and available for
re-use, appending or linking. These NodeTrees are fully generic,
i.e. can store shader trees, composit trees, and so on. The 'type'
value as stored in the NodeTree will keep track of internal type
definitions and execute/drawing callbacks. Needless to say, re-using
shader trees in a composit tree is a bit useless, and will be
prevented in the browsing code. :)
So; any NodeTree can become a "Goup Node" inside in a NodeTree. This
Group Node then works just like any Node.
To prevent the current code to become too complex, I've disabled
the possibility to insert Groups inside of Groups. That might be
enabled later, but is a real nasty piece of code to get OK.
Since Group Nodes are a dynamic Node type, a lot of work has been
done to ensure Node definitions can be dynamic too, but still allow
to be stored in files, and allow to be verified for type-definition
changes on reloading. This system needs a little bit maturing still,
so the Python gurus should better wait a little bit! (Also for me to
write the definite API docs for it).
What works now:
- Press CTRL+G to create a new Group. The grouping code checks for
impossible selections (like an unselected node between selected nodes).
Everthing that's selected then gets removed from the current tree, and
inserted in a new NodeTree library data block. A Group Node then is
added which links to this new NodeTree.
- Press ALT+G to ungroup. This will not delete the NodeTree library
data, but just duplicate the Group into the current tree.
- Press TAB, or click on the NodeTree icon to edit Groups. Note that
NodeTrees are instances, so editing one Group will also change the
other users.
This also means that when removing nodes in a Group (or hiding sockets
or changing internal links) this is immediately corrected for all users
of this Group, also in other Materials.
- While editing Groups, only the internal Nodes can be edited. A single
click outside of the Group boundary will close this 'edit mode'.
What needs to be done:
- SHIFT+A menu in toolbox style, also including a list of Groups
- Enable the single-user button in the Group Node
- Displaying all (visible) internal group UI elements in the Node Panel
- Enable Library linking and prevent editing of Groups then.
**** NEW: Socket Visibility control
Node types will be generated with a lot of possible inputs or outputs,
and drawing all sockets all the time isn't very useful then.
A new option in the Node header ('plus' icon) allows to either hide all
unused sockets (first keypress) or to reveil them (when there are hidden
sockets, the icon displays black, otherwise it's blended).
Hidden sockets in Nodes also are not exported to a Group, so this way
you can control what options (in/outputs) exactly are available.
To be done:
- a way to hide individual sockets, like with a RMB click on it.
**** NEW: Nodes now render!
This is still quite primitive, more on a level to replace the (now
obsolete and disabled) Material Layers.
What needs to be done:
- make the "Geometry" node work properly, also for AA textures
- make the Texture Node work (does very little at the moment)
- give Material Nodes all inputs as needed (like Map-to Panel)
- find a way to export more data from a Material Node, like the
shadow value, or light intensity only, etc
Very important also to separate from the Material Buttons the
"global" options, like "Ztransp" or "Wire" or "Halo". These can not
be set for each Material-Node individually.
Also note that the Preview Render (Buttons window) now renders a bit
differently. This was a horrid piece of antique code, using a totally
incompatible way of rendering. Target is to fully re-use internal
render code for previews.
OK... that's it mostly. Now test!
2006-01-02 14:06:05 +01:00
|
|
|
}
|
2006-06-17 14:26:28 +02:00
|
|
|
}
|
|
|
|
/* parses the geom+tex nodes */
|
2007-01-14 16:19:27 +01:00
|
|
|
ntreeShaderGetTexcoMode(ntree, r_mode, &basemat->texco, &basemat->mode_l);
|
2006-06-17 14:26:28 +02:00
|
|
|
}
|
|
|
|
|
2006-12-05 17:44:57 +01:00
|
|
|
void init_render_material(Material *mat, int r_mode, float *amb)
|
2006-06-17 14:26:28 +02:00
|
|
|
{
|
|
|
|
|
2006-12-05 17:44:57 +01:00
|
|
|
do_init_render_material(mat, r_mode, amb);
|
2006-06-17 14:26:28 +02:00
|
|
|
|
|
|
|
if(mat->nodetree && mat->use_nodes) {
|
2006-12-05 17:44:57 +01:00
|
|
|
init_render_nodetree(mat->nodetree, mat, r_mode, amb);
|
2006-06-17 14:26:28 +02:00
|
|
|
|
Orange: more noodle updates!
**** NEW: Group Nodes
Node trees usually become messy and confusing quickly, so we need
not only a way to collapse Nodes into single 'groups', but also a
way to re-use that data to create libraries of effects.
This has been done by making a new Library data type, the NodeTree.
Everything that has been grouped is stored here, and available for
re-use, appending or linking. These NodeTrees are fully generic,
i.e. can store shader trees, composit trees, and so on. The 'type'
value as stored in the NodeTree will keep track of internal type
definitions and execute/drawing callbacks. Needless to say, re-using
shader trees in a composit tree is a bit useless, and will be
prevented in the browsing code. :)
So; any NodeTree can become a "Goup Node" inside in a NodeTree. This
Group Node then works just like any Node.
To prevent the current code to become too complex, I've disabled
the possibility to insert Groups inside of Groups. That might be
enabled later, but is a real nasty piece of code to get OK.
Since Group Nodes are a dynamic Node type, a lot of work has been
done to ensure Node definitions can be dynamic too, but still allow
to be stored in files, and allow to be verified for type-definition
changes on reloading. This system needs a little bit maturing still,
so the Python gurus should better wait a little bit! (Also for me to
write the definite API docs for it).
What works now:
- Press CTRL+G to create a new Group. The grouping code checks for
impossible selections (like an unselected node between selected nodes).
Everthing that's selected then gets removed from the current tree, and
inserted in a new NodeTree library data block. A Group Node then is
added which links to this new NodeTree.
- Press ALT+G to ungroup. This will not delete the NodeTree library
data, but just duplicate the Group into the current tree.
- Press TAB, or click on the NodeTree icon to edit Groups. Note that
NodeTrees are instances, so editing one Group will also change the
other users.
This also means that when removing nodes in a Group (or hiding sockets
or changing internal links) this is immediately corrected for all users
of this Group, also in other Materials.
- While editing Groups, only the internal Nodes can be edited. A single
click outside of the Group boundary will close this 'edit mode'.
What needs to be done:
- SHIFT+A menu in toolbox style, also including a list of Groups
- Enable the single-user button in the Group Node
- Displaying all (visible) internal group UI elements in the Node Panel
- Enable Library linking and prevent editing of Groups then.
**** NEW: Socket Visibility control
Node types will be generated with a lot of possible inputs or outputs,
and drawing all sockets all the time isn't very useful then.
A new option in the Node header ('plus' icon) allows to either hide all
unused sockets (first keypress) or to reveil them (when there are hidden
sockets, the icon displays black, otherwise it's blended).
Hidden sockets in Nodes also are not exported to a Group, so this way
you can control what options (in/outputs) exactly are available.
To be done:
- a way to hide individual sockets, like with a RMB click on it.
**** NEW: Nodes now render!
This is still quite primitive, more on a level to replace the (now
obsolete and disabled) Material Layers.
What needs to be done:
- make the "Geometry" node work properly, also for AA textures
- make the Texture Node work (does very little at the moment)
- give Material Nodes all inputs as needed (like Map-to Panel)
- find a way to export more data from a Material Node, like the
shadow value, or light intensity only, etc
Very important also to separate from the Material Buttons the
"global" options, like "Ztransp" or "Wire" or "Halo". These can not
be set for each Material-Node individually.
Also note that the Preview Render (Buttons window) now renders a bit
differently. This was a horrid piece of antique code, using a totally
incompatible way of rendering. Target is to fully re-use internal
render code for previews.
OK... that's it mostly. Now test!
2006-01-02 14:06:05 +01:00
|
|
|
ntreeBeginExecTree(mat->nodetree); /* has internal flag to detect it only does it once */
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-08-01 14:47:49 +02:00
|
|
|
void init_render_materials(Main *bmain, int r_mode, float *amb)
|
2002-10-12 13:37:38 +02:00
|
|
|
{
|
|
|
|
Material *ma;
|
|
|
|
|
2008-03-14 19:08:27 +01:00
|
|
|
/* clear these flags before going over materials, to make sure they
|
|
|
|
* are cleared only once, otherwise node materials contained in other
|
|
|
|
* node materials can go wrong */
|
2010-08-01 14:47:49 +02:00
|
|
|
for(ma= bmain->mat.first; ma; ma= ma->id.next) {
|
2008-03-14 19:08:27 +01:00
|
|
|
if(ma->id.us) {
|
|
|
|
ma->texco= 0;
|
|
|
|
ma->mapto= 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
Orange branch feature; Material Layering
(WIP, don't bugs for this in tracker yet please!)
- New Panel "Layers" in Material buttons, allows to add unlimited amount
of materials on top of each other.
- Every Layer is actually just another Material, which gets rendered/shaded
(including texture), and then added on top of previous layer with an
operation like Mix, Add, Mult, etc.
- Layers render fully independent, so bumpmaps are not passed on to next
layers.
- Per Layer you can set if it influences Diffuse, Specular or Alpha
- If a Material returns alpha (like from texture), the alpha value is
used for adding the layers too.
- New texture "Map To" channel allows to have a texture work on a Layer
- Each layer, including basis Material, can be turned on/off individually
Notes:
- at this moment, the full shading pass happens for each layer, including
shadow, AO and raytraced mirror or transparency...
- I had to remove old hacks from preview render, which corrected reflected
normals for preview texturing.
- still needs loadsa testing!
2005-12-04 15:32:21 +01:00
|
|
|
/* two steps, first initialize, then or the flags for layers */
|
2010-08-01 14:47:49 +02:00
|
|
|
for(ma= bmain->mat.first; ma; ma= ma->id.next) {
|
2006-06-26 19:50:48 +02:00
|
|
|
/* is_used flag comes back in convertblender.c */
|
|
|
|
ma->flag &= ~MA_IS_USED;
|
Orange: more noodle updates!
**** NEW: Group Nodes
Node trees usually become messy and confusing quickly, so we need
not only a way to collapse Nodes into single 'groups', but also a
way to re-use that data to create libraries of effects.
This has been done by making a new Library data type, the NodeTree.
Everything that has been grouped is stored here, and available for
re-use, appending or linking. These NodeTrees are fully generic,
i.e. can store shader trees, composit trees, and so on. The 'type'
value as stored in the NodeTree will keep track of internal type
definitions and execute/drawing callbacks. Needless to say, re-using
shader trees in a composit tree is a bit useless, and will be
prevented in the browsing code. :)
So; any NodeTree can become a "Goup Node" inside in a NodeTree. This
Group Node then works just like any Node.
To prevent the current code to become too complex, I've disabled
the possibility to insert Groups inside of Groups. That might be
enabled later, but is a real nasty piece of code to get OK.
Since Group Nodes are a dynamic Node type, a lot of work has been
done to ensure Node definitions can be dynamic too, but still allow
to be stored in files, and allow to be verified for type-definition
changes on reloading. This system needs a little bit maturing still,
so the Python gurus should better wait a little bit! (Also for me to
write the definite API docs for it).
What works now:
- Press CTRL+G to create a new Group. The grouping code checks for
impossible selections (like an unselected node between selected nodes).
Everthing that's selected then gets removed from the current tree, and
inserted in a new NodeTree library data block. A Group Node then is
added which links to this new NodeTree.
- Press ALT+G to ungroup. This will not delete the NodeTree library
data, but just duplicate the Group into the current tree.
- Press TAB, or click on the NodeTree icon to edit Groups. Note that
NodeTrees are instances, so editing one Group will also change the
other users.
This also means that when removing nodes in a Group (or hiding sockets
or changing internal links) this is immediately corrected for all users
of this Group, also in other Materials.
- While editing Groups, only the internal Nodes can be edited. A single
click outside of the Group boundary will close this 'edit mode'.
What needs to be done:
- SHIFT+A menu in toolbox style, also including a list of Groups
- Enable the single-user button in the Group Node
- Displaying all (visible) internal group UI elements in the Node Panel
- Enable Library linking and prevent editing of Groups then.
**** NEW: Socket Visibility control
Node types will be generated with a lot of possible inputs or outputs,
and drawing all sockets all the time isn't very useful then.
A new option in the Node header ('plus' icon) allows to either hide all
unused sockets (first keypress) or to reveil them (when there are hidden
sockets, the icon displays black, otherwise it's blended).
Hidden sockets in Nodes also are not exported to a Group, so this way
you can control what options (in/outputs) exactly are available.
To be done:
- a way to hide individual sockets, like with a RMB click on it.
**** NEW: Nodes now render!
This is still quite primitive, more on a level to replace the (now
obsolete and disabled) Material Layers.
What needs to be done:
- make the "Geometry" node work properly, also for AA textures
- make the Texture Node work (does very little at the moment)
- give Material Nodes all inputs as needed (like Map-to Panel)
- find a way to export more data from a Material Node, like the
shadow value, or light intensity only, etc
Very important also to separate from the Material Buttons the
"global" options, like "Ztransp" or "Wire" or "Halo". These can not
be set for each Material-Node individually.
Also note that the Preview Render (Buttons window) now renders a bit
differently. This was a horrid piece of antique code, using a totally
incompatible way of rendering. Target is to fully re-use internal
render code for previews.
OK... that's it mostly. Now test!
2006-01-02 14:06:05 +01:00
|
|
|
if(ma->id.us)
|
2006-12-05 17:44:57 +01:00
|
|
|
init_render_material(ma, r_mode, amb);
|
2006-06-26 19:50:48 +02:00
|
|
|
}
|
2006-12-06 16:40:50 +01:00
|
|
|
|
|
|
|
do_init_render_material(&defmaterial, r_mode, amb);
|
Orange: more noodle updates!
**** NEW: Group Nodes
Node trees usually become messy and confusing quickly, so we need
not only a way to collapse Nodes into single 'groups', but also a
way to re-use that data to create libraries of effects.
This has been done by making a new Library data type, the NodeTree.
Everything that has been grouped is stored here, and available for
re-use, appending or linking. These NodeTrees are fully generic,
i.e. can store shader trees, composit trees, and so on. The 'type'
value as stored in the NodeTree will keep track of internal type
definitions and execute/drawing callbacks. Needless to say, re-using
shader trees in a composit tree is a bit useless, and will be
prevented in the browsing code. :)
So; any NodeTree can become a "Goup Node" inside in a NodeTree. This
Group Node then works just like any Node.
To prevent the current code to become too complex, I've disabled
the possibility to insert Groups inside of Groups. That might be
enabled later, but is a real nasty piece of code to get OK.
Since Group Nodes are a dynamic Node type, a lot of work has been
done to ensure Node definitions can be dynamic too, but still allow
to be stored in files, and allow to be verified for type-definition
changes on reloading. This system needs a little bit maturing still,
so the Python gurus should better wait a little bit! (Also for me to
write the definite API docs for it).
What works now:
- Press CTRL+G to create a new Group. The grouping code checks for
impossible selections (like an unselected node between selected nodes).
Everthing that's selected then gets removed from the current tree, and
inserted in a new NodeTree library data block. A Group Node then is
added which links to this new NodeTree.
- Press ALT+G to ungroup. This will not delete the NodeTree library
data, but just duplicate the Group into the current tree.
- Press TAB, or click on the NodeTree icon to edit Groups. Note that
NodeTrees are instances, so editing one Group will also change the
other users.
This also means that when removing nodes in a Group (or hiding sockets
or changing internal links) this is immediately corrected for all users
of this Group, also in other Materials.
- While editing Groups, only the internal Nodes can be edited. A single
click outside of the Group boundary will close this 'edit mode'.
What needs to be done:
- SHIFT+A menu in toolbox style, also including a list of Groups
- Enable the single-user button in the Group Node
- Displaying all (visible) internal group UI elements in the Node Panel
- Enable Library linking and prevent editing of Groups then.
**** NEW: Socket Visibility control
Node types will be generated with a lot of possible inputs or outputs,
and drawing all sockets all the time isn't very useful then.
A new option in the Node header ('plus' icon) allows to either hide all
unused sockets (first keypress) or to reveil them (when there are hidden
sockets, the icon displays black, otherwise it's blended).
Hidden sockets in Nodes also are not exported to a Group, so this way
you can control what options (in/outputs) exactly are available.
To be done:
- a way to hide individual sockets, like with a RMB click on it.
**** NEW: Nodes now render!
This is still quite primitive, more on a level to replace the (now
obsolete and disabled) Material Layers.
What needs to be done:
- make the "Geometry" node work properly, also for AA textures
- make the Texture Node work (does very little at the moment)
- give Material Nodes all inputs as needed (like Map-to Panel)
- find a way to export more data from a Material Node, like the
shadow value, or light intensity only, etc
Very important also to separate from the Material Buttons the
"global" options, like "Ztransp" or "Wire" or "Halo". These can not
be set for each Material-Node individually.
Also note that the Preview Render (Buttons window) now renders a bit
differently. This was a horrid piece of antique code, using a totally
incompatible way of rendering. Target is to fully re-use internal
render code for previews.
OK... that's it mostly. Now test!
2006-01-02 14:06:05 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/* only needed for nodes now */
|
|
|
|
void end_render_material(Material *mat)
|
|
|
|
{
|
|
|
|
if(mat && mat->nodetree && mat->use_nodes)
|
|
|
|
ntreeEndExecTree(mat->nodetree); /* has internal flag to detect it only does it once */
|
|
|
|
}
|
|
|
|
|
2010-08-01 14:47:49 +02:00
|
|
|
void end_render_materials(Main *bmain)
|
Orange: more noodle updates!
**** NEW: Group Nodes
Node trees usually become messy and confusing quickly, so we need
not only a way to collapse Nodes into single 'groups', but also a
way to re-use that data to create libraries of effects.
This has been done by making a new Library data type, the NodeTree.
Everything that has been grouped is stored here, and available for
re-use, appending or linking. These NodeTrees are fully generic,
i.e. can store shader trees, composit trees, and so on. The 'type'
value as stored in the NodeTree will keep track of internal type
definitions and execute/drawing callbacks. Needless to say, re-using
shader trees in a composit tree is a bit useless, and will be
prevented in the browsing code. :)
So; any NodeTree can become a "Goup Node" inside in a NodeTree. This
Group Node then works just like any Node.
To prevent the current code to become too complex, I've disabled
the possibility to insert Groups inside of Groups. That might be
enabled later, but is a real nasty piece of code to get OK.
Since Group Nodes are a dynamic Node type, a lot of work has been
done to ensure Node definitions can be dynamic too, but still allow
to be stored in files, and allow to be verified for type-definition
changes on reloading. This system needs a little bit maturing still,
so the Python gurus should better wait a little bit! (Also for me to
write the definite API docs for it).
What works now:
- Press CTRL+G to create a new Group. The grouping code checks for
impossible selections (like an unselected node between selected nodes).
Everthing that's selected then gets removed from the current tree, and
inserted in a new NodeTree library data block. A Group Node then is
added which links to this new NodeTree.
- Press ALT+G to ungroup. This will not delete the NodeTree library
data, but just duplicate the Group into the current tree.
- Press TAB, or click on the NodeTree icon to edit Groups. Note that
NodeTrees are instances, so editing one Group will also change the
other users.
This also means that when removing nodes in a Group (or hiding sockets
or changing internal links) this is immediately corrected for all users
of this Group, also in other Materials.
- While editing Groups, only the internal Nodes can be edited. A single
click outside of the Group boundary will close this 'edit mode'.
What needs to be done:
- SHIFT+A menu in toolbox style, also including a list of Groups
- Enable the single-user button in the Group Node
- Displaying all (visible) internal group UI elements in the Node Panel
- Enable Library linking and prevent editing of Groups then.
**** NEW: Socket Visibility control
Node types will be generated with a lot of possible inputs or outputs,
and drawing all sockets all the time isn't very useful then.
A new option in the Node header ('plus' icon) allows to either hide all
unused sockets (first keypress) or to reveil them (when there are hidden
sockets, the icon displays black, otherwise it's blended).
Hidden sockets in Nodes also are not exported to a Group, so this way
you can control what options (in/outputs) exactly are available.
To be done:
- a way to hide individual sockets, like with a RMB click on it.
**** NEW: Nodes now render!
This is still quite primitive, more on a level to replace the (now
obsolete and disabled) Material Layers.
What needs to be done:
- make the "Geometry" node work properly, also for AA textures
- make the Texture Node work (does very little at the moment)
- give Material Nodes all inputs as needed (like Map-to Panel)
- find a way to export more data from a Material Node, like the
shadow value, or light intensity only, etc
Very important also to separate from the Material Buttons the
"global" options, like "Ztransp" or "Wire" or "Halo". These can not
be set for each Material-Node individually.
Also note that the Preview Render (Buttons window) now renders a bit
differently. This was a horrid piece of antique code, using a totally
incompatible way of rendering. Target is to fully re-use internal
render code for previews.
OK... that's it mostly. Now test!
2006-01-02 14:06:05 +01:00
|
|
|
{
|
|
|
|
Material *ma;
|
2010-08-01 14:47:49 +02:00
|
|
|
for(ma= bmain->mat.first; ma; ma= ma->id.next)
|
Orange: more noodle updates!
**** NEW: Group Nodes
Node trees usually become messy and confusing quickly, so we need
not only a way to collapse Nodes into single 'groups', but also a
way to re-use that data to create libraries of effects.
This has been done by making a new Library data type, the NodeTree.
Everything that has been grouped is stored here, and available for
re-use, appending or linking. These NodeTrees are fully generic,
i.e. can store shader trees, composit trees, and so on. The 'type'
value as stored in the NodeTree will keep track of internal type
definitions and execute/drawing callbacks. Needless to say, re-using
shader trees in a composit tree is a bit useless, and will be
prevented in the browsing code. :)
So; any NodeTree can become a "Goup Node" inside in a NodeTree. This
Group Node then works just like any Node.
To prevent the current code to become too complex, I've disabled
the possibility to insert Groups inside of Groups. That might be
enabled later, but is a real nasty piece of code to get OK.
Since Group Nodes are a dynamic Node type, a lot of work has been
done to ensure Node definitions can be dynamic too, but still allow
to be stored in files, and allow to be verified for type-definition
changes on reloading. This system needs a little bit maturing still,
so the Python gurus should better wait a little bit! (Also for me to
write the definite API docs for it).
What works now:
- Press CTRL+G to create a new Group. The grouping code checks for
impossible selections (like an unselected node between selected nodes).
Everthing that's selected then gets removed from the current tree, and
inserted in a new NodeTree library data block. A Group Node then is
added which links to this new NodeTree.
- Press ALT+G to ungroup. This will not delete the NodeTree library
data, but just duplicate the Group into the current tree.
- Press TAB, or click on the NodeTree icon to edit Groups. Note that
NodeTrees are instances, so editing one Group will also change the
other users.
This also means that when removing nodes in a Group (or hiding sockets
or changing internal links) this is immediately corrected for all users
of this Group, also in other Materials.
- While editing Groups, only the internal Nodes can be edited. A single
click outside of the Group boundary will close this 'edit mode'.
What needs to be done:
- SHIFT+A menu in toolbox style, also including a list of Groups
- Enable the single-user button in the Group Node
- Displaying all (visible) internal group UI elements in the Node Panel
- Enable Library linking and prevent editing of Groups then.
**** NEW: Socket Visibility control
Node types will be generated with a lot of possible inputs or outputs,
and drawing all sockets all the time isn't very useful then.
A new option in the Node header ('plus' icon) allows to either hide all
unused sockets (first keypress) or to reveil them (when there are hidden
sockets, the icon displays black, otherwise it's blended).
Hidden sockets in Nodes also are not exported to a Group, so this way
you can control what options (in/outputs) exactly are available.
To be done:
- a way to hide individual sockets, like with a RMB click on it.
**** NEW: Nodes now render!
This is still quite primitive, more on a level to replace the (now
obsolete and disabled) Material Layers.
What needs to be done:
- make the "Geometry" node work properly, also for AA textures
- make the Texture Node work (does very little at the moment)
- give Material Nodes all inputs as needed (like Map-to Panel)
- find a way to export more data from a Material Node, like the
shadow value, or light intensity only, etc
Very important also to separate from the Material Buttons the
"global" options, like "Ztransp" or "Wire" or "Halo". These can not
be set for each Material-Node individually.
Also note that the Preview Render (Buttons window) now renders a bit
differently. This was a horrid piece of antique code, using a totally
incompatible way of rendering. Target is to fully re-use internal
render code for previews.
OK... that's it mostly. Now test!
2006-01-02 14:06:05 +01:00
|
|
|
if(ma->id.us)
|
|
|
|
end_render_material(ma);
|
2002-10-12 13:37:38 +02:00
|
|
|
}
|
|
|
|
|
2007-05-03 23:37:52 +02:00
|
|
|
static int material_in_nodetree(bNodeTree *ntree, Material *mat)
|
|
|
|
{
|
|
|
|
bNode *node;
|
|
|
|
|
|
|
|
for(node=ntree->nodes.first; node; node= node->next) {
|
|
|
|
if(node->id && GS(node->id->name)==ID_MA) {
|
|
|
|
if(node->id==(ID*)mat)
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
else if(node->type==NODE_GROUP)
|
|
|
|
if(material_in_nodetree((bNodeTree*)node->id, mat))
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int material_in_material(Material *parmat, Material *mat)
|
|
|
|
{
|
|
|
|
if(parmat==mat)
|
|
|
|
return 1;
|
|
|
|
else if(parmat->nodetree && parmat->use_nodes)
|
|
|
|
return material_in_nodetree(parmat->nodetree, mat);
|
|
|
|
else
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2002-10-12 13:37:38 +02:00
|
|
|
/* ****************** */
|
|
|
|
|
|
|
|
char colname_array[125][20]= {
|
2007-11-05 22:06:27 +01:00
|
|
|
"Black","DarkRed","HalfRed","Red","Red",
|
2002-10-12 13:37:38 +02:00
|
|
|
"DarkGreen","DarkOlive","Brown","Chocolate","OrangeRed",
|
2007-11-05 22:06:27 +01:00
|
|
|
"HalfGreen","GreenOlive","DryOlive","Goldenrod","DarkOrange",
|
2002-10-12 13:37:38 +02:00
|
|
|
"LightGreen","Chartreuse","YellowGreen","Yellow","Gold",
|
|
|
|
"Green","LawnGreen","GreenYellow","LightOlive","Yellow",
|
|
|
|
"DarkBlue","DarkPurple","HotPink","VioletPink","RedPink",
|
|
|
|
"SlateGray","DarkGrey","PalePurple","IndianRed","Tomato",
|
|
|
|
"SeaGreen","PaleGreen","GreenKhaki","LightBrown","LightSalmon",
|
|
|
|
"SpringGreen","PaleGreen","MediumOlive","YellowBrown","LightGold",
|
|
|
|
"LightGreen","LightGreen","LightGreen","GreenYellow","PaleYellow",
|
2007-11-05 22:06:27 +01:00
|
|
|
"HalfBlue","DarkSky","HalfMagenta","VioletRed","DeepPink",
|
2002-10-12 13:37:38 +02:00
|
|
|
"SteelBlue","SkyBlue","Orchid","LightHotPink","HotPink",
|
|
|
|
"SeaGreen","SlateGray","MediumGrey","Burlywood","LightPink",
|
|
|
|
"SpringGreen","Aquamarine","PaleGreen","Khaki","PaleOrange",
|
|
|
|
"SpringGreen","SeaGreen","PaleGreen","PaleWhite","YellowWhite",
|
|
|
|
"LightBlue","Purple","MediumOrchid","Magenta","Magenta",
|
|
|
|
"RoyalBlue","SlateBlue","MediumOrchid","Orchid","Magenta",
|
|
|
|
"DeepSkyBlue","LightSteelBlue","LightSkyBlue","Violet","LightPink",
|
2006-07-05 13:33:09 +02:00
|
|
|
"Cyan","DarkTurquoise","SkyBlue","Grey","Snow",
|
2002-10-12 13:37:38 +02:00
|
|
|
"Mint","Mint","Aquamarine","MintCream","Ivory",
|
|
|
|
"Blue","Blue","DarkMagenta","DarkOrchid","Magenta",
|
|
|
|
"SkyBlue","RoyalBlue","LightSlateBlue","MediumOrchid","Magenta",
|
|
|
|
"DodgerBlue","SteelBlue","MediumPurple","PalePurple","Plum",
|
|
|
|
"DeepSkyBlue","PaleBlue","LightSkyBlue","PalePurple","Thistle",
|
|
|
|
"Cyan","ColdBlue","PaleTurquoise","GhostWhite","White"
|
|
|
|
};
|
|
|
|
|
|
|
|
void automatname(Material *ma)
|
|
|
|
{
|
|
|
|
int nr, r, g, b;
|
|
|
|
float ref;
|
|
|
|
|
|
|
|
if(ma==0) return;
|
|
|
|
if(ma->mode & MA_SHLESS) ref= 1.0;
|
|
|
|
else ref= ma->ref;
|
|
|
|
|
|
|
|
r= (int)(4.99*(ref*ma->r));
|
|
|
|
g= (int)(4.99*(ref*ma->g));
|
|
|
|
b= (int)(4.99*(ref*ma->b));
|
|
|
|
nr= r + 5*g + 25*b;
|
|
|
|
if(nr>124) nr= 124;
|
|
|
|
new_id(&G.main->mat, (ID *)ma, colname_array[nr]);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2009-10-08 11:22:39 +02:00
|
|
|
int object_remove_material_slot(Object *ob)
|
2002-10-12 13:37:38 +02:00
|
|
|
{
|
|
|
|
Material *mao, ***matarar;
|
2009-01-04 15:14:06 +01:00
|
|
|
Object *obt;
|
2002-10-12 13:37:38 +02:00
|
|
|
Curve *cu;
|
|
|
|
Nurb *nu;
|
|
|
|
short *totcolp;
|
|
|
|
int a, actcol;
|
|
|
|
|
2009-10-08 11:22:39 +02:00
|
|
|
if(ob==NULL || ob->totcol==0) return FALSE;
|
2002-10-12 13:37:38 +02:00
|
|
|
|
2003-04-26 13:56:44 +02:00
|
|
|
/* take a mesh/curve/mball as starting point, remove 1 index,
|
|
|
|
* AND with all objects that share the ob->data
|
2002-10-12 13:37:38 +02:00
|
|
|
*
|
2003-04-26 13:56:44 +02:00
|
|
|
* after that check indices in mesh/curve/mball!!!
|
2002-10-12 13:37:38 +02:00
|
|
|
*/
|
|
|
|
|
|
|
|
totcolp= give_totcolp(ob);
|
|
|
|
matarar= give_matarar(ob);
|
|
|
|
|
2009-10-08 11:22:39 +02:00
|
|
|
if(*matarar==NULL) return FALSE;
|
|
|
|
|
2003-04-26 13:56:44 +02:00
|
|
|
/* we delete the actcol */
|
2002-10-12 13:37:38 +02:00
|
|
|
if(ob->totcol) {
|
|
|
|
mao= (*matarar)[ob->actcol-1];
|
|
|
|
if(mao) mao->id.us--;
|
|
|
|
}
|
|
|
|
|
2009-07-13 02:40:20 +02:00
|
|
|
for(a=ob->actcol; a<ob->totcol; a++)
|
2002-10-12 13:37:38 +02:00
|
|
|
(*matarar)[a-1]= (*matarar)[a];
|
|
|
|
(*totcolp)--;
|
|
|
|
|
|
|
|
if(*totcolp==0) {
|
|
|
|
MEM_freeN(*matarar);
|
|
|
|
*matarar= 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
actcol= ob->actcol;
|
|
|
|
obt= G.main->object.first;
|
|
|
|
while(obt) {
|
|
|
|
|
|
|
|
if(obt->data==ob->data) {
|
|
|
|
|
2003-04-26 13:56:44 +02:00
|
|
|
/* WATCH IT: do not use actcol from ob or from obt (can become zero) */
|
2002-10-12 13:37:38 +02:00
|
|
|
mao= obt->mat[actcol-1];
|
|
|
|
if(mao) mao->id.us--;
|
|
|
|
|
2009-07-13 02:40:20 +02:00
|
|
|
for(a=actcol; a<obt->totcol; a++) {
|
|
|
|
obt->mat[a-1]= obt->mat[a];
|
|
|
|
obt->matbits[a-1]= obt->matbits[a];
|
|
|
|
}
|
2002-10-12 13:37:38 +02:00
|
|
|
obt->totcol--;
|
|
|
|
if(obt->actcol > obt->totcol) obt->actcol= obt->totcol;
|
|
|
|
|
|
|
|
if(obt->totcol==0) {
|
|
|
|
MEM_freeN(obt->mat);
|
2009-07-13 02:40:20 +02:00
|
|
|
MEM_freeN(obt->matbits);
|
2002-10-12 13:37:38 +02:00
|
|
|
obt->mat= 0;
|
2009-07-13 02:40:20 +02:00
|
|
|
obt->matbits= NULL;
|
2002-10-12 13:37:38 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
obt= obt->id.next;
|
|
|
|
}
|
|
|
|
|
2003-04-26 13:56:44 +02:00
|
|
|
/* check indices from mesh */
|
2002-10-12 13:37:38 +02:00
|
|
|
|
|
|
|
if(ob->type==OB_MESH) {
|
2004-03-21 00:59:57 +01:00
|
|
|
Mesh *me= get_mesh(ob);
|
|
|
|
mesh_delete_material_index(me, actcol-1);
|
Result of 2 weeks of quiet coding work in Greece :)
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-
2005-07-03 19:35:38 +02:00
|
|
|
freedisplist(&ob->disp);
|
2002-10-12 13:37:38 +02:00
|
|
|
}
|
|
|
|
else if ELEM(ob->type, OB_CURVE, OB_SURF) {
|
|
|
|
cu= ob->data;
|
|
|
|
nu= cu->nurb.first;
|
|
|
|
|
|
|
|
while(nu) {
|
2005-06-26 00:51:51 +02:00
|
|
|
if(nu->mat_nr && nu->mat_nr>=actcol-1) {
|
|
|
|
nu->mat_nr--;
|
|
|
|
if (ob->type == OB_CURVE) nu->charidx--;
|
|
|
|
}
|
2002-10-12 13:37:38 +02:00
|
|
|
nu= nu->next;
|
|
|
|
}
|
Result of 2 weeks of quiet coding work in Greece :)
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-
2005-07-03 19:35:38 +02:00
|
|
|
freedisplist(&ob->disp);
|
2002-10-12 13:37:38 +02:00
|
|
|
}
|
2009-10-08 11:22:39 +02:00
|
|
|
|
|
|
|
return TRUE;
|
2002-10-12 13:37:38 +02:00
|
|
|
}
|
Giant commit!
A full detailed description of this will be done later... is several days
of work. Here's a summary:
Render:
- Full cleanup of render code, removing *all* globals and bad level calls
all over blender. Render module is now not called abusive anymore
- API-fied calls to rendering
- Full recode of internal render pipeline. Is now rendering tiles by
default, prepared for much smarter 'bucket' render later.
- Each thread now can render a full part
- Renders were tested with 4 threads, goes fine, apart from some lookup
tables in softshadow and AO still
- Rendering is prepared to do multiple layers and passes
- No single 32 bits trick in render code anymore, all 100% floats now.
Writing images/movies
- moved writing images to blender kernel (bye bye 'schrijfplaatje'!)
- made a new Movie handle system, also in kernel. This will enable much
easier use of movies in Blender
PreviewRender:
- Using new render API, previewrender (in buttons) now uses regular render
code to generate images.
- new datafile 'preview.blend.c' has the preview scenes in it
- previews get rendered in exact displayed size (1 pixel = 1 pixel)
3D Preview render
- new; press Pkey in 3d window, for a panel that continuously renders
(pkey is for games, i know... but we dont do that in orange now!)
- this render works nearly identical to buttons-preview render, so it stops
rendering on any event (mouse, keyboard, etc)
- on moving/scaling the panel, the render code doesn't recreate all geometry
- same for shifting/panning view
- all other operations (now) regenerate the full render database still.
- this is WIP... but big fun, especially for simple scenes!
Compositor
- Using same node system as now in use for shaders, you can composit images
- works pretty straightforward... needs much more options/tools and integration
with rendering still
- is not threaded yet, nor is so smart to only recalculate changes... will be
done soon!
- the "Render Result" node will get all layers/passes as output sockets
- The "Output" node renders to a builtin image, which you can view in the Image
window. (yes, output nodes to render-result, and to files, is on the list!)
The Bad News
- "Unified Render" is removed. It might come back in some stage, but this
system should be built from scratch. I can't really understand this code...
I expect it is not much needed, especially with advanced layer/passes
control
- Panorama render, Field render, Motion blur, is not coded yet... (I had to
recode every single feature in render, so...!)
- Lens Flare is also not back... needs total revision, might become composit
effect though (using zbuffer for visibility)
- Part render is gone! (well, thats obvious, its default now).
- The render window is only restored with limited functionality... I am going
to check first the option to render to a Image window, so Blender can become
a true single-window application. :)
For example, the 'Spare render buffer' (jkey) doesnt work.
- Render with border, now default creates a smaller image
- No zbuffers are written yet... on the todo!
- Scons files and MSVC will need work to get compiling again
OK... thats what I can quickly recall. Now go compiling!
2006-01-23 23:05:47 +01:00
|
|
|
|
|
|
|
|
|
|
|
/* r g b = current value, col = new value, fac==0 is no change */
|
|
|
|
/* if g==NULL, it only does r channel */
|
|
|
|
void ramp_blend(int type, float *r, float *g, float *b, float fac, float *col)
|
|
|
|
{
|
2009-10-19 13:50:01 +02:00
|
|
|
float tmp, facm= 1.0f-fac;
|
Giant commit!
A full detailed description of this will be done later... is several days
of work. Here's a summary:
Render:
- Full cleanup of render code, removing *all* globals and bad level calls
all over blender. Render module is now not called abusive anymore
- API-fied calls to rendering
- Full recode of internal render pipeline. Is now rendering tiles by
default, prepared for much smarter 'bucket' render later.
- Each thread now can render a full part
- Renders were tested with 4 threads, goes fine, apart from some lookup
tables in softshadow and AO still
- Rendering is prepared to do multiple layers and passes
- No single 32 bits trick in render code anymore, all 100% floats now.
Writing images/movies
- moved writing images to blender kernel (bye bye 'schrijfplaatje'!)
- made a new Movie handle system, also in kernel. This will enable much
easier use of movies in Blender
PreviewRender:
- Using new render API, previewrender (in buttons) now uses regular render
code to generate images.
- new datafile 'preview.blend.c' has the preview scenes in it
- previews get rendered in exact displayed size (1 pixel = 1 pixel)
3D Preview render
- new; press Pkey in 3d window, for a panel that continuously renders
(pkey is for games, i know... but we dont do that in orange now!)
- this render works nearly identical to buttons-preview render, so it stops
rendering on any event (mouse, keyboard, etc)
- on moving/scaling the panel, the render code doesn't recreate all geometry
- same for shifting/panning view
- all other operations (now) regenerate the full render database still.
- this is WIP... but big fun, especially for simple scenes!
Compositor
- Using same node system as now in use for shaders, you can composit images
- works pretty straightforward... needs much more options/tools and integration
with rendering still
- is not threaded yet, nor is so smart to only recalculate changes... will be
done soon!
- the "Render Result" node will get all layers/passes as output sockets
- The "Output" node renders to a builtin image, which you can view in the Image
window. (yes, output nodes to render-result, and to files, is on the list!)
The Bad News
- "Unified Render" is removed. It might come back in some stage, but this
system should be built from scratch. I can't really understand this code...
I expect it is not much needed, especially with advanced layer/passes
control
- Panorama render, Field render, Motion blur, is not coded yet... (I had to
recode every single feature in render, so...!)
- Lens Flare is also not back... needs total revision, might become composit
effect though (using zbuffer for visibility)
- Part render is gone! (well, thats obvious, its default now).
- The render window is only restored with limited functionality... I am going
to check first the option to render to a Image window, so Blender can become
a true single-window application. :)
For example, the 'Spare render buffer' (jkey) doesnt work.
- Render with border, now default creates a smaller image
- No zbuffers are written yet... on the todo!
- Scons files and MSVC will need work to get compiling again
OK... thats what I can quickly recall. Now go compiling!
2006-01-23 23:05:47 +01:00
|
|
|
|
|
|
|
switch (type) {
|
|
|
|
case MA_RAMP_BLEND:
|
|
|
|
*r = facm*(*r) + fac*col[0];
|
|
|
|
if(g) {
|
|
|
|
*g = facm*(*g) + fac*col[1];
|
|
|
|
*b = facm*(*b) + fac*col[2];
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case MA_RAMP_ADD:
|
|
|
|
*r += fac*col[0];
|
|
|
|
if(g) {
|
|
|
|
*g += fac*col[1];
|
|
|
|
*b += fac*col[2];
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case MA_RAMP_MULT:
|
|
|
|
*r *= (facm + fac*col[0]);
|
|
|
|
if(g) {
|
|
|
|
*g *= (facm + fac*col[1]);
|
|
|
|
*b *= (facm + fac*col[2]);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case MA_RAMP_SCREEN:
|
2009-10-19 13:50:01 +02:00
|
|
|
*r = 1.0f - (facm + fac*(1.0f - col[0])) * (1.0f - *r);
|
Giant commit!
A full detailed description of this will be done later... is several days
of work. Here's a summary:
Render:
- Full cleanup of render code, removing *all* globals and bad level calls
all over blender. Render module is now not called abusive anymore
- API-fied calls to rendering
- Full recode of internal render pipeline. Is now rendering tiles by
default, prepared for much smarter 'bucket' render later.
- Each thread now can render a full part
- Renders were tested with 4 threads, goes fine, apart from some lookup
tables in softshadow and AO still
- Rendering is prepared to do multiple layers and passes
- No single 32 bits trick in render code anymore, all 100% floats now.
Writing images/movies
- moved writing images to blender kernel (bye bye 'schrijfplaatje'!)
- made a new Movie handle system, also in kernel. This will enable much
easier use of movies in Blender
PreviewRender:
- Using new render API, previewrender (in buttons) now uses regular render
code to generate images.
- new datafile 'preview.blend.c' has the preview scenes in it
- previews get rendered in exact displayed size (1 pixel = 1 pixel)
3D Preview render
- new; press Pkey in 3d window, for a panel that continuously renders
(pkey is for games, i know... but we dont do that in orange now!)
- this render works nearly identical to buttons-preview render, so it stops
rendering on any event (mouse, keyboard, etc)
- on moving/scaling the panel, the render code doesn't recreate all geometry
- same for shifting/panning view
- all other operations (now) regenerate the full render database still.
- this is WIP... but big fun, especially for simple scenes!
Compositor
- Using same node system as now in use for shaders, you can composit images
- works pretty straightforward... needs much more options/tools and integration
with rendering still
- is not threaded yet, nor is so smart to only recalculate changes... will be
done soon!
- the "Render Result" node will get all layers/passes as output sockets
- The "Output" node renders to a builtin image, which you can view in the Image
window. (yes, output nodes to render-result, and to files, is on the list!)
The Bad News
- "Unified Render" is removed. It might come back in some stage, but this
system should be built from scratch. I can't really understand this code...
I expect it is not much needed, especially with advanced layer/passes
control
- Panorama render, Field render, Motion blur, is not coded yet... (I had to
recode every single feature in render, so...!)
- Lens Flare is also not back... needs total revision, might become composit
effect though (using zbuffer for visibility)
- Part render is gone! (well, thats obvious, its default now).
- The render window is only restored with limited functionality... I am going
to check first the option to render to a Image window, so Blender can become
a true single-window application. :)
For example, the 'Spare render buffer' (jkey) doesnt work.
- Render with border, now default creates a smaller image
- No zbuffers are written yet... on the todo!
- Scons files and MSVC will need work to get compiling again
OK... thats what I can quickly recall. Now go compiling!
2006-01-23 23:05:47 +01:00
|
|
|
if(g) {
|
2009-10-19 13:50:01 +02:00
|
|
|
*g = 1.0f - (facm + fac*(1.0f - col[1])) * (1.0f - *g);
|
|
|
|
*b = 1.0f - (facm + fac*(1.0f - col[2])) * (1.0f - *b);
|
Giant commit!
A full detailed description of this will be done later... is several days
of work. Here's a summary:
Render:
- Full cleanup of render code, removing *all* globals and bad level calls
all over blender. Render module is now not called abusive anymore
- API-fied calls to rendering
- Full recode of internal render pipeline. Is now rendering tiles by
default, prepared for much smarter 'bucket' render later.
- Each thread now can render a full part
- Renders were tested with 4 threads, goes fine, apart from some lookup
tables in softshadow and AO still
- Rendering is prepared to do multiple layers and passes
- No single 32 bits trick in render code anymore, all 100% floats now.
Writing images/movies
- moved writing images to blender kernel (bye bye 'schrijfplaatje'!)
- made a new Movie handle system, also in kernel. This will enable much
easier use of movies in Blender
PreviewRender:
- Using new render API, previewrender (in buttons) now uses regular render
code to generate images.
- new datafile 'preview.blend.c' has the preview scenes in it
- previews get rendered in exact displayed size (1 pixel = 1 pixel)
3D Preview render
- new; press Pkey in 3d window, for a panel that continuously renders
(pkey is for games, i know... but we dont do that in orange now!)
- this render works nearly identical to buttons-preview render, so it stops
rendering on any event (mouse, keyboard, etc)
- on moving/scaling the panel, the render code doesn't recreate all geometry
- same for shifting/panning view
- all other operations (now) regenerate the full render database still.
- this is WIP... but big fun, especially for simple scenes!
Compositor
- Using same node system as now in use for shaders, you can composit images
- works pretty straightforward... needs much more options/tools and integration
with rendering still
- is not threaded yet, nor is so smart to only recalculate changes... will be
done soon!
- the "Render Result" node will get all layers/passes as output sockets
- The "Output" node renders to a builtin image, which you can view in the Image
window. (yes, output nodes to render-result, and to files, is on the list!)
The Bad News
- "Unified Render" is removed. It might come back in some stage, but this
system should be built from scratch. I can't really understand this code...
I expect it is not much needed, especially with advanced layer/passes
control
- Panorama render, Field render, Motion blur, is not coded yet... (I had to
recode every single feature in render, so...!)
- Lens Flare is also not back... needs total revision, might become composit
effect though (using zbuffer for visibility)
- Part render is gone! (well, thats obvious, its default now).
- The render window is only restored with limited functionality... I am going
to check first the option to render to a Image window, so Blender can become
a true single-window application. :)
For example, the 'Spare render buffer' (jkey) doesnt work.
- Render with border, now default creates a smaller image
- No zbuffers are written yet... on the todo!
- Scons files and MSVC will need work to get compiling again
OK... thats what I can quickly recall. Now go compiling!
2006-01-23 23:05:47 +01:00
|
|
|
}
|
|
|
|
break;
|
2006-02-14 19:41:34 +01:00
|
|
|
case MA_RAMP_OVERLAY:
|
|
|
|
if(*r < 0.5f)
|
2006-02-17 16:44:46 +01:00
|
|
|
*r *= (facm + 2.0f*fac*col[0]);
|
2006-02-14 19:41:34 +01:00
|
|
|
else
|
2009-10-19 13:50:01 +02:00
|
|
|
*r = 1.0f - (facm + 2.0f*fac*(1.0f - col[0])) * (1.0f - *r);
|
2006-02-14 19:41:34 +01:00
|
|
|
if(g) {
|
|
|
|
if(*g < 0.5f)
|
2006-02-17 16:44:46 +01:00
|
|
|
*g *= (facm + 2.0f*fac*col[1]);
|
2006-02-14 19:41:34 +01:00
|
|
|
else
|
2009-10-19 13:50:01 +02:00
|
|
|
*g = 1.0f - (facm + 2.0f*fac*(1.0f - col[1])) * (1.0f - *g);
|
2006-02-14 19:41:34 +01:00
|
|
|
if(*b < 0.5f)
|
2006-02-17 16:44:46 +01:00
|
|
|
*b *= (facm + 2.0f*fac*col[2]);
|
2006-02-14 19:41:34 +01:00
|
|
|
else
|
2009-10-19 13:50:01 +02:00
|
|
|
*b = 1.0f - (facm + 2.0f*fac*(1.0f - col[2])) * (1.0f - *b);
|
2006-02-14 19:41:34 +01:00
|
|
|
}
|
|
|
|
break;
|
Giant commit!
A full detailed description of this will be done later... is several days
of work. Here's a summary:
Render:
- Full cleanup of render code, removing *all* globals and bad level calls
all over blender. Render module is now not called abusive anymore
- API-fied calls to rendering
- Full recode of internal render pipeline. Is now rendering tiles by
default, prepared for much smarter 'bucket' render later.
- Each thread now can render a full part
- Renders were tested with 4 threads, goes fine, apart from some lookup
tables in softshadow and AO still
- Rendering is prepared to do multiple layers and passes
- No single 32 bits trick in render code anymore, all 100% floats now.
Writing images/movies
- moved writing images to blender kernel (bye bye 'schrijfplaatje'!)
- made a new Movie handle system, also in kernel. This will enable much
easier use of movies in Blender
PreviewRender:
- Using new render API, previewrender (in buttons) now uses regular render
code to generate images.
- new datafile 'preview.blend.c' has the preview scenes in it
- previews get rendered in exact displayed size (1 pixel = 1 pixel)
3D Preview render
- new; press Pkey in 3d window, for a panel that continuously renders
(pkey is for games, i know... but we dont do that in orange now!)
- this render works nearly identical to buttons-preview render, so it stops
rendering on any event (mouse, keyboard, etc)
- on moving/scaling the panel, the render code doesn't recreate all geometry
- same for shifting/panning view
- all other operations (now) regenerate the full render database still.
- this is WIP... but big fun, especially for simple scenes!
Compositor
- Using same node system as now in use for shaders, you can composit images
- works pretty straightforward... needs much more options/tools and integration
with rendering still
- is not threaded yet, nor is so smart to only recalculate changes... will be
done soon!
- the "Render Result" node will get all layers/passes as output sockets
- The "Output" node renders to a builtin image, which you can view in the Image
window. (yes, output nodes to render-result, and to files, is on the list!)
The Bad News
- "Unified Render" is removed. It might come back in some stage, but this
system should be built from scratch. I can't really understand this code...
I expect it is not much needed, especially with advanced layer/passes
control
- Panorama render, Field render, Motion blur, is not coded yet... (I had to
recode every single feature in render, so...!)
- Lens Flare is also not back... needs total revision, might become composit
effect though (using zbuffer for visibility)
- Part render is gone! (well, thats obvious, its default now).
- The render window is only restored with limited functionality... I am going
to check first the option to render to a Image window, so Blender can become
a true single-window application. :)
For example, the 'Spare render buffer' (jkey) doesnt work.
- Render with border, now default creates a smaller image
- No zbuffers are written yet... on the todo!
- Scons files and MSVC will need work to get compiling again
OK... thats what I can quickly recall. Now go compiling!
2006-01-23 23:05:47 +01:00
|
|
|
case MA_RAMP_SUB:
|
|
|
|
*r -= fac*col[0];
|
|
|
|
if(g) {
|
|
|
|
*g -= fac*col[1];
|
|
|
|
*b -= fac*col[2];
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case MA_RAMP_DIV:
|
2009-10-19 13:50:01 +02:00
|
|
|
if(col[0]!=0.0f)
|
Giant commit!
A full detailed description of this will be done later... is several days
of work. Here's a summary:
Render:
- Full cleanup of render code, removing *all* globals and bad level calls
all over blender. Render module is now not called abusive anymore
- API-fied calls to rendering
- Full recode of internal render pipeline. Is now rendering tiles by
default, prepared for much smarter 'bucket' render later.
- Each thread now can render a full part
- Renders were tested with 4 threads, goes fine, apart from some lookup
tables in softshadow and AO still
- Rendering is prepared to do multiple layers and passes
- No single 32 bits trick in render code anymore, all 100% floats now.
Writing images/movies
- moved writing images to blender kernel (bye bye 'schrijfplaatje'!)
- made a new Movie handle system, also in kernel. This will enable much
easier use of movies in Blender
PreviewRender:
- Using new render API, previewrender (in buttons) now uses regular render
code to generate images.
- new datafile 'preview.blend.c' has the preview scenes in it
- previews get rendered in exact displayed size (1 pixel = 1 pixel)
3D Preview render
- new; press Pkey in 3d window, for a panel that continuously renders
(pkey is for games, i know... but we dont do that in orange now!)
- this render works nearly identical to buttons-preview render, so it stops
rendering on any event (mouse, keyboard, etc)
- on moving/scaling the panel, the render code doesn't recreate all geometry
- same for shifting/panning view
- all other operations (now) regenerate the full render database still.
- this is WIP... but big fun, especially for simple scenes!
Compositor
- Using same node system as now in use for shaders, you can composit images
- works pretty straightforward... needs much more options/tools and integration
with rendering still
- is not threaded yet, nor is so smart to only recalculate changes... will be
done soon!
- the "Render Result" node will get all layers/passes as output sockets
- The "Output" node renders to a builtin image, which you can view in the Image
window. (yes, output nodes to render-result, and to files, is on the list!)
The Bad News
- "Unified Render" is removed. It might come back in some stage, but this
system should be built from scratch. I can't really understand this code...
I expect it is not much needed, especially with advanced layer/passes
control
- Panorama render, Field render, Motion blur, is not coded yet... (I had to
recode every single feature in render, so...!)
- Lens Flare is also not back... needs total revision, might become composit
effect though (using zbuffer for visibility)
- Part render is gone! (well, thats obvious, its default now).
- The render window is only restored with limited functionality... I am going
to check first the option to render to a Image window, so Blender can become
a true single-window application. :)
For example, the 'Spare render buffer' (jkey) doesnt work.
- Render with border, now default creates a smaller image
- No zbuffers are written yet... on the todo!
- Scons files and MSVC will need work to get compiling again
OK... thats what I can quickly recall. Now go compiling!
2006-01-23 23:05:47 +01:00
|
|
|
*r = facm*(*r) + fac*(*r)/col[0];
|
|
|
|
if(g) {
|
2009-10-19 13:50:01 +02:00
|
|
|
if(col[1]!=0.0f)
|
Giant commit!
A full detailed description of this will be done later... is several days
of work. Here's a summary:
Render:
- Full cleanup of render code, removing *all* globals and bad level calls
all over blender. Render module is now not called abusive anymore
- API-fied calls to rendering
- Full recode of internal render pipeline. Is now rendering tiles by
default, prepared for much smarter 'bucket' render later.
- Each thread now can render a full part
- Renders were tested with 4 threads, goes fine, apart from some lookup
tables in softshadow and AO still
- Rendering is prepared to do multiple layers and passes
- No single 32 bits trick in render code anymore, all 100% floats now.
Writing images/movies
- moved writing images to blender kernel (bye bye 'schrijfplaatje'!)
- made a new Movie handle system, also in kernel. This will enable much
easier use of movies in Blender
PreviewRender:
- Using new render API, previewrender (in buttons) now uses regular render
code to generate images.
- new datafile 'preview.blend.c' has the preview scenes in it
- previews get rendered in exact displayed size (1 pixel = 1 pixel)
3D Preview render
- new; press Pkey in 3d window, for a panel that continuously renders
(pkey is for games, i know... but we dont do that in orange now!)
- this render works nearly identical to buttons-preview render, so it stops
rendering on any event (mouse, keyboard, etc)
- on moving/scaling the panel, the render code doesn't recreate all geometry
- same for shifting/panning view
- all other operations (now) regenerate the full render database still.
- this is WIP... but big fun, especially for simple scenes!
Compositor
- Using same node system as now in use for shaders, you can composit images
- works pretty straightforward... needs much more options/tools and integration
with rendering still
- is not threaded yet, nor is so smart to only recalculate changes... will be
done soon!
- the "Render Result" node will get all layers/passes as output sockets
- The "Output" node renders to a builtin image, which you can view in the Image
window. (yes, output nodes to render-result, and to files, is on the list!)
The Bad News
- "Unified Render" is removed. It might come back in some stage, but this
system should be built from scratch. I can't really understand this code...
I expect it is not much needed, especially with advanced layer/passes
control
- Panorama render, Field render, Motion blur, is not coded yet... (I had to
recode every single feature in render, so...!)
- Lens Flare is also not back... needs total revision, might become composit
effect though (using zbuffer for visibility)
- Part render is gone! (well, thats obvious, its default now).
- The render window is only restored with limited functionality... I am going
to check first the option to render to a Image window, so Blender can become
a true single-window application. :)
For example, the 'Spare render buffer' (jkey) doesnt work.
- Render with border, now default creates a smaller image
- No zbuffers are written yet... on the todo!
- Scons files and MSVC will need work to get compiling again
OK... thats what I can quickly recall. Now go compiling!
2006-01-23 23:05:47 +01:00
|
|
|
*g = facm*(*g) + fac*(*g)/col[1];
|
2009-10-19 13:50:01 +02:00
|
|
|
if(col[2]!=0.0f)
|
Giant commit!
A full detailed description of this will be done later... is several days
of work. Here's a summary:
Render:
- Full cleanup of render code, removing *all* globals and bad level calls
all over blender. Render module is now not called abusive anymore
- API-fied calls to rendering
- Full recode of internal render pipeline. Is now rendering tiles by
default, prepared for much smarter 'bucket' render later.
- Each thread now can render a full part
- Renders were tested with 4 threads, goes fine, apart from some lookup
tables in softshadow and AO still
- Rendering is prepared to do multiple layers and passes
- No single 32 bits trick in render code anymore, all 100% floats now.
Writing images/movies
- moved writing images to blender kernel (bye bye 'schrijfplaatje'!)
- made a new Movie handle system, also in kernel. This will enable much
easier use of movies in Blender
PreviewRender:
- Using new render API, previewrender (in buttons) now uses regular render
code to generate images.
- new datafile 'preview.blend.c' has the preview scenes in it
- previews get rendered in exact displayed size (1 pixel = 1 pixel)
3D Preview render
- new; press Pkey in 3d window, for a panel that continuously renders
(pkey is for games, i know... but we dont do that in orange now!)
- this render works nearly identical to buttons-preview render, so it stops
rendering on any event (mouse, keyboard, etc)
- on moving/scaling the panel, the render code doesn't recreate all geometry
- same for shifting/panning view
- all other operations (now) regenerate the full render database still.
- this is WIP... but big fun, especially for simple scenes!
Compositor
- Using same node system as now in use for shaders, you can composit images
- works pretty straightforward... needs much more options/tools and integration
with rendering still
- is not threaded yet, nor is so smart to only recalculate changes... will be
done soon!
- the "Render Result" node will get all layers/passes as output sockets
- The "Output" node renders to a builtin image, which you can view in the Image
window. (yes, output nodes to render-result, and to files, is on the list!)
The Bad News
- "Unified Render" is removed. It might come back in some stage, but this
system should be built from scratch. I can't really understand this code...
I expect it is not much needed, especially with advanced layer/passes
control
- Panorama render, Field render, Motion blur, is not coded yet... (I had to
recode every single feature in render, so...!)
- Lens Flare is also not back... needs total revision, might become composit
effect though (using zbuffer for visibility)
- Part render is gone! (well, thats obvious, its default now).
- The render window is only restored with limited functionality... I am going
to check first the option to render to a Image window, so Blender can become
a true single-window application. :)
For example, the 'Spare render buffer' (jkey) doesnt work.
- Render with border, now default creates a smaller image
- No zbuffers are written yet... on the todo!
- Scons files and MSVC will need work to get compiling again
OK... thats what I can quickly recall. Now go compiling!
2006-01-23 23:05:47 +01:00
|
|
|
*b = facm*(*b) + fac*(*b)/col[2];
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case MA_RAMP_DIFF:
|
|
|
|
*r = facm*(*r) + fac*fabs(*r-col[0]);
|
|
|
|
if(g) {
|
|
|
|
*g = facm*(*g) + fac*fabs(*g-col[1]);
|
|
|
|
*b = facm*(*b) + fac*fabs(*b-col[2]);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case MA_RAMP_DARK:
|
2010-03-22 10:30:00 +01:00
|
|
|
tmp=col[0]+((1-col[0])*facm);
|
|
|
|
if(tmp < *r) *r= tmp;
|
|
|
|
if(g) {
|
|
|
|
tmp=col[1]+((1-col[1])*facm);
|
|
|
|
if(tmp < *g) *g= tmp;
|
|
|
|
tmp=col[2]+((1-col[2])*facm);
|
|
|
|
if(tmp < *b) *b= tmp;
|
|
|
|
}
|
|
|
|
break;
|
Giant commit!
A full detailed description of this will be done later... is several days
of work. Here's a summary:
Render:
- Full cleanup of render code, removing *all* globals and bad level calls
all over blender. Render module is now not called abusive anymore
- API-fied calls to rendering
- Full recode of internal render pipeline. Is now rendering tiles by
default, prepared for much smarter 'bucket' render later.
- Each thread now can render a full part
- Renders were tested with 4 threads, goes fine, apart from some lookup
tables in softshadow and AO still
- Rendering is prepared to do multiple layers and passes
- No single 32 bits trick in render code anymore, all 100% floats now.
Writing images/movies
- moved writing images to blender kernel (bye bye 'schrijfplaatje'!)
- made a new Movie handle system, also in kernel. This will enable much
easier use of movies in Blender
PreviewRender:
- Using new render API, previewrender (in buttons) now uses regular render
code to generate images.
- new datafile 'preview.blend.c' has the preview scenes in it
- previews get rendered in exact displayed size (1 pixel = 1 pixel)
3D Preview render
- new; press Pkey in 3d window, for a panel that continuously renders
(pkey is for games, i know... but we dont do that in orange now!)
- this render works nearly identical to buttons-preview render, so it stops
rendering on any event (mouse, keyboard, etc)
- on moving/scaling the panel, the render code doesn't recreate all geometry
- same for shifting/panning view
- all other operations (now) regenerate the full render database still.
- this is WIP... but big fun, especially for simple scenes!
Compositor
- Using same node system as now in use for shaders, you can composit images
- works pretty straightforward... needs much more options/tools and integration
with rendering still
- is not threaded yet, nor is so smart to only recalculate changes... will be
done soon!
- the "Render Result" node will get all layers/passes as output sockets
- The "Output" node renders to a builtin image, which you can view in the Image
window. (yes, output nodes to render-result, and to files, is on the list!)
The Bad News
- "Unified Render" is removed. It might come back in some stage, but this
system should be built from scratch. I can't really understand this code...
I expect it is not much needed, especially with advanced layer/passes
control
- Panorama render, Field render, Motion blur, is not coded yet... (I had to
recode every single feature in render, so...!)
- Lens Flare is also not back... needs total revision, might become composit
effect though (using zbuffer for visibility)
- Part render is gone! (well, thats obvious, its default now).
- The render window is only restored with limited functionality... I am going
to check first the option to render to a Image window, so Blender can become
a true single-window application. :)
For example, the 'Spare render buffer' (jkey) doesnt work.
- Render with border, now default creates a smaller image
- No zbuffers are written yet... on the todo!
- Scons files and MSVC will need work to get compiling again
OK... thats what I can quickly recall. Now go compiling!
2006-01-23 23:05:47 +01:00
|
|
|
case MA_RAMP_LIGHT:
|
|
|
|
tmp= fac*col[0];
|
|
|
|
if(tmp > *r) *r= tmp;
|
|
|
|
if(g) {
|
|
|
|
tmp= fac*col[1];
|
|
|
|
if(tmp > *g) *g= tmp;
|
|
|
|
tmp= fac*col[2];
|
|
|
|
if(tmp > *b) *b= tmp;
|
|
|
|
}
|
2006-06-03 15:26:39 +02:00
|
|
|
break;
|
2006-06-05 11:55:39 +02:00
|
|
|
case MA_RAMP_DODGE:
|
|
|
|
|
2006-06-03 15:26:39 +02:00
|
|
|
|
2009-10-19 13:50:01 +02:00
|
|
|
if(*r !=0.0f){
|
|
|
|
tmp = 1.0f - fac*col[0];
|
|
|
|
if(tmp <= 0.0f)
|
|
|
|
*r = 1.0f;
|
|
|
|
else if ((tmp = (*r) / tmp)> 1.0f)
|
|
|
|
*r = 1.0f;
|
2006-06-05 11:55:39 +02:00
|
|
|
else
|
|
|
|
*r = tmp;
|
|
|
|
}
|
|
|
|
if(g) {
|
2009-10-19 13:50:01 +02:00
|
|
|
if(*g !=0.0f){
|
|
|
|
tmp = 1.0f - fac*col[1];
|
|
|
|
if(tmp <= 0.0f )
|
|
|
|
*g = 1.0f;
|
|
|
|
else if ((tmp = (*g) / tmp) > 1.0f )
|
|
|
|
*g = 1.0f;
|
2006-06-05 11:55:39 +02:00
|
|
|
else
|
|
|
|
*g = tmp;
|
|
|
|
}
|
2009-10-19 13:50:01 +02:00
|
|
|
if(*b !=0.0f){
|
|
|
|
tmp = 1.0f - fac*col[2];
|
|
|
|
if(tmp <= 0.0f)
|
|
|
|
*b = 1.0f;
|
|
|
|
else if ((tmp = (*b) / tmp) > 1.0f )
|
|
|
|
*b = 1.0f;
|
2006-06-05 11:55:39 +02:00
|
|
|
else
|
|
|
|
*b = tmp;
|
|
|
|
}
|
|
|
|
|
2006-06-03 15:26:39 +02:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
case MA_RAMP_BURN:
|
|
|
|
|
|
|
|
tmp = facm + fac*col[0];
|
|
|
|
|
2009-10-19 13:50:01 +02:00
|
|
|
if(tmp <= 0.0f)
|
|
|
|
*r = 0.0f;
|
|
|
|
else if (( tmp = (1.0f - (1.0f - (*r)) / tmp )) < 0.0f)
|
2010-03-22 10:30:00 +01:00
|
|
|
*r = 0.0f;
|
2009-10-19 13:50:01 +02:00
|
|
|
else if (tmp > 1.0f)
|
|
|
|
*r=1.0f;
|
2006-06-05 11:55:39 +02:00
|
|
|
else
|
|
|
|
*r = tmp;
|
|
|
|
|
2006-06-03 15:26:39 +02:00
|
|
|
if(g) {
|
|
|
|
tmp = facm + fac*col[1];
|
2009-10-19 13:50:01 +02:00
|
|
|
if(tmp <= 0.0f)
|
|
|
|
*g = 0.0f;
|
|
|
|
else if (( tmp = (1.0f - (1.0f - (*g)) / tmp )) < 0.0f )
|
2010-03-22 10:30:00 +01:00
|
|
|
*g = 0.0f;
|
2009-10-19 13:50:01 +02:00
|
|
|
else if(tmp >1.0f)
|
|
|
|
*g=1.0f;
|
2006-06-05 11:55:39 +02:00
|
|
|
else
|
|
|
|
*g = tmp;
|
2006-06-03 15:26:39 +02:00
|
|
|
|
2010-03-22 10:30:00 +01:00
|
|
|
tmp = facm + fac*col[2];
|
|
|
|
if(tmp <= 0.0f)
|
2009-10-19 13:50:01 +02:00
|
|
|
*b = 0.0f;
|
|
|
|
else if (( tmp = (1.0f - (1.0f - (*b)) / tmp )) < 0.0f )
|
2010-03-22 10:30:00 +01:00
|
|
|
*b = 0.0f;
|
2009-10-19 13:50:01 +02:00
|
|
|
else if(tmp >1.0f)
|
|
|
|
*b= 1.0f;
|
2006-06-05 11:55:39 +02:00
|
|
|
else
|
|
|
|
*b = tmp;
|
2006-06-03 15:26:39 +02:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
case MA_RAMP_HUE:
|
|
|
|
if(g){
|
|
|
|
float rH,rS,rV;
|
2006-06-05 11:55:39 +02:00
|
|
|
float colH,colS,colV;
|
2006-06-03 15:26:39 +02:00
|
|
|
float tmpr,tmpg,tmpb;
|
|
|
|
rgb_to_hsv(col[0],col[1],col[2],&colH,&colS,&colV);
|
2006-06-05 11:55:39 +02:00
|
|
|
if(colS!=0 ){
|
|
|
|
rgb_to_hsv(*r,*g,*b,&rH,&rS,&rV);
|
|
|
|
hsv_to_rgb( colH , rS, rV, &tmpr, &tmpg, &tmpb);
|
|
|
|
*r = facm*(*r) + fac*tmpr;
|
|
|
|
*g = facm*(*g) + fac*tmpg;
|
|
|
|
*b = facm*(*b) + fac*tmpb;
|
|
|
|
}
|
2006-06-03 15:26:39 +02:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
case MA_RAMP_SAT:
|
|
|
|
if(g){
|
|
|
|
float rH,rS,rV;
|
|
|
|
float colH,colS,colV;
|
|
|
|
rgb_to_hsv(*r,*g,*b,&rH,&rS,&rV);
|
2006-06-05 11:55:39 +02:00
|
|
|
if(rS!=0){
|
|
|
|
rgb_to_hsv(col[0],col[1],col[2],&colH,&colS,&colV);
|
|
|
|
hsv_to_rgb( rH, (facm*rS +fac*colS), rV, r, g, b);
|
|
|
|
}
|
2006-06-03 15:26:39 +02:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
case MA_RAMP_VAL:
|
|
|
|
if(g){
|
|
|
|
float rH,rS,rV;
|
|
|
|
float colH,colS,colV;
|
|
|
|
rgb_to_hsv(*r,*g,*b,&rH,&rS,&rV);
|
|
|
|
rgb_to_hsv(col[0],col[1],col[2],&colH,&colS,&colV);
|
|
|
|
hsv_to_rgb( rH, rS, (facm*rV +fac*colV), r, g, b);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case MA_RAMP_COLOR:
|
|
|
|
if(g){
|
|
|
|
float rH,rS,rV;
|
|
|
|
float colH,colS,colV;
|
|
|
|
float tmpr,tmpg,tmpb;
|
|
|
|
rgb_to_hsv(col[0],col[1],col[2],&colH,&colS,&colV);
|
2006-06-05 11:55:39 +02:00
|
|
|
if(colS!=0){
|
|
|
|
rgb_to_hsv(*r,*g,*b,&rH,&rS,&rV);
|
|
|
|
hsv_to_rgb( colH, colS, rV, &tmpr, &tmpg, &tmpb);
|
|
|
|
*r = facm*(*r) + fac*tmpr;
|
|
|
|
*g = facm*(*g) + fac*tmpg;
|
|
|
|
*b = facm*(*b) + fac*tmpb;
|
|
|
|
}
|
2006-06-03 15:26:39 +02:00
|
|
|
}
|
|
|
|
break;
|
2010-03-22 10:30:00 +01:00
|
|
|
case MA_RAMP_SOFT:
|
|
|
|
if (g){
|
|
|
|
float scr, scg, scb;
|
2009-09-10 05:00:50 +02:00
|
|
|
|
2010-03-22 10:30:00 +01:00
|
|
|
/* first calculate non-fac based Screen mix */
|
|
|
|
scr = 1.0f - (1.0f - col[0]) * (1.0f - *r);
|
|
|
|
scg = 1.0f - (1.0f - col[1]) * (1.0f - *g);
|
|
|
|
scb = 1.0f - (1.0f - col[2]) * (1.0f - *b);
|
2009-09-10 05:00:50 +02:00
|
|
|
|
2010-03-22 10:30:00 +01:00
|
|
|
*r = facm*(*r) + fac*(((1.0f - *r) * col[0] * (*r)) + (*r * scr));
|
|
|
|
*g = facm*(*g) + fac*(((1.0f - *g) * col[1] * (*g)) + (*g * scg));
|
|
|
|
*b = facm*(*b) + fac*(((1.0f - *b) * col[2] * (*b)) + (*b * scb));
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case MA_RAMP_LINEAR:
|
|
|
|
if (col[0] > 0.5f)
|
|
|
|
*r = *r + fac*(2.0f*(col[0]-0.5f));
|
|
|
|
else
|
|
|
|
*r = *r + fac*(2.0f*(col[0]) - 1.0f);
|
|
|
|
if (g){
|
|
|
|
if (col[1] > 0.5f)
|
|
|
|
*g = *g + fac*(2.0f*(col[1]-0.5f));
|
|
|
|
else
|
|
|
|
*g = *g + fac*(2.0f*(col[1]) -1.0f);
|
|
|
|
if (col[2] > 0.5f)
|
|
|
|
*b = *b + fac*(2.0f*(col[2]-0.5f));
|
|
|
|
else
|
|
|
|
*b = *b + fac*(2.0f*(col[2]) - 1.0f);
|
|
|
|
}
|
|
|
|
break;
|
2009-09-10 05:00:50 +02:00
|
|
|
}
|
Giant commit!
A full detailed description of this will be done later... is several days
of work. Here's a summary:
Render:
- Full cleanup of render code, removing *all* globals and bad level calls
all over blender. Render module is now not called abusive anymore
- API-fied calls to rendering
- Full recode of internal render pipeline. Is now rendering tiles by
default, prepared for much smarter 'bucket' render later.
- Each thread now can render a full part
- Renders were tested with 4 threads, goes fine, apart from some lookup
tables in softshadow and AO still
- Rendering is prepared to do multiple layers and passes
- No single 32 bits trick in render code anymore, all 100% floats now.
Writing images/movies
- moved writing images to blender kernel (bye bye 'schrijfplaatje'!)
- made a new Movie handle system, also in kernel. This will enable much
easier use of movies in Blender
PreviewRender:
- Using new render API, previewrender (in buttons) now uses regular render
code to generate images.
- new datafile 'preview.blend.c' has the preview scenes in it
- previews get rendered in exact displayed size (1 pixel = 1 pixel)
3D Preview render
- new; press Pkey in 3d window, for a panel that continuously renders
(pkey is for games, i know... but we dont do that in orange now!)
- this render works nearly identical to buttons-preview render, so it stops
rendering on any event (mouse, keyboard, etc)
- on moving/scaling the panel, the render code doesn't recreate all geometry
- same for shifting/panning view
- all other operations (now) regenerate the full render database still.
- this is WIP... but big fun, especially for simple scenes!
Compositor
- Using same node system as now in use for shaders, you can composit images
- works pretty straightforward... needs much more options/tools and integration
with rendering still
- is not threaded yet, nor is so smart to only recalculate changes... will be
done soon!
- the "Render Result" node will get all layers/passes as output sockets
- The "Output" node renders to a builtin image, which you can view in the Image
window. (yes, output nodes to render-result, and to files, is on the list!)
The Bad News
- "Unified Render" is removed. It might come back in some stage, but this
system should be built from scratch. I can't really understand this code...
I expect it is not much needed, especially with advanced layer/passes
control
- Panorama render, Field render, Motion blur, is not coded yet... (I had to
recode every single feature in render, so...!)
- Lens Flare is also not back... needs total revision, might become composit
effect though (using zbuffer for visibility)
- Part render is gone! (well, thats obvious, its default now).
- The render window is only restored with limited functionality... I am going
to check first the option to render to a Image window, so Blender can become
a true single-window application. :)
For example, the 'Spare render buffer' (jkey) doesnt work.
- Render with border, now default creates a smaller image
- No zbuffers are written yet... on the todo!
- Scons files and MSVC will need work to get compiling again
OK... thats what I can quickly recall. Now go compiling!
2006-01-23 23:05:47 +01:00
|
|
|
}
|
|
|
|
|
2010-01-28 18:31:11 +01:00
|
|
|
/* copy/paste buffer, if we had a propper py api that would be better */
|
|
|
|
Material matcopybuf;
|
|
|
|
static short matcopied=0;
|
Giant commit!
A full detailed description of this will be done later... is several days
of work. Here's a summary:
Render:
- Full cleanup of render code, removing *all* globals and bad level calls
all over blender. Render module is now not called abusive anymore
- API-fied calls to rendering
- Full recode of internal render pipeline. Is now rendering tiles by
default, prepared for much smarter 'bucket' render later.
- Each thread now can render a full part
- Renders were tested with 4 threads, goes fine, apart from some lookup
tables in softshadow and AO still
- Rendering is prepared to do multiple layers and passes
- No single 32 bits trick in render code anymore, all 100% floats now.
Writing images/movies
- moved writing images to blender kernel (bye bye 'schrijfplaatje'!)
- made a new Movie handle system, also in kernel. This will enable much
easier use of movies in Blender
PreviewRender:
- Using new render API, previewrender (in buttons) now uses regular render
code to generate images.
- new datafile 'preview.blend.c' has the preview scenes in it
- previews get rendered in exact displayed size (1 pixel = 1 pixel)
3D Preview render
- new; press Pkey in 3d window, for a panel that continuously renders
(pkey is for games, i know... but we dont do that in orange now!)
- this render works nearly identical to buttons-preview render, so it stops
rendering on any event (mouse, keyboard, etc)
- on moving/scaling the panel, the render code doesn't recreate all geometry
- same for shifting/panning view
- all other operations (now) regenerate the full render database still.
- this is WIP... but big fun, especially for simple scenes!
Compositor
- Using same node system as now in use for shaders, you can composit images
- works pretty straightforward... needs much more options/tools and integration
with rendering still
- is not threaded yet, nor is so smart to only recalculate changes... will be
done soon!
- the "Render Result" node will get all layers/passes as output sockets
- The "Output" node renders to a builtin image, which you can view in the Image
window. (yes, output nodes to render-result, and to files, is on the list!)
The Bad News
- "Unified Render" is removed. It might come back in some stage, but this
system should be built from scratch. I can't really understand this code...
I expect it is not much needed, especially with advanced layer/passes
control
- Panorama render, Field render, Motion blur, is not coded yet... (I had to
recode every single feature in render, so...!)
- Lens Flare is also not back... needs total revision, might become composit
effect though (using zbuffer for visibility)
- Part render is gone! (well, thats obvious, its default now).
- The render window is only restored with limited functionality... I am going
to check first the option to render to a Image window, so Blender can become
a true single-window application. :)
For example, the 'Spare render buffer' (jkey) doesnt work.
- Render with border, now default creates a smaller image
- No zbuffers are written yet... on the todo!
- Scons files and MSVC will need work to get compiling again
OK... thats what I can quickly recall. Now go compiling!
2006-01-23 23:05:47 +01:00
|
|
|
|
2010-01-28 18:31:11 +01:00
|
|
|
void clear_matcopybuf(void)
|
|
|
|
{
|
|
|
|
memset(&matcopybuf, 0, sizeof(Material));
|
2010-03-09 10:17:45 +01:00
|
|
|
matcopied= 0;
|
2010-01-28 18:31:11 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void free_matcopybuf(void)
|
|
|
|
{
|
|
|
|
int a;
|
|
|
|
|
|
|
|
for(a=0; a<MAX_MTEX; a++) {
|
|
|
|
if(matcopybuf.mtex[a]) {
|
|
|
|
MEM_freeN(matcopybuf.mtex[a]);
|
|
|
|
matcopybuf.mtex[a]= NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if(matcopybuf.ramp_col) MEM_freeN(matcopybuf.ramp_col);
|
|
|
|
if(matcopybuf.ramp_spec) MEM_freeN(matcopybuf.ramp_spec);
|
|
|
|
|
|
|
|
matcopybuf.ramp_col= NULL;
|
|
|
|
matcopybuf.ramp_spec= NULL;
|
|
|
|
|
|
|
|
if(matcopybuf.nodetree) {
|
|
|
|
ntreeFreeTree(matcopybuf.nodetree);
|
|
|
|
MEM_freeN(matcopybuf.nodetree);
|
|
|
|
matcopybuf.nodetree= NULL;
|
|
|
|
}
|
2010-03-09 10:17:45 +01:00
|
|
|
|
|
|
|
matcopied= 0;
|
2010-01-28 18:31:11 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void copy_matcopybuf(Material *ma)
|
|
|
|
{
|
|
|
|
int a;
|
|
|
|
MTex *mtex;
|
|
|
|
|
|
|
|
if(matcopied)
|
|
|
|
free_matcopybuf();
|
|
|
|
|
|
|
|
memcpy(&matcopybuf, ma, sizeof(Material));
|
|
|
|
if(matcopybuf.ramp_col) matcopybuf.ramp_col= MEM_dupallocN(matcopybuf.ramp_col);
|
|
|
|
if(matcopybuf.ramp_spec) matcopybuf.ramp_spec= MEM_dupallocN(matcopybuf.ramp_spec);
|
|
|
|
|
|
|
|
for(a=0; a<MAX_MTEX; a++) {
|
|
|
|
mtex= matcopybuf.mtex[a];
|
|
|
|
if(mtex) {
|
|
|
|
matcopybuf.mtex[a]= MEM_dupallocN(mtex);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
matcopybuf.nodetree= ntreeCopyTree(ma->nodetree, 0);
|
|
|
|
matcopybuf.preview= NULL;
|
|
|
|
matcopybuf.gpumaterial.first= matcopybuf.gpumaterial.last= NULL;
|
|
|
|
matcopied= 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
void paste_matcopybuf(Material *ma)
|
|
|
|
{
|
|
|
|
int a;
|
|
|
|
MTex *mtex;
|
|
|
|
ID id;
|
|
|
|
|
|
|
|
if(matcopied==0)
|
|
|
|
return;
|
|
|
|
/* free current mat */
|
|
|
|
if(ma->ramp_col) MEM_freeN(ma->ramp_col);
|
|
|
|
if(ma->ramp_spec) MEM_freeN(ma->ramp_spec);
|
|
|
|
for(a=0; a<MAX_MTEX; a++) {
|
|
|
|
mtex= ma->mtex[a];
|
|
|
|
if(mtex && mtex->tex) mtex->tex->id.us--;
|
|
|
|
if(mtex) MEM_freeN(mtex);
|
|
|
|
}
|
|
|
|
|
|
|
|
if(ma->nodetree) {
|
|
|
|
ntreeFreeTree(ma->nodetree);
|
|
|
|
MEM_freeN(ma->nodetree);
|
|
|
|
}
|
|
|
|
|
2010-12-03 13:30:59 +01:00
|
|
|
GPU_material_free(ma);
|
2010-01-28 18:31:11 +01:00
|
|
|
|
|
|
|
id= (ma->id);
|
|
|
|
memcpy(ma, &matcopybuf, sizeof(Material));
|
|
|
|
(ma->id)= id;
|
|
|
|
|
|
|
|
if(matcopybuf.ramp_col) ma->ramp_col= MEM_dupallocN(matcopybuf.ramp_col);
|
|
|
|
if(matcopybuf.ramp_spec) ma->ramp_spec= MEM_dupallocN(matcopybuf.ramp_spec);
|
|
|
|
|
|
|
|
for(a=0; a<MAX_MTEX; a++) {
|
|
|
|
mtex= ma->mtex[a];
|
|
|
|
if(mtex) {
|
|
|
|
ma->mtex[a]= MEM_dupallocN(mtex);
|
|
|
|
if(mtex->tex) id_us_plus((ID *)mtex->tex);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
ma->nodetree= ntreeCopyTree(matcopybuf.nodetree, 0);
|
|
|
|
}
|