2010-04-15 10:28:32 +00:00
|
|
|
/* image.c
|
2002-10-12 11:37:38 +00:00
|
|
|
*
|
|
|
|
* $Id$
|
|
|
|
*
|
2006-12-20 17:57:56 +00:00
|
|
|
* ***** BEGIN GPL LICENSE BLOCK *****
|
2002-10-12 11:37:38 +00: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
|
2006-12-20 17:57:56 +00:00
|
|
|
* of the License, or (at your option) any later version.
|
2002-10-12 11:37:38 +00: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 13:34:04 +00:00
|
|
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
2002-10-12 11:37:38 +00:00
|
|
|
*
|
|
|
|
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
|
|
|
* All rights reserved.
|
|
|
|
*
|
2009-01-04 14:14:06 +00:00
|
|
|
* Contributor(s): Blender Foundation, 2006, full recode
|
2002-10-12 11:37:38 +00:00
|
|
|
*
|
2006-12-20 17:57:56 +00:00
|
|
|
* ***** END GPL LICENSE BLOCK *****
|
2002-10-12 11:37:38 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <fcntl.h>
|
|
|
|
#include <math.h>
|
|
|
|
#ifndef WIN32
|
|
|
|
#include <unistd.h>
|
|
|
|
#else
|
|
|
|
#include <io.h>
|
|
|
|
#endif
|
|
|
|
|
3D view orbit option: Around Active
This fixes the active object in place when orbiting the view.
Choppy 15fps demo can be seen there: http://www.elysiun.com/~theeth/bf/around_active.html
Image Memory Grabage Collection
This adds memory handling to the image code. An image is tagged each time it is used.
During a collection cycle (frequency of cycles is user defined), if an image is older
than a user defined limit, its buffer gets deallocated. This also applies to gl memory buffers.
Images that are loading in GL memory needs to go through two time outs before being fully deallocated: the first time out deallocated the gl memorry, the second the buffer in ram.
Notes:
Image buffer loaded from python gets tagged as permanent upon load. That tag is removed when python stops using the image.
I might have missed some tagging spots, especially in the rendering pipeline. Someone with more knowledge about this code should check to be careful.
Tagging is done on every access, for rendering, this will probably be a performance hit. A scheme should be developped to only tag when the rendering is completed.
Collecting is called in draw_object, most likely not the best place to do it.
Safe from undo, since using undo deallocates memory anyway (like when loading a blend file with one currently opened)
Userpref DNA changes:
I've changed a couple of flagging variables from short to int. Some because they needed more space, others to keep SDNA happy.
Info window changes:
I've grouped a couple of buttons in aligned blocks and changed the color of mutually exclusive options to make them clearer.
Matt didn't do any changes on that in tuhopuu, so hopefully I'm not stepping on anyone's feet with this.
Also changed double constants into floats with f in a couple of places (mostly space.c) to make compiler happier.
2005-07-06 00:33:41 +00:00
|
|
|
#include <time.h>
|
|
|
|
|
2009-09-06 13:20:05 +00:00
|
|
|
#ifdef _WIN32
|
|
|
|
#define open _open
|
|
|
|
#define close _close
|
|
|
|
#endif
|
|
|
|
|
2002-10-12 11:37:38 +00:00
|
|
|
#include "MEM_guardedalloc.h"
|
|
|
|
|
|
|
|
#include "IMB_imbuf_types.h"
|
|
|
|
#include "IMB_imbuf.h"
|
2006-12-21 01:16:25 +00:00
|
|
|
|
|
|
|
#ifdef WITH_OPENEXR
|
2006-12-20 17:57:56 +00:00
|
|
|
#include "intern/openexr/openexr_multi.h"
|
2006-12-21 01:16:25 +00:00
|
|
|
#endif
|
2002-10-12 11:37:38 +00:00
|
|
|
|
|
|
|
#include "DNA_packedFile_types.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 22:05:47 +00:00
|
|
|
#include "DNA_scene_types.h"
|
2007-10-20 16:17:27 +00:00
|
|
|
#include "DNA_camera_types.h"
|
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 20:51:28 +00:00
|
|
|
#include "DNA_sequence_types.h"
|
3D view orbit option: Around Active
This fixes the active object in place when orbiting the view.
Choppy 15fps demo can be seen there: http://www.elysiun.com/~theeth/bf/around_active.html
Image Memory Grabage Collection
This adds memory handling to the image code. An image is tagged each time it is used.
During a collection cycle (frequency of cycles is user defined), if an image is older
than a user defined limit, its buffer gets deallocated. This also applies to gl memory buffers.
Images that are loading in GL memory needs to go through two time outs before being fully deallocated: the first time out deallocated the gl memorry, the second the buffer in ram.
Notes:
Image buffer loaded from python gets tagged as permanent upon load. That tag is removed when python stops using the image.
I might have missed some tagging spots, especially in the rendering pipeline. Someone with more knowledge about this code should check to be careful.
Tagging is done on every access, for rendering, this will probably be a performance hit. A scheme should be developped to only tag when the rendering is completed.
Collecting is called in draw_object, most likely not the best place to do it.
Safe from undo, since using undo deallocates memory anyway (like when loading a blend file with one currently opened)
Userpref DNA changes:
I've changed a couple of flagging variables from short to int. Some because they needed more space, others to keep SDNA happy.
Info window changes:
I've grouped a couple of buttons in aligned blocks and changed the color of mutually exclusive options to make them clearer.
Matt didn't do any changes on that in tuhopuu, so hopefully I'm not stepping on anyone's feet with this.
Also changed double constants into floats with f in a couple of places (mostly space.c) to make compiler happier.
2005-07-06 00:33:41 +00:00
|
|
|
#include "DNA_userdef_types.h"
|
2002-10-12 11:37:38 +00:00
|
|
|
|
2006-12-20 17:57:56 +00:00
|
|
|
#include "BLI_blenlib.h"
|
|
|
|
#include "BLI_threads.h"
|
2002-10-12 11:37:38 +00:00
|
|
|
|
Biiig commit! Thanks to 2-3 weeks of cvs freeze...
Render:
- New; support for dual CPU render (SDL thread)
Currently only works with alternating scanlines, but gives excellent
performance. For both normal render as unified implemented.
Note the "mutex" locks on z-transp buffer render and imbuf loads.
- This has been made possible by major cleanups in render code, especially
getting rid of globals (example Tin Tr Tg Tb Ta for textures) or struct
OSA or using Materials or Texture data to write to.
- Made normal render fully 4x32 floats too, and removed all old optimizes
with chars or shorts.
- Made normal render and unified render use same code for sky and halo
render, giving equal (and better) results for halo render. Old render
now also uses PostProcess options (brightness, mul, gamma)
- Added option ("FBuf") in F10 Output Panel, this keeps a 4x32 bits buffer
after render. Using PostProcess menu you will note an immediate re-
display of image too (32 bits RGBA)
- Added "Hue" and "Saturation" sliders to PostProcess options
- Render module is still not having a "nice" API, but amount of dependencies
went down a lot. Next todo: remove abusive "previewrender" code.
The last main global in Render (struct Render) now can be re-used for fully
controlling a render, to allow multiple "instances" of render to open.
- Renderwindow now displays a smal bar on top with the stats, and keeps the
stats after render too. Including "spare" page support.
Not only easier visible that way, but also to remove the awkward code that
was drawing stats in the Info header (extreme slow on some ATIs too)
- Cleaned up blendef.h and BKE_utildefines.h, these two had overlapping
defines.
- I might have forgotten stuff... and will write a nice doc on the architecture!
2004-12-27 19:28:52 +00:00
|
|
|
#include "BKE_bmfont.h"
|
2002-10-12 11:37:38 +00:00
|
|
|
#include "BKE_global.h"
|
2005-12-21 22:21:43 +00:00
|
|
|
#include "BKE_icons.h"
|
2002-10-12 11:37:38 +00:00
|
|
|
#include "BKE_image.h"
|
2006-12-20 17:57:56 +00:00
|
|
|
#include "BKE_library.h"
|
|
|
|
#include "BKE_main.h"
|
|
|
|
#include "BKE_packedFile.h"
|
Biiig commit! Thanks to 2-3 weeks of cvs freeze...
Render:
- New; support for dual CPU render (SDL thread)
Currently only works with alternating scanlines, but gives excellent
performance. For both normal render as unified implemented.
Note the "mutex" locks on z-transp buffer render and imbuf loads.
- This has been made possible by major cleanups in render code, especially
getting rid of globals (example Tin Tr Tg Tb Ta for textures) or struct
OSA or using Materials or Texture data to write to.
- Made normal render fully 4x32 floats too, and removed all old optimizes
with chars or shorts.
- Made normal render and unified render use same code for sky and halo
render, giving equal (and better) results for halo render. Old render
now also uses PostProcess options (brightness, mul, gamma)
- Added option ("FBuf") in F10 Output Panel, this keeps a 4x32 bits buffer
after render. Using PostProcess menu you will note an immediate re-
display of image too (32 bits RGBA)
- Added "Hue" and "Saturation" sliders to PostProcess options
- Render module is still not having a "nice" API, but amount of dependencies
went down a lot. Next todo: remove abusive "previewrender" code.
The last main global in Render (struct Render) now can be re-used for fully
controlling a render, to allow multiple "instances" of render to open.
- Renderwindow now displays a smal bar on top with the stats, and keeps the
stats after render too. Including "spare" page support.
Not only easier visible that way, but also to remove the awkward code that
was drawing stats in the Info header (extreme slow on some ATIs too)
- Cleaned up blendef.h and BKE_utildefines.h, these two had overlapping
defines.
- I might have forgotten stuff... and will write a nice doc on the architecture!
2004-12-27 19:28:52 +00:00
|
|
|
#include "BKE_scene.h"
|
2002-10-12 11:37:38 +00:00
|
|
|
|
2008-01-01 18:16:10 +00:00
|
|
|
//XXX #include "BIF_editseq.h"
|
2007-11-08 13:02:59 +00:00
|
|
|
|
2009-08-18 19:26:53 +00:00
|
|
|
#include "BLF_api.h"
|
|
|
|
|
2005-07-27 07:43:48 +00:00
|
|
|
#include "PIL_time.h"
|
|
|
|
|
2006-12-20 17:57:56 +00:00
|
|
|
#include "RE_pipeline.h"
|
|
|
|
|
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 20:51:28 +00:00
|
|
|
#include "GPU_draw.h"
|
|
|
|
|
2008-08-17 17:12:10 +00:00
|
|
|
#include "BLO_sys_types.h" // for intptr_t support
|
|
|
|
|
2006-12-20 17:57:56 +00:00
|
|
|
/* max int, to indicate we don't store sequences in ibuf */
|
|
|
|
#define IMA_NO_INDEX 0x7FEFEFEF
|
|
|
|
|
|
|
|
/* quick lookup: supports 1 million frames, thousand passes */
|
|
|
|
#define IMA_MAKE_INDEX(frame, index) ((frame)<<10)+index
|
|
|
|
#define IMA_INDEX_FRAME(index) (index>>10)
|
2009-01-27 19:32:44 +00:00
|
|
|
#define IMA_INDEX_PASS(index) (index & ~1023)
|
2006-12-20 17:57:56 +00:00
|
|
|
|
|
|
|
/* ******** IMAGE PROCESSING ************* */
|
|
|
|
|
2007-12-01 22:00:09 +00:00
|
|
|
/* used by sequencer and image premul option - IMA_DO_PREMUL */
|
2006-12-20 17:57:56 +00:00
|
|
|
void converttopremul(struct ImBuf *ibuf)
|
2002-10-12 11:37:38 +00:00
|
|
|
{
|
== Sequencer ==
Attention! Rather large sequencer rewrite:
* Implemented layer blending using implicit effects. (works like layers
in "The Gimp" or Photoshop.)
* Fixed Space-Bar start-stop in preview windows.
You can start playback using spacebar within a preview-window and it _works_!
* Fixed Flip Y (didn't work for float)
* Fixed premul (didn't work for float)
* Added IPOs to _all_ tracks. In blend-mode REPLACE it drives the
"mul"-parameter in all other blend modes it drives the effect.
* you can meta single tracks.
* moved "mute track" from "M" to "Shift-M"
* added "Shift-L" for "lock track"
* changed inner workings for Metas. Now all ImBufs have to use the
reference counting mechanism. (Only interesting for coders :)
!!! Really important change, that affects current files!
Since you can mute tracks and now there is real layer blending capabilities
in place, I changed the silly behaviour that chose the output track.
Old behaviour: if we have an effect track visible, use the uppermost effect
track. If there is _no_ effect track visible, use the lowest input track.
New behaviour: always use the uppermost track. With blend modes active:
work our way down starting from the uppermost track to the first
"replace"-mode track. This is the way the gimp, photoshop, basically _all_
other applications work...
So if this change ruins your day: please try to fix your files using
"mute". If this doesn't work out, I can still restore the old behaviour,
but I really hope, that this is _not_ necessary!
Rational: most people won't get affected by this change, since you can't
really do anything usefull with the (old) sequencer without at least one
effect track and then you are on the safe side...
2008-01-01 11:44:42 +00:00
|
|
|
int x, y;
|
2006-12-20 17:57:56 +00:00
|
|
|
|
|
|
|
if(ibuf==0) return;
|
== Sequencer ==
Attention! Rather large sequencer rewrite:
* Implemented layer blending using implicit effects. (works like layers
in "The Gimp" or Photoshop.)
* Fixed Space-Bar start-stop in preview windows.
You can start playback using spacebar within a preview-window and it _works_!
* Fixed Flip Y (didn't work for float)
* Fixed premul (didn't work for float)
* Added IPOs to _all_ tracks. In blend-mode REPLACE it drives the
"mul"-parameter in all other blend modes it drives the effect.
* you can meta single tracks.
* moved "mute track" from "M" to "Shift-M"
* added "Shift-L" for "lock track"
* changed inner workings for Metas. Now all ImBufs have to use the
reference counting mechanism. (Only interesting for coders :)
!!! Really important change, that affects current files!
Since you can mute tracks and now there is real layer blending capabilities
in place, I changed the silly behaviour that chose the output track.
Old behaviour: if we have an effect track visible, use the uppermost effect
track. If there is _no_ effect track visible, use the lowest input track.
New behaviour: always use the uppermost track. With blend modes active:
work our way down starting from the uppermost track to the first
"replace"-mode track. This is the way the gimp, photoshop, basically _all_
other applications work...
So if this change ruins your day: please try to fix your files using
"mute". If this doesn't work out, I can still restore the old behaviour,
but I really hope, that this is _not_ necessary!
Rational: most people won't get affected by this change, since you can't
really do anything usefull with the (old) sequencer without at least one
effect track and then you are on the safe side...
2008-01-01 11:44:42 +00:00
|
|
|
if (ibuf->rect) {
|
|
|
|
int val;
|
|
|
|
char *cp;
|
|
|
|
if(ibuf->depth==24) { /* put alpha at 255 */
|
|
|
|
cp= (char *)(ibuf->rect);
|
|
|
|
for(y=0; y<ibuf->y; y++) {
|
|
|
|
for(x=0; x<ibuf->x; x++, cp+=4) {
|
|
|
|
cp[3]= 255;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
cp= (char *)(ibuf->rect);
|
|
|
|
for(y=0; y<ibuf->y; y++) {
|
|
|
|
for(x=0; x<ibuf->x; x++, cp+=4) {
|
|
|
|
val= cp[3];
|
|
|
|
cp[0]= (cp[0]*val)>>8;
|
|
|
|
cp[1]= (cp[1]*val)>>8;
|
|
|
|
cp[2]= (cp[2]*val)>>8;
|
|
|
|
}
|
2006-12-20 17:57:56 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
== Sequencer ==
Attention! Rather large sequencer rewrite:
* Implemented layer blending using implicit effects. (works like layers
in "The Gimp" or Photoshop.)
* Fixed Space-Bar start-stop in preview windows.
You can start playback using spacebar within a preview-window and it _works_!
* Fixed Flip Y (didn't work for float)
* Fixed premul (didn't work for float)
* Added IPOs to _all_ tracks. In blend-mode REPLACE it drives the
"mul"-parameter in all other blend modes it drives the effect.
* you can meta single tracks.
* moved "mute track" from "M" to "Shift-M"
* added "Shift-L" for "lock track"
* changed inner workings for Metas. Now all ImBufs have to use the
reference counting mechanism. (Only interesting for coders :)
!!! Really important change, that affects current files!
Since you can mute tracks and now there is real layer blending capabilities
in place, I changed the silly behaviour that chose the output track.
Old behaviour: if we have an effect track visible, use the uppermost effect
track. If there is _no_ effect track visible, use the lowest input track.
New behaviour: always use the uppermost track. With blend modes active:
work our way down starting from the uppermost track to the first
"replace"-mode track. This is the way the gimp, photoshop, basically _all_
other applications work...
So if this change ruins your day: please try to fix your files using
"mute". If this doesn't work out, I can still restore the old behaviour,
but I really hope, that this is _not_ necessary!
Rational: most people won't get affected by this change, since you can't
really do anything usefull with the (old) sequencer without at least one
effect track and then you are on the safe side...
2008-01-01 11:44:42 +00:00
|
|
|
if (ibuf->rect_float) {
|
|
|
|
float val;
|
|
|
|
float *cp;
|
|
|
|
if(ibuf->depth==24) { /* put alpha at 1.0 */
|
|
|
|
cp= ibuf->rect_float;;
|
|
|
|
for(y=0; y<ibuf->y; y++) {
|
|
|
|
for(x=0; x<ibuf->x; x++, cp+=4) {
|
|
|
|
cp[3]= 1.0;
|
|
|
|
}
|
2006-12-20 17:57:56 +00:00
|
|
|
}
|
== Sequencer ==
Attention! Rather large sequencer rewrite:
* Implemented layer blending using implicit effects. (works like layers
in "The Gimp" or Photoshop.)
* Fixed Space-Bar start-stop in preview windows.
You can start playback using spacebar within a preview-window and it _works_!
* Fixed Flip Y (didn't work for float)
* Fixed premul (didn't work for float)
* Added IPOs to _all_ tracks. In blend-mode REPLACE it drives the
"mul"-parameter in all other blend modes it drives the effect.
* you can meta single tracks.
* moved "mute track" from "M" to "Shift-M"
* added "Shift-L" for "lock track"
* changed inner workings for Metas. Now all ImBufs have to use the
reference counting mechanism. (Only interesting for coders :)
!!! Really important change, that affects current files!
Since you can mute tracks and now there is real layer blending capabilities
in place, I changed the silly behaviour that chose the output track.
Old behaviour: if we have an effect track visible, use the uppermost effect
track. If there is _no_ effect track visible, use the lowest input track.
New behaviour: always use the uppermost track. With blend modes active:
work our way down starting from the uppermost track to the first
"replace"-mode track. This is the way the gimp, photoshop, basically _all_
other applications work...
So if this change ruins your day: please try to fix your files using
"mute". If this doesn't work out, I can still restore the old behaviour,
but I really hope, that this is _not_ necessary!
Rational: most people won't get affected by this change, since you can't
really do anything usefull with the (old) sequencer without at least one
effect track and then you are on the safe side...
2008-01-01 11:44:42 +00:00
|
|
|
} else {
|
|
|
|
cp= ibuf->rect_float;
|
|
|
|
for(y=0; y<ibuf->y; y++) {
|
|
|
|
for(x=0; x<ibuf->x; x++, cp+=4) {
|
|
|
|
val= cp[3];
|
|
|
|
cp[0]= cp[0]*val;
|
|
|
|
cp[1]= cp[1]*val;
|
|
|
|
cp[2]= cp[2]*val;
|
|
|
|
}
|
2006-12-20 17:57:56 +00:00
|
|
|
}
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
|
|
|
}
|
2006-12-20 17:57:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void de_interlace_ng(struct ImBuf *ibuf) /* neogeo fields */
|
|
|
|
{
|
|
|
|
struct ImBuf * tbuf1, * tbuf2;
|
2002-10-12 11:37:38 +00:00
|
|
|
|
2006-12-20 17:57:56 +00:00
|
|
|
if (ibuf == 0) return;
|
|
|
|
if (ibuf->flags & IB_fields) return;
|
|
|
|
ibuf->flags |= IB_fields;
|
|
|
|
|
|
|
|
if (ibuf->rect) {
|
|
|
|
/* make copies */
|
|
|
|
tbuf1 = IMB_allocImBuf(ibuf->x, (short)(ibuf->y >> 1), (unsigned char)32, (int)IB_rect, (unsigned char)0);
|
|
|
|
tbuf2 = IMB_allocImBuf(ibuf->x, (short)(ibuf->y >> 1), (unsigned char)32, (int)IB_rect, (unsigned char)0);
|
|
|
|
|
|
|
|
ibuf->x *= 2;
|
|
|
|
|
|
|
|
IMB_rectcpy(tbuf1, ibuf, 0, 0, 0, 0, ibuf->x, ibuf->y);
|
|
|
|
IMB_rectcpy(tbuf2, ibuf, 0, 0, tbuf2->x, 0, ibuf->x, ibuf->y);
|
|
|
|
|
|
|
|
ibuf->x /= 2;
|
|
|
|
IMB_rectcpy(ibuf, tbuf1, 0, 0, 0, 0, tbuf1->x, tbuf1->y);
|
|
|
|
IMB_rectcpy(ibuf, tbuf2, 0, tbuf2->y, 0, 0, tbuf2->x, tbuf2->y);
|
|
|
|
|
|
|
|
IMB_freeImBuf(tbuf1);
|
|
|
|
IMB_freeImBuf(tbuf2);
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
2006-12-20 17:57:56 +00:00
|
|
|
ibuf->y /= 2;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void de_interlace_st(struct ImBuf *ibuf) /* standard fields */
|
|
|
|
{
|
|
|
|
struct ImBuf * tbuf1, * tbuf2;
|
2002-10-12 11:37:38 +00:00
|
|
|
|
2006-12-20 17:57:56 +00:00
|
|
|
if (ibuf == 0) return;
|
|
|
|
if (ibuf->flags & IB_fields) return;
|
|
|
|
ibuf->flags |= IB_fields;
|
|
|
|
|
|
|
|
if (ibuf->rect) {
|
|
|
|
/* make copies */
|
|
|
|
tbuf1 = IMB_allocImBuf(ibuf->x, (short)(ibuf->y >> 1), (unsigned char)32, IB_rect, 0);
|
|
|
|
tbuf2 = IMB_allocImBuf(ibuf->x, (short)(ibuf->y >> 1), (unsigned char)32, IB_rect, 0);
|
|
|
|
|
|
|
|
ibuf->x *= 2;
|
|
|
|
|
|
|
|
IMB_rectcpy(tbuf1, ibuf, 0, 0, 0, 0, ibuf->x, ibuf->y);
|
|
|
|
IMB_rectcpy(tbuf2, ibuf, 0, 0, tbuf2->x, 0, ibuf->x, ibuf->y);
|
|
|
|
|
|
|
|
ibuf->x /= 2;
|
|
|
|
IMB_rectcpy(ibuf, tbuf2, 0, 0, 0, 0, tbuf2->x, tbuf2->y);
|
|
|
|
IMB_rectcpy(ibuf, tbuf1, 0, tbuf2->y, 0, 0, tbuf1->x, tbuf1->y);
|
|
|
|
|
|
|
|
IMB_freeImBuf(tbuf1);
|
|
|
|
IMB_freeImBuf(tbuf2);
|
|
|
|
}
|
|
|
|
ibuf->y /= 2;
|
|
|
|
}
|
|
|
|
|
|
|
|
void image_de_interlace(Image *ima, int odd)
|
|
|
|
{
|
|
|
|
ImBuf *ibuf= BKE_image_get_ibuf(ima, NULL);
|
|
|
|
if(ibuf) {
|
|
|
|
if(odd)
|
|
|
|
de_interlace_st(ibuf);
|
|
|
|
else
|
|
|
|
de_interlace_ng(ibuf);
|
|
|
|
}
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
|
|
|
|
2006-12-20 17:57:56 +00:00
|
|
|
/* ***************** ALLOC & FREE, DATA MANAGING *************** */
|
|
|
|
|
|
|
|
static void image_free_buffers(Image *ima)
|
2006-06-05 11:07:15 +00:00
|
|
|
{
|
2006-12-20 17:57:56 +00:00
|
|
|
ImBuf *ibuf;
|
|
|
|
|
|
|
|
while((ibuf = ima->ibufs.first)) {
|
|
|
|
BLI_remlink(&ima->ibufs, ibuf);
|
|
|
|
|
|
|
|
if (ibuf->userdata) {
|
|
|
|
MEM_freeN(ibuf->userdata);
|
|
|
|
ibuf->userdata = NULL;
|
|
|
|
}
|
|
|
|
IMB_freeImBuf(ibuf);
|
|
|
|
}
|
|
|
|
|
|
|
|
if(ima->anim) IMB_free_anim(ima->anim);
|
|
|
|
ima->anim= NULL;
|
2010-03-27 15:35:34 +00:00
|
|
|
|
2006-12-20 17:57:56 +00:00
|
|
|
if(ima->rr) {
|
|
|
|
RE_FreeRenderResult(ima->rr);
|
|
|
|
ima->rr= NULL;
|
|
|
|
}
|
|
|
|
|
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 20:51:28 +00:00
|
|
|
GPU_free_image(ima);
|
2006-12-20 17:57:56 +00:00
|
|
|
|
|
|
|
ima->ok= IMA_OK;
|
2006-06-05 11:07:15 +00:00
|
|
|
}
|
2002-10-12 11:37:38 +00:00
|
|
|
|
2006-12-20 17:57:56 +00:00
|
|
|
/* called by library too, do not free ima itself */
|
2002-10-12 11:37:38 +00:00
|
|
|
void free_image(Image *ima)
|
|
|
|
{
|
2010-03-27 15:35:34 +00:00
|
|
|
int a;
|
|
|
|
|
2006-12-20 17:57:56 +00:00
|
|
|
image_free_buffers(ima);
|
2002-10-12 11:37:38 +00:00
|
|
|
if (ima->packedfile) {
|
|
|
|
freePackedFile(ima->packedfile);
|
|
|
|
ima->packedfile = NULL;
|
|
|
|
}
|
2005-12-21 23:39:20 +00:00
|
|
|
BKE_icon_delete(&ima->id);
|
2005-12-21 22:21:43 +00:00
|
|
|
ima->id.icon_id = 0;
|
2007-09-02 17:25:03 +00:00
|
|
|
if (ima->preview) {
|
|
|
|
BKE_previewimg_free(&ima->preview);
|
|
|
|
}
|
2010-03-27 15:35:34 +00:00
|
|
|
for(a=0; a<IMA_MAX_RENDER_SLOT; a++) {
|
|
|
|
if(ima->renders[a]) {
|
|
|
|
RE_FreeRenderResult(ima->renders[a]);
|
|
|
|
ima->renders[a]= NULL;
|
|
|
|
}
|
2009-07-10 16:55:49 +00:00
|
|
|
}
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
|
|
|
|
2006-12-20 17:57:56 +00:00
|
|
|
/* only image block itself */
|
|
|
|
static Image *image_alloc(const char *name, short source, short type)
|
|
|
|
{
|
|
|
|
Image *ima;
|
|
|
|
|
|
|
|
ima= alloc_libblock(&G.main->image, ID_IM, name);
|
|
|
|
if(ima) {
|
|
|
|
ima->ok= IMA_OK;
|
|
|
|
|
|
|
|
ima->xrep= ima->yrep= 1;
|
2007-09-22 17:54:13 +00:00
|
|
|
ima->aspx= ima->aspy= 1.0;
|
2009-09-16 19:27:08 +00:00
|
|
|
ima->gen_x= 1024; ima->gen_y= 1024;
|
2006-12-20 17:57:56 +00:00
|
|
|
ima->gen_type= 1; /* no defines yet? */
|
|
|
|
|
|
|
|
ima->source= source;
|
|
|
|
ima->type= type;
|
|
|
|
}
|
|
|
|
return ima;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* get the ibuf from an image cache, local use here only */
|
|
|
|
static ImBuf *image_get_ibuf(Image *ima, int index, int frame)
|
|
|
|
{
|
2008-04-28 20:57:03 +00:00
|
|
|
/* this function is intended to be thread safe. with IMA_NO_INDEX this
|
|
|
|
* should be OK, but when iterating over the list this is more tricky
|
|
|
|
* */
|
2006-12-20 17:57:56 +00:00
|
|
|
if(index==IMA_NO_INDEX)
|
|
|
|
return ima->ibufs.first;
|
|
|
|
else {
|
|
|
|
ImBuf *ibuf;
|
2008-04-28 20:57:03 +00:00
|
|
|
|
2006-12-20 17:57:56 +00:00
|
|
|
index= IMA_MAKE_INDEX(frame, index);
|
|
|
|
for(ibuf= ima->ibufs.first; ibuf; ibuf= ibuf->next)
|
|
|
|
if(ibuf->index==index)
|
|
|
|
return ibuf;
|
2008-04-28 20:57:03 +00:00
|
|
|
|
2006-12-20 17:57:56 +00:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* no ima->ibuf anymore, but listbase */
|
|
|
|
static void image_remove_ibuf(Image *ima, ImBuf *ibuf)
|
|
|
|
{
|
|
|
|
if(ibuf) {
|
|
|
|
BLI_remlink(&ima->ibufs, ibuf);
|
|
|
|
IMB_freeImBuf(ibuf);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* no ima->ibuf anymore, but listbase */
|
|
|
|
static void image_assign_ibuf(Image *ima, ImBuf *ibuf, int index, int frame)
|
|
|
|
{
|
|
|
|
if(ibuf) {
|
|
|
|
ImBuf *link;
|
|
|
|
|
|
|
|
if(index!=IMA_NO_INDEX)
|
|
|
|
index= IMA_MAKE_INDEX(frame, index);
|
|
|
|
|
|
|
|
/* insert based on index */
|
|
|
|
for(link= ima->ibufs.first; link; link= link->next)
|
|
|
|
if(link->index>=index)
|
|
|
|
break;
|
2008-04-28 20:57:03 +00:00
|
|
|
|
|
|
|
ibuf->index= index;
|
|
|
|
|
2006-12-20 17:57:56 +00:00
|
|
|
/* this function accepts link==NULL */
|
|
|
|
BLI_insertlinkbefore(&ima->ibufs, link, ibuf);
|
2008-04-28 20:57:03 +00:00
|
|
|
|
|
|
|
/* now we don't want copies? */
|
|
|
|
if(link && ibuf->index==link->index)
|
|
|
|
image_remove_ibuf(ima, link);
|
2006-12-20 17:57:56 +00:00
|
|
|
}
|
|
|
|
}
|
2002-10-12 11:37:38 +00:00
|
|
|
|
2009-01-27 19:32:44 +00:00
|
|
|
/* empty image block, of similar type and filename */
|
|
|
|
Image *BKE_image_copy(Image *ima)
|
|
|
|
{
|
|
|
|
Image *new= image_alloc(ima->id.name+2, ima->source, ima->type);
|
|
|
|
|
|
|
|
BLI_strncpy(new->name, ima->name, sizeof(ima->name));
|
|
|
|
|
|
|
|
new->gen_x= ima->gen_x;
|
|
|
|
new->gen_y= ima->gen_y;
|
|
|
|
new->gen_type= ima->gen_type;
|
|
|
|
|
|
|
|
return new;
|
|
|
|
}
|
|
|
|
|
|
|
|
void BKE_image_merge(Image *dest, Image *source)
|
|
|
|
{
|
|
|
|
ImBuf *ibuf;
|
|
|
|
|
2009-02-25 09:54:41 +00:00
|
|
|
/* sanity check */
|
|
|
|
if(dest && source && dest!=source) {
|
2009-01-27 19:32:44 +00:00
|
|
|
|
2009-02-25 09:54:41 +00:00
|
|
|
while((ibuf= source->ibufs.first)) {
|
|
|
|
BLI_remlink(&source->ibufs, ibuf);
|
|
|
|
image_assign_ibuf(dest, ibuf, IMA_INDEX_PASS(ibuf->index), IMA_INDEX_FRAME(ibuf->index));
|
|
|
|
}
|
|
|
|
|
|
|
|
free_libblock(&G.main->image, source);
|
|
|
|
}
|
2009-01-27 19:32:44 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2006-12-20 17:57:56 +00:00
|
|
|
/* checks if image was already loaded, then returns same image */
|
|
|
|
/* otherwise creates new. */
|
|
|
|
/* does not load ibuf itself */
|
2009-01-04 14:14:06 +00:00
|
|
|
/* pass on optional frame for #name images */
|
|
|
|
Image *BKE_add_image_file(const char *name, int frame)
|
2002-10-12 11:37:38 +00:00
|
|
|
{
|
|
|
|
Image *ima;
|
|
|
|
int file, len;
|
2006-12-20 17:57:56 +00:00
|
|
|
const char *libname;
|
|
|
|
char str[FILE_MAX], strtest[FILE_MAX];
|
2002-10-12 11:37:38 +00:00
|
|
|
|
2007-03-29 12:42:30 +00:00
|
|
|
/* escape when name is directory */
|
|
|
|
len= strlen(name);
|
|
|
|
if(len) {
|
|
|
|
if(name[len-1]=='/' || name[len-1]=='\\')
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2006-12-20 17:57:56 +00:00
|
|
|
BLI_strncpy(str, name, sizeof(str));
|
2010-03-09 17:36:23 +00:00
|
|
|
BLI_path_abs(str, G.sce);
|
2002-10-12 11:37:38 +00:00
|
|
|
|
2007-03-29 12:42:30 +00:00
|
|
|
/* exists? */
|
2002-10-12 11:37:38 +00:00
|
|
|
file= open(str, O_BINARY|O_RDONLY);
|
2007-03-29 12:42:30 +00:00
|
|
|
if(file== -1) return NULL;
|
2002-10-12 11:37:38 +00:00
|
|
|
close(file);
|
|
|
|
|
2003-04-26 11:56:44 +00:00
|
|
|
/* first search an identical image */
|
2006-12-20 17:57:56 +00:00
|
|
|
for(ima= G.main->image.first; ima; ima= ima->id.next) {
|
2007-11-10 19:56:06 +00:00
|
|
|
if(ima->source!=IMA_SRC_VIEWER && ima->source!=IMA_SRC_GENERATED) {
|
2006-12-20 17:57:56 +00:00
|
|
|
BLI_strncpy(strtest, ima->name, sizeof(ima->name));
|
2010-03-09 17:36:23 +00:00
|
|
|
BLI_path_abs(strtest, G.sce);
|
2006-12-20 17:57:56 +00:00
|
|
|
|
|
|
|
if( strcmp(strtest, str)==0 ) {
|
|
|
|
if(ima->anim==NULL || ima->id.us==0) {
|
|
|
|
BLI_strncpy(ima->name, name, sizeof(ima->name)); /* for stringcode */
|
|
|
|
ima->id.us++; /* officially should not, it doesn't link here! */
|
|
|
|
if(ima->ok==0)
|
|
|
|
ima->ok= IMA_OK;
|
|
|
|
/* RETURN! */
|
|
|
|
return ima;
|
|
|
|
}
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2006-12-20 17:57:56 +00:00
|
|
|
/* add new image */
|
|
|
|
|
|
|
|
/* create a short library name */
|
2002-10-12 11:37:38 +00:00
|
|
|
len= strlen(name);
|
|
|
|
|
|
|
|
while (len > 0 && name[len - 1] != '/' && name[len - 1] != '\\') len--;
|
|
|
|
libname= name+len;
|
|
|
|
|
2006-12-20 17:57:56 +00:00
|
|
|
ima= image_alloc(libname, IMA_SRC_FILE, IMA_TYPE_IMAGE);
|
|
|
|
BLI_strncpy(ima->name, name, sizeof(ima->name));
|
2002-10-12 11:37:38 +00:00
|
|
|
|
2006-12-20 17:57:56 +00:00
|
|
|
/* do a wild guess! */
|
|
|
|
if(BLI_testextensie(name, ".avi") || BLI_testextensie(name, ".mov")
|
|
|
|
|| BLI_testextensie(name, ".mpg") || BLI_testextensie(name, ".mp4"))
|
|
|
|
ima->source= IMA_SRC_MOVIE;
|
2002-10-12 11:37:38 +00:00
|
|
|
|
|
|
|
return ima;
|
|
|
|
}
|
|
|
|
|
2007-12-29 05:17:19 +00:00
|
|
|
static ImBuf *add_ibuf_size(int width, int height, char *name, int floatbuf, short uvtestgrid, float color[4])
|
2005-09-16 20:17:09 +00:00
|
|
|
{
|
2006-12-20 17:57:56 +00:00
|
|
|
ImBuf *ibuf;
|
2008-01-06 16:04:48 +00:00
|
|
|
unsigned char *rect= NULL;
|
|
|
|
float *rect_float= NULL;
|
2006-11-01 12:54:29 +00:00
|
|
|
|
2007-12-29 05:17:19 +00:00
|
|
|
if (floatbuf) {
|
|
|
|
ibuf= IMB_allocImBuf(width, height, 24, IB_rectfloat, 0);
|
|
|
|
rect_float= (float*)ibuf->rect_float;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
ibuf= IMB_allocImBuf(width, height, 24, IB_rect, 0);
|
|
|
|
rect= (unsigned char*)ibuf->rect;
|
|
|
|
}
|
|
|
|
|
2009-02-18 18:08:33 +00:00
|
|
|
strcpy(ibuf->name, "//Untitled");
|
2006-12-20 17:57:56 +00:00
|
|
|
ibuf->userflags |= IB_BITMAPDIRTY;
|
|
|
|
|
2010-03-22 09:30:00 +00:00
|
|
|
switch(uvtestgrid) {
|
|
|
|
case 1:
|
|
|
|
BKE_image_buf_fill_checker(rect, rect_float, width, height);
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
BKE_image_buf_fill_checker_color(rect, rect_float, width, height);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
BKE_image_buf_fill_color(rect, rect_float, width, height, color);
|
|
|
|
}
|
2008-01-06 16:04:48 +00:00
|
|
|
|
2006-12-20 17:57:56 +00:00
|
|
|
return ibuf;
|
|
|
|
}
|
2005-09-16 20:17:09 +00:00
|
|
|
|
2006-12-20 17:57:56 +00:00
|
|
|
/* adds new image block, creates ImBuf and initializes color */
|
2007-12-29 05:17:19 +00:00
|
|
|
Image *BKE_add_image_size(int width, int height, char *name, int floatbuf, short uvtestgrid, float color[4])
|
2006-12-20 17:57:56 +00:00
|
|
|
{
|
|
|
|
/* on save, type is changed to FILE in editsima.c */
|
2010-03-08 20:08:04 +00:00
|
|
|
Image *ima= image_alloc(name, IMA_SRC_GENERATED, IMA_TYPE_UV_TEST);
|
2006-12-20 17:57:56 +00:00
|
|
|
|
|
|
|
if (ima) {
|
|
|
|
ImBuf *ibuf;
|
|
|
|
|
|
|
|
BLI_strncpy(ima->name, name, FILE_MAX);
|
|
|
|
ima->gen_x= width;
|
|
|
|
ima->gen_y= height;
|
|
|
|
ima->gen_type= uvtestgrid;
|
|
|
|
|
2007-12-29 05:17:19 +00:00
|
|
|
ibuf= add_ibuf_size(width, height, name, floatbuf, uvtestgrid, color);
|
2006-12-20 17:57:56 +00:00
|
|
|
image_assign_ibuf(ima, ibuf, IMA_NO_INDEX, 0);
|
|
|
|
|
|
|
|
ima->ok= IMA_OK_LOADED;
|
2005-09-16 20:17:09 +00:00
|
|
|
}
|
|
|
|
|
2010-03-08 20:08:04 +00:00
|
|
|
return ima;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* creates an image image owns the imbuf passed */
|
|
|
|
Image *BKE_add_image_imbuf(ImBuf *ibuf)
|
|
|
|
{
|
|
|
|
/* on save, type is changed to FILE in editsima.c */
|
2010-03-08 21:33:51 +00:00
|
|
|
Image *ima;
|
2010-03-08 20:08:04 +00:00
|
|
|
char filename[sizeof(ibuf->name)];
|
2010-03-08 21:33:51 +00:00
|
|
|
|
2010-03-08 20:08:04 +00:00
|
|
|
BLI_split_dirfile(ibuf->name, NULL, filename);
|
2010-03-08 21:33:51 +00:00
|
|
|
ima= image_alloc(filename, IMA_SRC_FILE, IMA_TYPE_IMAGE);
|
2010-03-08 20:08:04 +00:00
|
|
|
|
|
|
|
if (ima) {
|
|
|
|
BLI_strncpy(ima->name, ibuf->name, FILE_MAX);
|
|
|
|
image_assign_ibuf(ima, ibuf, IMA_NO_INDEX, 0);
|
|
|
|
ima->ok= IMA_OK_LOADED;
|
|
|
|
}
|
|
|
|
|
2005-09-16 20:17:09 +00:00
|
|
|
return ima;
|
|
|
|
}
|
|
|
|
|
2006-12-20 17:57:56 +00:00
|
|
|
/* packs rect from memory as PNG */
|
|
|
|
void BKE_image_memorypack(Image *ima)
|
|
|
|
{
|
|
|
|
ImBuf *ibuf= image_get_ibuf(ima, IMA_NO_INDEX, 0);
|
|
|
|
|
|
|
|
if(ibuf==NULL)
|
|
|
|
return;
|
|
|
|
if (ima->packedfile) {
|
|
|
|
freePackedFile(ima->packedfile);
|
|
|
|
ima->packedfile = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
ibuf->ftype= PNG;
|
|
|
|
ibuf->depth= 32;
|
|
|
|
|
|
|
|
IMB_saveiff(ibuf, ibuf->name, IB_rect | IB_mem);
|
|
|
|
if(ibuf->encodedbuffer==NULL) {
|
|
|
|
printf("memory save for pack error\n");
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
PackedFile *pf = MEM_callocN(sizeof(*pf), "PackedFile");
|
|
|
|
|
|
|
|
pf->data = ibuf->encodedbuffer;
|
|
|
|
pf->size = ibuf->encodedsize;
|
|
|
|
ima->packedfile= pf;
|
|
|
|
ibuf->encodedbuffer= NULL;
|
|
|
|
ibuf->encodedsize= 0;
|
|
|
|
ibuf->userflags &= ~IB_BITMAPDIRTY;
|
|
|
|
|
2006-12-21 13:39:02 +00:00
|
|
|
if(ima->source==IMA_SRC_GENERATED) {
|
2006-12-20 17:57:56 +00:00
|
|
|
ima->source= IMA_SRC_FILE;
|
2006-12-21 13:39:02 +00:00
|
|
|
ima->type= IMA_TYPE_IMAGE;
|
|
|
|
}
|
2006-12-20 17:57:56 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
3D view orbit option: Around Active
This fixes the active object in place when orbiting the view.
Choppy 15fps demo can be seen there: http://www.elysiun.com/~theeth/bf/around_active.html
Image Memory Grabage Collection
This adds memory handling to the image code. An image is tagged each time it is used.
During a collection cycle (frequency of cycles is user defined), if an image is older
than a user defined limit, its buffer gets deallocated. This also applies to gl memory buffers.
Images that are loading in GL memory needs to go through two time outs before being fully deallocated: the first time out deallocated the gl memorry, the second the buffer in ram.
Notes:
Image buffer loaded from python gets tagged as permanent upon load. That tag is removed when python stops using the image.
I might have missed some tagging spots, especially in the rendering pipeline. Someone with more knowledge about this code should check to be careful.
Tagging is done on every access, for rendering, this will probably be a performance hit. A scheme should be developped to only tag when the rendering is completed.
Collecting is called in draw_object, most likely not the best place to do it.
Safe from undo, since using undo deallocates memory anyway (like when loading a blend file with one currently opened)
Userpref DNA changes:
I've changed a couple of flagging variables from short to int. Some because they needed more space, others to keep SDNA happy.
Info window changes:
I've grouped a couple of buttons in aligned blocks and changed the color of mutually exclusive options to make them clearer.
Matt didn't do any changes on that in tuhopuu, so hopefully I'm not stepping on anyone's feet with this.
Also changed double constants into floats with f in a couple of places (mostly space.c) to make compiler happier.
2005-07-06 00:33:41 +00:00
|
|
|
void tag_image_time(Image *ima)
|
|
|
|
{
|
|
|
|
if (ima)
|
2005-07-27 07:43:48 +00:00
|
|
|
ima->lastused = (int)PIL_check_seconds_timer();
|
3D view orbit option: Around Active
This fixes the active object in place when orbiting the view.
Choppy 15fps demo can be seen there: http://www.elysiun.com/~theeth/bf/around_active.html
Image Memory Grabage Collection
This adds memory handling to the image code. An image is tagged each time it is used.
During a collection cycle (frequency of cycles is user defined), if an image is older
than a user defined limit, its buffer gets deallocated. This also applies to gl memory buffers.
Images that are loading in GL memory needs to go through two time outs before being fully deallocated: the first time out deallocated the gl memorry, the second the buffer in ram.
Notes:
Image buffer loaded from python gets tagged as permanent upon load. That tag is removed when python stops using the image.
I might have missed some tagging spots, especially in the rendering pipeline. Someone with more knowledge about this code should check to be careful.
Tagging is done on every access, for rendering, this will probably be a performance hit. A scheme should be developped to only tag when the rendering is completed.
Collecting is called in draw_object, most likely not the best place to do it.
Safe from undo, since using undo deallocates memory anyway (like when loading a blend file with one currently opened)
Userpref DNA changes:
I've changed a couple of flagging variables from short to int. Some because they needed more space, others to keep SDNA happy.
Info window changes:
I've grouped a couple of buttons in aligned blocks and changed the color of mutually exclusive options to make them clearer.
Matt didn't do any changes on that in tuhopuu, so hopefully I'm not stepping on anyone's feet with this.
Also changed double constants into floats with f in a couple of places (mostly space.c) to make compiler happier.
2005-07-06 00:33:41 +00:00
|
|
|
}
|
|
|
|
|
2008-12-26 14:19:25 +00:00
|
|
|
#if 0
|
2008-09-29 17:08:11 +00:00
|
|
|
static void tag_all_images_time()
|
2006-12-20 17:57:56 +00:00
|
|
|
{
|
3D view orbit option: Around Active
This fixes the active object in place when orbiting the view.
Choppy 15fps demo can be seen there: http://www.elysiun.com/~theeth/bf/around_active.html
Image Memory Grabage Collection
This adds memory handling to the image code. An image is tagged each time it is used.
During a collection cycle (frequency of cycles is user defined), if an image is older
than a user defined limit, its buffer gets deallocated. This also applies to gl memory buffers.
Images that are loading in GL memory needs to go through two time outs before being fully deallocated: the first time out deallocated the gl memorry, the second the buffer in ram.
Notes:
Image buffer loaded from python gets tagged as permanent upon load. That tag is removed when python stops using the image.
I might have missed some tagging spots, especially in the rendering pipeline. Someone with more knowledge about this code should check to be careful.
Tagging is done on every access, for rendering, this will probably be a performance hit. A scheme should be developped to only tag when the rendering is completed.
Collecting is called in draw_object, most likely not the best place to do it.
Safe from undo, since using undo deallocates memory anyway (like when loading a blend file with one currently opened)
Userpref DNA changes:
I've changed a couple of flagging variables from short to int. Some because they needed more space, others to keep SDNA happy.
Info window changes:
I've grouped a couple of buttons in aligned blocks and changed the color of mutually exclusive options to make them clearer.
Matt didn't do any changes on that in tuhopuu, so hopefully I'm not stepping on anyone's feet with this.
Also changed double constants into floats with f in a couple of places (mostly space.c) to make compiler happier.
2005-07-06 00:33:41 +00:00
|
|
|
Image *ima;
|
2005-07-27 07:43:48 +00:00
|
|
|
int ctime = (int)PIL_check_seconds_timer();
|
3D view orbit option: Around Active
This fixes the active object in place when orbiting the view.
Choppy 15fps demo can be seen there: http://www.elysiun.com/~theeth/bf/around_active.html
Image Memory Grabage Collection
This adds memory handling to the image code. An image is tagged each time it is used.
During a collection cycle (frequency of cycles is user defined), if an image is older
than a user defined limit, its buffer gets deallocated. This also applies to gl memory buffers.
Images that are loading in GL memory needs to go through two time outs before being fully deallocated: the first time out deallocated the gl memorry, the second the buffer in ram.
Notes:
Image buffer loaded from python gets tagged as permanent upon load. That tag is removed when python stops using the image.
I might have missed some tagging spots, especially in the rendering pipeline. Someone with more knowledge about this code should check to be careful.
Tagging is done on every access, for rendering, this will probably be a performance hit. A scheme should be developped to only tag when the rendering is completed.
Collecting is called in draw_object, most likely not the best place to do it.
Safe from undo, since using undo deallocates memory anyway (like when loading a blend file with one currently opened)
Userpref DNA changes:
I've changed a couple of flagging variables from short to int. Some because they needed more space, others to keep SDNA happy.
Info window changes:
I've grouped a couple of buttons in aligned blocks and changed the color of mutually exclusive options to make them clearer.
Matt didn't do any changes on that in tuhopuu, so hopefully I'm not stepping on anyone's feet with this.
Also changed double constants into floats with f in a couple of places (mostly space.c) to make compiler happier.
2005-07-06 00:33:41 +00:00
|
|
|
|
|
|
|
ima= G.main->image.first;
|
|
|
|
while(ima) {
|
2006-12-20 17:57:56 +00:00
|
|
|
if(ima->bindcode || ima->repbind || ima->ibufs.first) {
|
3D view orbit option: Around Active
This fixes the active object in place when orbiting the view.
Choppy 15fps demo can be seen there: http://www.elysiun.com/~theeth/bf/around_active.html
Image Memory Grabage Collection
This adds memory handling to the image code. An image is tagged each time it is used.
During a collection cycle (frequency of cycles is user defined), if an image is older
than a user defined limit, its buffer gets deallocated. This also applies to gl memory buffers.
Images that are loading in GL memory needs to go through two time outs before being fully deallocated: the first time out deallocated the gl memorry, the second the buffer in ram.
Notes:
Image buffer loaded from python gets tagged as permanent upon load. That tag is removed when python stops using the image.
I might have missed some tagging spots, especially in the rendering pipeline. Someone with more knowledge about this code should check to be careful.
Tagging is done on every access, for rendering, this will probably be a performance hit. A scheme should be developped to only tag when the rendering is completed.
Collecting is called in draw_object, most likely not the best place to do it.
Safe from undo, since using undo deallocates memory anyway (like when loading a blend file with one currently opened)
Userpref DNA changes:
I've changed a couple of flagging variables from short to int. Some because they needed more space, others to keep SDNA happy.
Info window changes:
I've grouped a couple of buttons in aligned blocks and changed the color of mutually exclusive options to make them clearer.
Matt didn't do any changes on that in tuhopuu, so hopefully I'm not stepping on anyone's feet with this.
Also changed double constants into floats with f in a couple of places (mostly space.c) to make compiler happier.
2005-07-06 00:33:41 +00:00
|
|
|
ima->lastused = ctime;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2008-12-26 14:19:25 +00:00
|
|
|
#endif
|
3D view orbit option: Around Active
This fixes the active object in place when orbiting the view.
Choppy 15fps demo can be seen there: http://www.elysiun.com/~theeth/bf/around_active.html
Image Memory Grabage Collection
This adds memory handling to the image code. An image is tagged each time it is used.
During a collection cycle (frequency of cycles is user defined), if an image is older
than a user defined limit, its buffer gets deallocated. This also applies to gl memory buffers.
Images that are loading in GL memory needs to go through two time outs before being fully deallocated: the first time out deallocated the gl memorry, the second the buffer in ram.
Notes:
Image buffer loaded from python gets tagged as permanent upon load. That tag is removed when python stops using the image.
I might have missed some tagging spots, especially in the rendering pipeline. Someone with more knowledge about this code should check to be careful.
Tagging is done on every access, for rendering, this will probably be a performance hit. A scheme should be developped to only tag when the rendering is completed.
Collecting is called in draw_object, most likely not the best place to do it.
Safe from undo, since using undo deallocates memory anyway (like when loading a blend file with one currently opened)
Userpref DNA changes:
I've changed a couple of flagging variables from short to int. Some because they needed more space, others to keep SDNA happy.
Info window changes:
I've grouped a couple of buttons in aligned blocks and changed the color of mutually exclusive options to make them clearer.
Matt didn't do any changes on that in tuhopuu, so hopefully I'm not stepping on anyone's feet with this.
Also changed double constants into floats with f in a couple of places (mostly space.c) to make compiler happier.
2005-07-06 00:33:41 +00:00
|
|
|
|
|
|
|
void free_old_images()
|
|
|
|
{
|
|
|
|
Image *ima;
|
2005-07-27 07:43:48 +00:00
|
|
|
static int lasttime = 0;
|
|
|
|
int ctime = (int)PIL_check_seconds_timer();
|
3D view orbit option: Around Active
This fixes the active object in place when orbiting the view.
Choppy 15fps demo can be seen there: http://www.elysiun.com/~theeth/bf/around_active.html
Image Memory Grabage Collection
This adds memory handling to the image code. An image is tagged each time it is used.
During a collection cycle (frequency of cycles is user defined), if an image is older
than a user defined limit, its buffer gets deallocated. This also applies to gl memory buffers.
Images that are loading in GL memory needs to go through two time outs before being fully deallocated: the first time out deallocated the gl memorry, the second the buffer in ram.
Notes:
Image buffer loaded from python gets tagged as permanent upon load. That tag is removed when python stops using the image.
I might have missed some tagging spots, especially in the rendering pipeline. Someone with more knowledge about this code should check to be careful.
Tagging is done on every access, for rendering, this will probably be a performance hit. A scheme should be developped to only tag when the rendering is completed.
Collecting is called in draw_object, most likely not the best place to do it.
Safe from undo, since using undo deallocates memory anyway (like when loading a blend file with one currently opened)
Userpref DNA changes:
I've changed a couple of flagging variables from short to int. Some because they needed more space, others to keep SDNA happy.
Info window changes:
I've grouped a couple of buttons in aligned blocks and changed the color of mutually exclusive options to make them clearer.
Matt didn't do any changes on that in tuhopuu, so hopefully I'm not stepping on anyone's feet with this.
Also changed double constants into floats with f in a couple of places (mostly space.c) to make compiler happier.
2005-07-06 00:33:41 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
Run garbage collector once for every collecting period of time
|
|
|
|
if textimeout is 0, that's the option to NOT run the collector
|
|
|
|
*/
|
|
|
|
if (U.textimeout == 0 || ctime % U.texcollectrate || ctime == lasttime)
|
|
|
|
return;
|
|
|
|
|
|
|
|
lasttime = ctime;
|
|
|
|
|
|
|
|
ima= G.main->image.first;
|
|
|
|
while(ima) {
|
2005-07-27 06:21:50 +00:00
|
|
|
if((ima->flag & IMA_NOCOLLECT)==0 && ctime - ima->lastused > U.textimeout) {
|
3D view orbit option: Around Active
This fixes the active object in place when orbiting the view.
Choppy 15fps demo can be seen there: http://www.elysiun.com/~theeth/bf/around_active.html
Image Memory Grabage Collection
This adds memory handling to the image code. An image is tagged each time it is used.
During a collection cycle (frequency of cycles is user defined), if an image is older
than a user defined limit, its buffer gets deallocated. This also applies to gl memory buffers.
Images that are loading in GL memory needs to go through two time outs before being fully deallocated: the first time out deallocated the gl memorry, the second the buffer in ram.
Notes:
Image buffer loaded from python gets tagged as permanent upon load. That tag is removed when python stops using the image.
I might have missed some tagging spots, especially in the rendering pipeline. Someone with more knowledge about this code should check to be careful.
Tagging is done on every access, for rendering, this will probably be a performance hit. A scheme should be developped to only tag when the rendering is completed.
Collecting is called in draw_object, most likely not the best place to do it.
Safe from undo, since using undo deallocates memory anyway (like when loading a blend file with one currently opened)
Userpref DNA changes:
I've changed a couple of flagging variables from short to int. Some because they needed more space, others to keep SDNA happy.
Info window changes:
I've grouped a couple of buttons in aligned blocks and changed the color of mutually exclusive options to make them clearer.
Matt didn't do any changes on that in tuhopuu, so hopefully I'm not stepping on anyone's feet with this.
Also changed double constants into floats with f in a couple of places (mostly space.c) to make compiler happier.
2005-07-06 00:33:41 +00:00
|
|
|
/*
|
|
|
|
If it's in GL memory, deallocate and set time tag to current time
|
|
|
|
This gives textures a "second chance" to be used before dying.
|
|
|
|
*/
|
|
|
|
if(ima->bindcode || ima->repbind) {
|
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 20:51:28 +00:00
|
|
|
GPU_free_image(ima);
|
3D view orbit option: Around Active
This fixes the active object in place when orbiting the view.
Choppy 15fps demo can be seen there: http://www.elysiun.com/~theeth/bf/around_active.html
Image Memory Grabage Collection
This adds memory handling to the image code. An image is tagged each time it is used.
During a collection cycle (frequency of cycles is user defined), if an image is older
than a user defined limit, its buffer gets deallocated. This also applies to gl memory buffers.
Images that are loading in GL memory needs to go through two time outs before being fully deallocated: the first time out deallocated the gl memorry, the second the buffer in ram.
Notes:
Image buffer loaded from python gets tagged as permanent upon load. That tag is removed when python stops using the image.
I might have missed some tagging spots, especially in the rendering pipeline. Someone with more knowledge about this code should check to be careful.
Tagging is done on every access, for rendering, this will probably be a performance hit. A scheme should be developped to only tag when the rendering is completed.
Collecting is called in draw_object, most likely not the best place to do it.
Safe from undo, since using undo deallocates memory anyway (like when loading a blend file with one currently opened)
Userpref DNA changes:
I've changed a couple of flagging variables from short to int. Some because they needed more space, others to keep SDNA happy.
Info window changes:
I've grouped a couple of buttons in aligned blocks and changed the color of mutually exclusive options to make them clearer.
Matt didn't do any changes on that in tuhopuu, so hopefully I'm not stepping on anyone's feet with this.
Also changed double constants into floats with f in a couple of places (mostly space.c) to make compiler happier.
2005-07-06 00:33:41 +00:00
|
|
|
ima->lastused = ctime;
|
|
|
|
}
|
|
|
|
/* Otherwise, just kill the buffers */
|
2006-12-20 17:57:56 +00:00
|
|
|
else if (ima->ibufs.first) {
|
|
|
|
image_free_buffers(ima);
|
3D view orbit option: Around Active
This fixes the active object in place when orbiting the view.
Choppy 15fps demo can be seen there: http://www.elysiun.com/~theeth/bf/around_active.html
Image Memory Grabage Collection
This adds memory handling to the image code. An image is tagged each time it is used.
During a collection cycle (frequency of cycles is user defined), if an image is older
than a user defined limit, its buffer gets deallocated. This also applies to gl memory buffers.
Images that are loading in GL memory needs to go through two time outs before being fully deallocated: the first time out deallocated the gl memorry, the second the buffer in ram.
Notes:
Image buffer loaded from python gets tagged as permanent upon load. That tag is removed when python stops using the image.
I might have missed some tagging spots, especially in the rendering pipeline. Someone with more knowledge about this code should check to be careful.
Tagging is done on every access, for rendering, this will probably be a performance hit. A scheme should be developped to only tag when the rendering is completed.
Collecting is called in draw_object, most likely not the best place to do it.
Safe from undo, since using undo deallocates memory anyway (like when loading a blend file with one currently opened)
Userpref DNA changes:
I've changed a couple of flagging variables from short to int. Some because they needed more space, others to keep SDNA happy.
Info window changes:
I've grouped a couple of buttons in aligned blocks and changed the color of mutually exclusive options to make them clearer.
Matt didn't do any changes on that in tuhopuu, so hopefully I'm not stepping on anyone's feet with this.
Also changed double constants into floats with f in a couple of places (mostly space.c) to make compiler happier.
2005-07-06 00:33:41 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
ima = ima->id.next;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-08-17 17:08:00 +00:00
|
|
|
static uintptr_t image_mem_size(Image *ima)
|
2008-02-01 12:14:15 +00:00
|
|
|
{
|
|
|
|
ImBuf *ibuf, *ibufm;
|
|
|
|
int level;
|
2008-08-17 17:08:00 +00:00
|
|
|
uintptr_t size = 0;
|
2008-02-01 12:14:15 +00:00
|
|
|
|
|
|
|
size= 0;
|
2009-06-08 20:08:19 +00:00
|
|
|
|
|
|
|
/* viewers have memory depending on other rules, has no valid rect pointer */
|
|
|
|
if(ima->source==IMA_SRC_VIEWER)
|
|
|
|
return 0;
|
|
|
|
|
2008-02-01 12:14:15 +00:00
|
|
|
for(ibuf= ima->ibufs.first; ibuf; ibuf= ibuf->next) {
|
|
|
|
if(ibuf->rect) size += MEM_allocN_len(ibuf->rect);
|
|
|
|
else if(ibuf->rect_float) size += MEM_allocN_len(ibuf->rect_float);
|
|
|
|
|
|
|
|
for(level=0; level<IB_MIPMAP_LEVELS; level++) {
|
|
|
|
ibufm= ibuf->mipmap[level];
|
|
|
|
if(ibufm) {
|
|
|
|
if(ibufm->rect) size += MEM_allocN_len(ibufm->rect);
|
|
|
|
else if(ibufm->rect_float) size += MEM_allocN_len(ibufm->rect_float);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return size;
|
|
|
|
}
|
|
|
|
|
|
|
|
void BKE_image_print_memlist(void)
|
|
|
|
{
|
|
|
|
Image *ima;
|
2008-08-17 17:08:00 +00:00
|
|
|
uintptr_t size, totsize= 0;
|
2008-02-01 12:14:15 +00:00
|
|
|
|
|
|
|
for(ima= G.main->image.first; ima; ima= ima->id.next)
|
|
|
|
totsize += image_mem_size(ima);
|
|
|
|
|
|
|
|
printf("\ntotal image memory len: %.3lf MB\n", (double)totsize/(double)(1024*1024));
|
|
|
|
|
|
|
|
for(ima= G.main->image.first; ima; ima= ima->id.next) {
|
|
|
|
size= image_mem_size(ima);
|
|
|
|
|
|
|
|
if(size)
|
|
|
|
printf("%s len: %.3f MB\n", ima->id.name+2, (double)size/(double)(1024*1024));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2006-12-20 17:57:56 +00:00
|
|
|
void BKE_image_free_all_textures(void)
|
2006-02-11 23:17:41 +00:00
|
|
|
{
|
|
|
|
Tex *tex;
|
|
|
|
Image *ima;
|
|
|
|
unsigned int totsize= 0;
|
|
|
|
|
|
|
|
for(ima= G.main->image.first; ima; ima= ima->id.next)
|
|
|
|
ima->id.flag &= ~LIB_DOIT;
|
|
|
|
|
|
|
|
for(tex= G.main->tex.first; tex; tex= tex->id.next)
|
|
|
|
if(tex->ima)
|
|
|
|
tex->ima->id.flag |= LIB_DOIT;
|
|
|
|
|
|
|
|
for(ima= G.main->image.first; ima; ima= ima->id.next) {
|
2006-12-20 17:57:56 +00:00
|
|
|
if(ima->ibufs.first && (ima->id.flag & LIB_DOIT)) {
|
|
|
|
ImBuf *ibuf;
|
|
|
|
for(ibuf= ima->ibufs.first; ibuf; ibuf= ibuf->next) {
|
|
|
|
if(ibuf->mipmap[0])
|
|
|
|
totsize+= 1.33*ibuf->x*ibuf->y*4;
|
|
|
|
else
|
|
|
|
totsize+= ibuf->x*ibuf->y*4;
|
|
|
|
}
|
|
|
|
image_free_buffers(ima);
|
2006-02-11 23:17:41 +00:00
|
|
|
}
|
|
|
|
}
|
2006-12-20 17:57:56 +00:00
|
|
|
/* printf("freed total %d MB\n", totsize/(1024*1024)); */
|
2006-02-11 23:17:41 +00:00
|
|
|
}
|
2002-10-12 11:37:38 +00:00
|
|
|
|
2006-12-20 17:57:56 +00:00
|
|
|
/* except_frame is weak, only works for seqs without offset... */
|
|
|
|
void BKE_image_free_anim_ibufs(Image *ima, int except_frame)
|
|
|
|
{
|
|
|
|
ImBuf *ibuf, *nbuf;
|
|
|
|
|
|
|
|
for(ibuf= ima->ibufs.first; ibuf; ibuf= nbuf) {
|
|
|
|
nbuf= ibuf->next;
|
|
|
|
if(ibuf->userflags & IB_BITMAPDIRTY)
|
|
|
|
continue;
|
|
|
|
if(ibuf->index==IMA_NO_INDEX)
|
|
|
|
continue;
|
|
|
|
if(except_frame!=IMA_INDEX_FRAME(ibuf->index)) {
|
|
|
|
BLI_remlink(&ima->ibufs, ibuf);
|
|
|
|
|
|
|
|
if (ibuf->userdata) {
|
|
|
|
MEM_freeN(ibuf->userdata);
|
|
|
|
ibuf->userdata = NULL;
|
|
|
|
}
|
|
|
|
IMB_freeImBuf(ibuf);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void BKE_image_all_free_anim_ibufs(int cfra)
|
|
|
|
{
|
|
|
|
Image *ima;
|
|
|
|
|
|
|
|
for(ima= G.main->image.first; ima; ima= ima->id.next)
|
|
|
|
if(ELEM(ima->source, IMA_SRC_SEQUENCE, IMA_SRC_MOVIE))
|
|
|
|
BKE_image_free_anim_ibufs(ima, cfra);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2003-04-26 11:56:44 +00:00
|
|
|
/* *********** READ AND WRITE ************** */
|
2002-10-12 11:37:38 +00:00
|
|
|
|
2006-12-20 17:57:56 +00:00
|
|
|
int BKE_imtype_to_ftype(int imtype)
|
|
|
|
{
|
|
|
|
if(imtype==0)
|
|
|
|
return TGA;
|
|
|
|
else if(imtype== R_IRIS)
|
|
|
|
return IMAGIC;
|
|
|
|
else if (imtype==R_RADHDR)
|
|
|
|
return RADHDR;
|
|
|
|
else if (imtype==R_PNG)
|
|
|
|
return PNG;
|
2007-06-25 19:50:25 +00:00
|
|
|
#ifdef WITH_DDS
|
|
|
|
else if (imtype==R_DDS)
|
|
|
|
return DDS;
|
|
|
|
#endif
|
2006-12-20 17:57:56 +00:00
|
|
|
else if (imtype==R_BMP)
|
|
|
|
return BMP;
|
|
|
|
else if (imtype==R_TIFF)
|
|
|
|
return TIF;
|
|
|
|
else if (imtype==R_OPENEXR || imtype==R_MULTILAYER)
|
|
|
|
return OPENEXR;
|
|
|
|
else if (imtype==R_CINEON)
|
|
|
|
return CINEON;
|
|
|
|
else if (imtype==R_DPX)
|
|
|
|
return DPX;
|
|
|
|
else if (imtype==R_TARGA)
|
|
|
|
return TGA;
|
|
|
|
else if(imtype==R_RAWTGA)
|
|
|
|
return RAWTGA;
|
|
|
|
else if(imtype==R_HAMX)
|
|
|
|
return AN_hamx;
|
2009-01-26 08:34:40 +00:00
|
|
|
#ifdef WITH_OPENJPEG
|
|
|
|
else if(imtype==R_JP2)
|
|
|
|
return JP2;
|
|
|
|
#endif
|
2006-12-20 17:57:56 +00:00
|
|
|
else
|
|
|
|
return JPG|90;
|
|
|
|
}
|
|
|
|
|
|
|
|
int BKE_ftype_to_imtype(int ftype)
|
|
|
|
{
|
|
|
|
if(ftype==0)
|
|
|
|
return TGA;
|
|
|
|
else if(ftype == IMAGIC)
|
|
|
|
return R_IRIS;
|
|
|
|
else if (ftype & RADHDR)
|
|
|
|
return R_RADHDR;
|
|
|
|
else if (ftype & PNG)
|
|
|
|
return R_PNG;
|
2007-06-25 19:50:25 +00:00
|
|
|
#ifdef WITH_DDS
|
|
|
|
else if (ftype & DDS)
|
|
|
|
return R_DDS;
|
|
|
|
#endif
|
2006-12-20 17:57:56 +00:00
|
|
|
else if (ftype & BMP)
|
|
|
|
return R_BMP;
|
|
|
|
else if (ftype & TIF)
|
|
|
|
return R_TIFF;
|
|
|
|
else if (ftype & OPENEXR)
|
|
|
|
return R_OPENEXR;
|
|
|
|
else if (ftype & CINEON)
|
|
|
|
return R_CINEON;
|
|
|
|
else if (ftype & DPX)
|
|
|
|
return R_DPX;
|
|
|
|
else if (ftype & TGA)
|
|
|
|
return R_TARGA;
|
|
|
|
else if(ftype & RAWTGA)
|
|
|
|
return R_RAWTGA;
|
|
|
|
else if(ftype == AN_hamx)
|
|
|
|
return R_HAMX;
|
2009-01-26 08:34:40 +00:00
|
|
|
#ifdef WITH_OPENJPEG
|
|
|
|
else if(ftype & JP2)
|
|
|
|
return R_JP2;
|
|
|
|
#endif
|
2006-12-20 17:57:56 +00:00
|
|
|
else
|
|
|
|
return R_JPEG90;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
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 22:05:47 +00:00
|
|
|
int BKE_imtype_is_movie(int imtype)
|
2002-10-12 11:37:38 +00: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 22:05:47 +00:00
|
|
|
switch(imtype) {
|
2006-02-05 19:12:25 +00:00
|
|
|
case R_MOVIE:
|
|
|
|
case R_AVIRAW:
|
|
|
|
case R_AVIJPEG:
|
|
|
|
case R_AVICODEC:
|
|
|
|
case R_QUICKTIME:
|
|
|
|
case R_FFMPEG:
|
2.5: Render
* UI layout for scene buttons has quite some changes, I tried to
better organize things according to the pipeline, and also showing
important properties by default, and collapsing less important ones.
Some changes compared to 2.4x:
* Panorama is now a Camera property.
* Sequence and Compositing are now enabled by default, but will only
do something when there is a node tree using nodes, or a strip in the
sequence editor.
* Enabling Full Sample now automatically enables Save Buffers too.
* Stamp option to include info in file is removed, it now simply always
does this if one of the stamp infos is enabled.
* Xvid, H.264 and Ogg Theora are now directly in the file format menu,
but still using FFMPEG. Unfortunately Ogg is broken at the moment
(also in 2.4x), so that's disabled. And Xvid crashes on 64bit linux,
maybe solvable by upgrading extern/xvidcore/, using ubuntu libs makes
it work.
* Organized file format menu by image/movie types.
Added:
* Render layers RNA wrapped, operatorized, layouted.
* FFMPEG format/codec options are now working.
Defaults changed:
* Compositing & Sequencer enabled.
* Tiles set to 8x8.
* Time/Date/Frame/Scene/Camera/Filename enabled for stamp.
2009-07-13 19:09:13 +00:00
|
|
|
case R_H264:
|
|
|
|
case R_THEORA:
|
|
|
|
case R_XVID:
|
2006-02-05 19:12:25 +00:00
|
|
|
case R_FRAMESERVER:
|
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 22:05:47 +00:00
|
|
|
return 1;
|
2002-10-12 11:37:38 +00: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 22:05:47 +00:00
|
|
|
return 0;
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
|
|
|
|
2010-01-08 13:52:38 +00:00
|
|
|
void BKE_add_image_extension(char *string, int imtype)
|
3D view orbit option: Around Active
This fixes the active object in place when orbiting the view.
Choppy 15fps demo can be seen there: http://www.elysiun.com/~theeth/bf/around_active.html
Image Memory Grabage Collection
This adds memory handling to the image code. An image is tagged each time it is used.
During a collection cycle (frequency of cycles is user defined), if an image is older
than a user defined limit, its buffer gets deallocated. This also applies to gl memory buffers.
Images that are loading in GL memory needs to go through two time outs before being fully deallocated: the first time out deallocated the gl memorry, the second the buffer in ram.
Notes:
Image buffer loaded from python gets tagged as permanent upon load. That tag is removed when python stops using the image.
I might have missed some tagging spots, especially in the rendering pipeline. Someone with more knowledge about this code should check to be careful.
Tagging is done on every access, for rendering, this will probably be a performance hit. A scheme should be developped to only tag when the rendering is completed.
Collecting is called in draw_object, most likely not the best place to do it.
Safe from undo, since using undo deallocates memory anyway (like when loading a blend file with one currently opened)
Userpref DNA changes:
I've changed a couple of flagging variables from short to int. Some because they needed more space, others to keep SDNA happy.
Info window changes:
I've grouped a couple of buttons in aligned blocks and changed the color of mutually exclusive options to make them clearer.
Matt didn't do any changes on that in tuhopuu, so hopefully I'm not stepping on anyone's feet with this.
Also changed double constants into floats with f in a couple of places (mostly space.c) to make compiler happier.
2005-07-06 00:33:41 +00:00
|
|
|
{
|
2005-07-17 08:58:42 +00:00
|
|
|
char *extension="";
|
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 22:05:47 +00:00
|
|
|
|
2.5: Render
* UI layout for scene buttons has quite some changes, I tried to
better organize things according to the pipeline, and also showing
important properties by default, and collapsing less important ones.
Some changes compared to 2.4x:
* Panorama is now a Camera property.
* Sequence and Compositing are now enabled by default, but will only
do something when there is a node tree using nodes, or a strip in the
sequence editor.
* Enabling Full Sample now automatically enables Save Buffers too.
* Stamp option to include info in file is removed, it now simply always
does this if one of the stamp infos is enabled.
* Xvid, H.264 and Ogg Theora are now directly in the file format menu,
but still using FFMPEG. Unfortunately Ogg is broken at the moment
(also in 2.4x), so that's disabled. And Xvid crashes on 64bit linux,
maybe solvable by upgrading extern/xvidcore/, using ubuntu libs makes
it work.
* Organized file format menu by image/movie types.
Added:
* Render layers RNA wrapped, operatorized, layouted.
* FFMPEG format/codec options are now working.
Defaults changed:
* Compositing & Sequencer enabled.
* Tiles set to 8x8.
* Time/Date/Frame/Scene/Camera/Filename enabled for stamp.
2009-07-13 19:09:13 +00:00
|
|
|
if(imtype== R_IRIS) {
|
2005-11-20 14:32:07 +00:00
|
|
|
if(!BLI_testextensie(string, ".rgb"))
|
|
|
|
extension= ".rgb";
|
3D view orbit option: Around Active
This fixes the active object in place when orbiting the view.
Choppy 15fps demo can be seen there: http://www.elysiun.com/~theeth/bf/around_active.html
Image Memory Grabage Collection
This adds memory handling to the image code. An image is tagged each time it is used.
During a collection cycle (frequency of cycles is user defined), if an image is older
than a user defined limit, its buffer gets deallocated. This also applies to gl memory buffers.
Images that are loading in GL memory needs to go through two time outs before being fully deallocated: the first time out deallocated the gl memorry, the second the buffer in ram.
Notes:
Image buffer loaded from python gets tagged as permanent upon load. That tag is removed when python stops using the image.
I might have missed some tagging spots, especially in the rendering pipeline. Someone with more knowledge about this code should check to be careful.
Tagging is done on every access, for rendering, this will probably be a performance hit. A scheme should be developped to only tag when the rendering is completed.
Collecting is called in draw_object, most likely not the best place to do it.
Safe from undo, since using undo deallocates memory anyway (like when loading a blend file with one currently opened)
Userpref DNA changes:
I've changed a couple of flagging variables from short to int. Some because they needed more space, others to keep SDNA happy.
Info window changes:
I've grouped a couple of buttons in aligned blocks and changed the color of mutually exclusive options to make them clearer.
Matt didn't do any changes on that in tuhopuu, so hopefully I'm not stepping on anyone's feet with this.
Also changed double constants into floats with f in a couple of places (mostly space.c) to make compiler happier.
2005-07-06 00:33:41 +00: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 22:05:47 +00:00
|
|
|
else if(imtype==R_IRIZ) {
|
2005-11-20 14:32:07 +00:00
|
|
|
if(!BLI_testextensie(string, ".rgb"))
|
|
|
|
extension= ".rgb";
|
|
|
|
}
|
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 22:05:47 +00:00
|
|
|
else if(imtype==R_RADHDR) {
|
2005-11-20 14:32:07 +00:00
|
|
|
if(!BLI_testextensie(string, ".hdr"))
|
|
|
|
extension= ".hdr";
|
3D view orbit option: Around Active
This fixes the active object in place when orbiting the view.
Choppy 15fps demo can be seen there: http://www.elysiun.com/~theeth/bf/around_active.html
Image Memory Grabage Collection
This adds memory handling to the image code. An image is tagged each time it is used.
During a collection cycle (frequency of cycles is user defined), if an image is older
than a user defined limit, its buffer gets deallocated. This also applies to gl memory buffers.
Images that are loading in GL memory needs to go through two time outs before being fully deallocated: the first time out deallocated the gl memorry, the second the buffer in ram.
Notes:
Image buffer loaded from python gets tagged as permanent upon load. That tag is removed when python stops using the image.
I might have missed some tagging spots, especially in the rendering pipeline. Someone with more knowledge about this code should check to be careful.
Tagging is done on every access, for rendering, this will probably be a performance hit. A scheme should be developped to only tag when the rendering is completed.
Collecting is called in draw_object, most likely not the best place to do it.
Safe from undo, since using undo deallocates memory anyway (like when loading a blend file with one currently opened)
Userpref DNA changes:
I've changed a couple of flagging variables from short to int. Some because they needed more space, others to keep SDNA happy.
Info window changes:
I've grouped a couple of buttons in aligned blocks and changed the color of mutually exclusive options to make them clearer.
Matt didn't do any changes on that in tuhopuu, so hopefully I'm not stepping on anyone's feet with this.
Also changed double constants into floats with f in a couple of places (mostly space.c) to make compiler happier.
2005-07-06 00:33:41 +00:00
|
|
|
}
|
2.5: Render
* UI layout for scene buttons has quite some changes, I tried to
better organize things according to the pipeline, and also showing
important properties by default, and collapsing less important ones.
Some changes compared to 2.4x:
* Panorama is now a Camera property.
* Sequence and Compositing are now enabled by default, but will only
do something when there is a node tree using nodes, or a strip in the
sequence editor.
* Enabling Full Sample now automatically enables Save Buffers too.
* Stamp option to include info in file is removed, it now simply always
does this if one of the stamp infos is enabled.
* Xvid, H.264 and Ogg Theora are now directly in the file format menu,
but still using FFMPEG. Unfortunately Ogg is broken at the moment
(also in 2.4x), so that's disabled. And Xvid crashes on 64bit linux,
maybe solvable by upgrading extern/xvidcore/, using ubuntu libs makes
it work.
* Organized file format menu by image/movie types.
Added:
* Render layers RNA wrapped, operatorized, layouted.
* FFMPEG format/codec options are now working.
Defaults changed:
* Compositing & Sequencer enabled.
* Tiles set to 8x8.
* Time/Date/Frame/Scene/Camera/Filename enabled for stamp.
2009-07-13 19:09:13 +00:00
|
|
|
else if (ELEM5(imtype, R_PNG, R_FFMPEG, R_H264, R_THEORA, R_XVID)) {
|
2005-11-20 14:32:07 +00:00
|
|
|
if(!BLI_testextensie(string, ".png"))
|
|
|
|
extension= ".png";
|
3D view orbit option: Around Active
This fixes the active object in place when orbiting the view.
Choppy 15fps demo can be seen there: http://www.elysiun.com/~theeth/bf/around_active.html
Image Memory Grabage Collection
This adds memory handling to the image code. An image is tagged each time it is used.
During a collection cycle (frequency of cycles is user defined), if an image is older
than a user defined limit, its buffer gets deallocated. This also applies to gl memory buffers.
Images that are loading in GL memory needs to go through two time outs before being fully deallocated: the first time out deallocated the gl memorry, the second the buffer in ram.
Notes:
Image buffer loaded from python gets tagged as permanent upon load. That tag is removed when python stops using the image.
I might have missed some tagging spots, especially in the rendering pipeline. Someone with more knowledge about this code should check to be careful.
Tagging is done on every access, for rendering, this will probably be a performance hit. A scheme should be developped to only tag when the rendering is completed.
Collecting is called in draw_object, most likely not the best place to do it.
Safe from undo, since using undo deallocates memory anyway (like when loading a blend file with one currently opened)
Userpref DNA changes:
I've changed a couple of flagging variables from short to int. Some because they needed more space, others to keep SDNA happy.
Info window changes:
I've grouped a couple of buttons in aligned blocks and changed the color of mutually exclusive options to make them clearer.
Matt didn't do any changes on that in tuhopuu, so hopefully I'm not stepping on anyone's feet with this.
Also changed double constants into floats with f in a couple of places (mostly space.c) to make compiler happier.
2005-07-06 00:33:41 +00:00
|
|
|
}
|
2007-06-25 19:50:25 +00:00
|
|
|
#ifdef WITH_DDS
|
|
|
|
else if(imtype==R_DDS) {
|
|
|
|
if(!BLI_testextensie(string, ".dds"))
|
|
|
|
extension= ".dds";
|
|
|
|
}
|
|
|
|
#endif
|
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 22:05:47 +00:00
|
|
|
else if(imtype==R_RAWTGA) {
|
2005-11-20 14:32:07 +00:00
|
|
|
if(!BLI_testextensie(string, ".tga"))
|
|
|
|
extension= ".tga";
|
3D view orbit option: Around Active
This fixes the active object in place when orbiting the view.
Choppy 15fps demo can be seen there: http://www.elysiun.com/~theeth/bf/around_active.html
Image Memory Grabage Collection
This adds memory handling to the image code. An image is tagged each time it is used.
During a collection cycle (frequency of cycles is user defined), if an image is older
than a user defined limit, its buffer gets deallocated. This also applies to gl memory buffers.
Images that are loading in GL memory needs to go through two time outs before being fully deallocated: the first time out deallocated the gl memorry, the second the buffer in ram.
Notes:
Image buffer loaded from python gets tagged as permanent upon load. That tag is removed when python stops using the image.
I might have missed some tagging spots, especially in the rendering pipeline. Someone with more knowledge about this code should check to be careful.
Tagging is done on every access, for rendering, this will probably be a performance hit. A scheme should be developped to only tag when the rendering is completed.
Collecting is called in draw_object, most likely not the best place to do it.
Safe from undo, since using undo deallocates memory anyway (like when loading a blend file with one currently opened)
Userpref DNA changes:
I've changed a couple of flagging variables from short to int. Some because they needed more space, others to keep SDNA happy.
Info window changes:
I've grouped a couple of buttons in aligned blocks and changed the color of mutually exclusive options to make them clearer.
Matt didn't do any changes on that in tuhopuu, so hopefully I'm not stepping on anyone's feet with this.
Also changed double constants into floats with f in a couple of places (mostly space.c) to make compiler happier.
2005-07-06 00:33:41 +00: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 22:05:47 +00:00
|
|
|
else if(imtype==R_BMP) {
|
2005-11-20 14:32:07 +00:00
|
|
|
if(!BLI_testextensie(string, ".bmp"))
|
|
|
|
extension= ".bmp";
|
3D view orbit option: Around Active
This fixes the active object in place when orbiting the view.
Choppy 15fps demo can be seen there: http://www.elysiun.com/~theeth/bf/around_active.html
Image Memory Grabage Collection
This adds memory handling to the image code. An image is tagged each time it is used.
During a collection cycle (frequency of cycles is user defined), if an image is older
than a user defined limit, its buffer gets deallocated. This also applies to gl memory buffers.
Images that are loading in GL memory needs to go through two time outs before being fully deallocated: the first time out deallocated the gl memorry, the second the buffer in ram.
Notes:
Image buffer loaded from python gets tagged as permanent upon load. That tag is removed when python stops using the image.
I might have missed some tagging spots, especially in the rendering pipeline. Someone with more knowledge about this code should check to be careful.
Tagging is done on every access, for rendering, this will probably be a performance hit. A scheme should be developped to only tag when the rendering is completed.
Collecting is called in draw_object, most likely not the best place to do it.
Safe from undo, since using undo deallocates memory anyway (like when loading a blend file with one currently opened)
Userpref DNA changes:
I've changed a couple of flagging variables from short to int. Some because they needed more space, others to keep SDNA happy.
Info window changes:
I've grouped a couple of buttons in aligned blocks and changed the color of mutually exclusive options to make them clearer.
Matt didn't do any changes on that in tuhopuu, so hopefully I'm not stepping on anyone's feet with this.
Also changed double constants into floats with f in a couple of places (mostly space.c) to make compiler happier.
2005-07-06 00:33:41 +00: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 22:05:47 +00:00
|
|
|
else if(G.have_libtiff && (imtype==R_TIFF)) {
|
2008-06-26 16:42:20 +00:00
|
|
|
if(!BLI_testextensie(string, ".tif") &&
|
|
|
|
!BLI_testextensie(string, ".tiff")) extension= ".tif";
|
2005-11-22 18:50:03 +00:00
|
|
|
}
|
Orange branch: OpenEXR finally in Blender!
Credits go to Gernot Ziegler, who originally coded EXR support, and to
Austin Benesh for bringing it further. Kent Mein provided a lot of code
for integrating float buffers in Blender imbuf and ImBuf API cleanup,
and provided Make and Scons and static linking.
At this moment; the EXR libraries are a *dependency*, so you cannot get
the Orange branch compiled without having OpenEXR installed. Get the
(precompiled or sources) stuff from www.openexr.com. Current default is
that the headers and lib resides in /user/local/
Several changes/additions/fixes were added:
- EXR code only supported 'half' format (16 bits per channel). I've added
float writing, but for reading it I need tomorrow. :)
- Quite some clumsy copying of data happened in EXR code.
- cleaned up the api calls already a bit, preparing for more advanced
support
- Zbuffers were saved 16 bits, now 32 bits
- automatic adding of .exr extensions went wrong
Imbuf:
- added proper imbuf->flags and imbuf->mall support for float buffers, it
was created for *each* imbuf. :)
- found bugs for float buffers in scaling and flipping. Code there will
need more checks still
- imbuf also needs to be verified to behave properly when no 32 bits
rect exists (for saving for example)
TODO:
- support internal float images for textures, backbuf, AO probes, and
display in Image window
Hope this commit won't screwup syncing with bf-blender... :/
2006-01-09 00:40:35 +00:00
|
|
|
#ifdef WITH_OPENEXR
|
2006-12-20 17:57:56 +00:00
|
|
|
else if( ELEM(imtype, R_OPENEXR, R_MULTILAYER)) {
|
Orange branch: OpenEXR finally in Blender!
Credits go to Gernot Ziegler, who originally coded EXR support, and to
Austin Benesh for bringing it further. Kent Mein provided a lot of code
for integrating float buffers in Blender imbuf and ImBuf API cleanup,
and provided Make and Scons and static linking.
At this moment; the EXR libraries are a *dependency*, so you cannot get
the Orange branch compiled without having OpenEXR installed. Get the
(precompiled or sources) stuff from www.openexr.com. Current default is
that the headers and lib resides in /user/local/
Several changes/additions/fixes were added:
- EXR code only supported 'half' format (16 bits per channel). I've added
float writing, but for reading it I need tomorrow. :)
- Quite some clumsy copying of data happened in EXR code.
- cleaned up the api calls already a bit, preparing for more advanced
support
- Zbuffers were saved 16 bits, now 32 bits
- automatic adding of .exr extensions went wrong
Imbuf:
- added proper imbuf->flags and imbuf->mall support for float buffers, it
was created for *each* imbuf. :)
- found bugs for float buffers in scaling and flipping. Code there will
need more checks still
- imbuf also needs to be verified to behave properly when no 32 bits
rect exists (for saving for example)
TODO:
- support internal float images for textures, backbuf, AO probes, and
display in Image window
Hope this commit won't screwup syncing with bf-blender... :/
2006-01-09 00:40:35 +00:00
|
|
|
if(!BLI_testextensie(string, ".exr"))
|
|
|
|
extension= ".exr";
|
|
|
|
}
|
|
|
|
#endif
|
2006-03-12 14:11:23 +00:00
|
|
|
else if(imtype==R_CINEON){
|
|
|
|
if (!BLI_testextensie(string, ".cin"))
|
|
|
|
extension= ".cin";
|
|
|
|
}
|
|
|
|
else if(imtype==R_DPX){
|
|
|
|
if (!BLI_testextensie(string, ".dpx"))
|
|
|
|
extension= ".dpx";
|
|
|
|
}
|
2008-07-06 09:21:39 +00:00
|
|
|
else if(imtype==R_TARGA) {
|
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 22:05:47 +00:00
|
|
|
if(!BLI_testextensie(string, ".tga"))
|
|
|
|
extension= ".tga";
|
|
|
|
}
|
2009-01-26 08:34:40 +00:00
|
|
|
#ifdef WITH_OPENJPEG
|
|
|
|
else if(imtype==R_JP2) {
|
|
|
|
if(!BLI_testextensie(string, ".jp2"))
|
|
|
|
extension= ".jp2";
|
|
|
|
}
|
|
|
|
#endif
|
2008-07-06 09:21:39 +00:00
|
|
|
else { // R_MOVIE, R_AVICODEC, R_AVIRAW, R_AVIJPEG, R_JPEG90, R_QUICKTIME etc
|
|
|
|
if(!( BLI_testextensie(string, ".jpg") || BLI_testextensie(string, ".jpeg")))
|
|
|
|
extension= ".jpg";
|
|
|
|
}
|
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 22:05:47 +00:00
|
|
|
|
3D view orbit option: Around Active
This fixes the active object in place when orbiting the view.
Choppy 15fps demo can be seen there: http://www.elysiun.com/~theeth/bf/around_active.html
Image Memory Grabage Collection
This adds memory handling to the image code. An image is tagged each time it is used.
During a collection cycle (frequency of cycles is user defined), if an image is older
than a user defined limit, its buffer gets deallocated. This also applies to gl memory buffers.
Images that are loading in GL memory needs to go through two time outs before being fully deallocated: the first time out deallocated the gl memorry, the second the buffer in ram.
Notes:
Image buffer loaded from python gets tagged as permanent upon load. That tag is removed when python stops using the image.
I might have missed some tagging spots, especially in the rendering pipeline. Someone with more knowledge about this code should check to be careful.
Tagging is done on every access, for rendering, this will probably be a performance hit. A scheme should be developped to only tag when the rendering is completed.
Collecting is called in draw_object, most likely not the best place to do it.
Safe from undo, since using undo deallocates memory anyway (like when loading a blend file with one currently opened)
Userpref DNA changes:
I've changed a couple of flagging variables from short to int. Some because they needed more space, others to keep SDNA happy.
Info window changes:
I've grouped a couple of buttons in aligned blocks and changed the color of mutually exclusive options to make them clearer.
Matt didn't do any changes on that in tuhopuu, so hopefully I'm not stepping on anyone's feet with this.
Also changed double constants into floats with f in a couple of places (mostly space.c) to make compiler happier.
2005-07-06 00:33:41 +00:00
|
|
|
strcat(string, extension);
|
|
|
|
}
|
|
|
|
|
2007-11-08 13:02:59 +00:00
|
|
|
/* could allow access externally - 512 is for long names, 64 is for id names */
|
2007-10-28 22:27:07 +00:00
|
|
|
typedef struct StampData {
|
|
|
|
char file[512];
|
|
|
|
char note[512];
|
|
|
|
char date[512];
|
|
|
|
char marker[512];
|
|
|
|
char time[512];
|
|
|
|
char frame[512];
|
2007-11-08 13:02:59 +00:00
|
|
|
char camera[64];
|
|
|
|
char scene[64];
|
|
|
|
char strip[64];
|
2009-10-15 19:18:40 +00:00
|
|
|
char rendertime[64];
|
2007-10-28 22:27:07 +00:00
|
|
|
} StampData;
|
|
|
|
|
2009-01-04 14:14:06 +00:00
|
|
|
static void stampdata(Scene *scene, StampData *stamp_data, int do_prefix)
|
2007-10-20 16:17:27 +00:00
|
|
|
{
|
2007-10-28 22:27:07 +00:00
|
|
|
char text[256];
|
2007-10-20 16:17:27 +00:00
|
|
|
struct tm *tl;
|
|
|
|
time_t t;
|
2010-04-04 21:57:51 +00:00
|
|
|
|
2009-01-04 14:14:06 +00:00
|
|
|
if (scene->r.stamp & R_STAMP_FILENAME) {
|
2008-02-21 23:19:06 +00:00
|
|
|
if (G.relbase_valid) {
|
|
|
|
if (do_prefix) sprintf(stamp_data->file, "File %s", G.sce);
|
|
|
|
else sprintf(stamp_data->file, "%s", G.sce);
|
|
|
|
} else {
|
|
|
|
if (do_prefix) strcpy(stamp_data->file, "File <untitled>");
|
|
|
|
else strcpy(stamp_data->file, "<untitled>");
|
|
|
|
}
|
2007-11-08 13:02:59 +00:00
|
|
|
} else {
|
|
|
|
stamp_data->file[0] = '\0';
|
|
|
|
}
|
2007-10-20 16:17:27 +00:00
|
|
|
|
2009-01-04 14:14:06 +00:00
|
|
|
if (scene->r.stamp & R_STAMP_NOTE) {
|
2007-12-24 18:38:03 +00:00
|
|
|
/* Never do prefix for Note */
|
2009-01-04 14:14:06 +00:00
|
|
|
sprintf(stamp_data->note, "%s", scene->r.stamp_udata);
|
2007-10-28 22:27:07 +00:00
|
|
|
} else {
|
|
|
|
stamp_data->note[0] = '\0';
|
Patch by GSR #7628, I also added alpha for text background.
The list of changes (some are fixes):
- Properly horizontally centered tags in all fields (bug?).
- File area does not have trailing space and has leading "File " at
start instead (probably a bug).
- Small separation between to time related fields, space saving.
- Removed colons, for consistency and space saving again.
- Frame field is zero aligned for higher visual stability.
- Marker name shows a rarer name, "<none>" (using <> is typical for cases
in which there is nothing: <none>, <empty>, <blank>, etc).
- Top area for misc info that can be really long (file, note and render date).
- Bottom area for more constantly changing but short ones (marker, SMPTE,
frame, camera and scene).
- Only render date moves a line (when note field is not used), and frame one
moves if no SMPTE (still in same line, so no big jump), for extra visual
stability (marker is fixed, assuming most people would show frame and or
SMPTE).
- ISO 8601 date format for render date, localization independant.
Comparision images:
http://www.infernal-iceberg.com/blender/stamp-original.png
http://www.infernal-iceberg.com/blender/stamp-cleanup.png
2007-10-23 22:51:50 +00:00
|
|
|
}
|
|
|
|
|
2009-01-04 14:14:06 +00:00
|
|
|
if (scene->r.stamp & R_STAMP_DATE) {
|
2010-04-04 21:57:51 +00:00
|
|
|
|
Patch by GSR #7628, I also added alpha for text background.
The list of changes (some are fixes):
- Properly horizontally centered tags in all fields (bug?).
- File area does not have trailing space and has leading "File " at
start instead (probably a bug).
- Small separation between to time related fields, space saving.
- Removed colons, for consistency and space saving again.
- Frame field is zero aligned for higher visual stability.
- Marker name shows a rarer name, "<none>" (using <> is typical for cases
in which there is nothing: <none>, <empty>, <blank>, etc).
- Top area for misc info that can be really long (file, note and render date).
- Bottom area for more constantly changing but short ones (marker, SMPTE,
frame, camera and scene).
- Only render date moves a line (when note field is not used), and frame one
moves if no SMPTE (still in same line, so no big jump), for extra visual
stability (marker is fixed, assuming most people would show frame and or
SMPTE).
- ISO 8601 date format for render date, localization independant.
Comparision images:
http://www.infernal-iceberg.com/blender/stamp-original.png
http://www.infernal-iceberg.com/blender/stamp-cleanup.png
2007-10-23 22:51:50 +00:00
|
|
|
t = time (NULL);
|
|
|
|
tl = localtime (&t);
|
2010-04-04 21:57:51 +00:00
|
|
|
sprintf (text, "%04d/%02d/%02d %02d:%02d:%02d", tl->tm_year+1900, tl->tm_mon+1, tl->tm_mday, tl->tm_hour, tl->tm_min, tl->tm_sec);
|
|
|
|
|
2007-10-28 22:27:07 +00:00
|
|
|
if (do_prefix) sprintf(stamp_data->date, "Date %s", text);
|
|
|
|
else sprintf(stamp_data->date, "%s", text);
|
|
|
|
} else {
|
|
|
|
stamp_data->date[0] = '\0';
|
Patch by GSR #7628, I also added alpha for text background.
The list of changes (some are fixes):
- Properly horizontally centered tags in all fields (bug?).
- File area does not have trailing space and has leading "File " at
start instead (probably a bug).
- Small separation between to time related fields, space saving.
- Removed colons, for consistency and space saving again.
- Frame field is zero aligned for higher visual stability.
- Marker name shows a rarer name, "<none>" (using <> is typical for cases
in which there is nothing: <none>, <empty>, <blank>, etc).
- Top area for misc info that can be really long (file, note and render date).
- Bottom area for more constantly changing but short ones (marker, SMPTE,
frame, camera and scene).
- Only render date moves a line (when note field is not used), and frame one
moves if no SMPTE (still in same line, so no big jump), for extra visual
stability (marker is fixed, assuming most people would show frame and or
SMPTE).
- ISO 8601 date format for render date, localization independant.
Comparision images:
http://www.infernal-iceberg.com/blender/stamp-original.png
http://www.infernal-iceberg.com/blender/stamp-cleanup.png
2007-10-23 22:51:50 +00:00
|
|
|
}
|
2007-10-28 22:27:07 +00:00
|
|
|
|
2009-01-04 14:14:06 +00:00
|
|
|
if (scene->r.stamp & R_STAMP_MARKER) {
|
2010-02-06 14:56:25 +00:00
|
|
|
char *name = scene_find_last_marker_name(scene, CFRA);
|
2007-10-28 22:27:07 +00:00
|
|
|
|
2010-02-06 14:56:25 +00:00
|
|
|
if (name) strcpy(text, name);
|
2007-10-28 22:27:07 +00:00
|
|
|
else strcpy(text, "<none>");
|
Patch by GSR #7628, I also added alpha for text background.
The list of changes (some are fixes):
- Properly horizontally centered tags in all fields (bug?).
- File area does not have trailing space and has leading "File " at
start instead (probably a bug).
- Small separation between to time related fields, space saving.
- Removed colons, for consistency and space saving again.
- Frame field is zero aligned for higher visual stability.
- Marker name shows a rarer name, "<none>" (using <> is typical for cases
in which there is nothing: <none>, <empty>, <blank>, etc).
- Top area for misc info that can be really long (file, note and render date).
- Bottom area for more constantly changing but short ones (marker, SMPTE,
frame, camera and scene).
- Only render date moves a line (when note field is not used), and frame one
moves if no SMPTE (still in same line, so no big jump), for extra visual
stability (marker is fixed, assuming most people would show frame and or
SMPTE).
- ISO 8601 date format for render date, localization independant.
Comparision images:
http://www.infernal-iceberg.com/blender/stamp-original.png
http://www.infernal-iceberg.com/blender/stamp-cleanup.png
2007-10-23 22:51:50 +00:00
|
|
|
|
2007-10-28 22:27:07 +00:00
|
|
|
if (do_prefix) sprintf(stamp_data->marker, "Marker %s", text);
|
|
|
|
else sprintf(stamp_data->marker, "%s", text);
|
|
|
|
} else {
|
|
|
|
stamp_data->marker[0] = '\0';
|
Patch by GSR #7628, I also added alpha for text background.
The list of changes (some are fixes):
- Properly horizontally centered tags in all fields (bug?).
- File area does not have trailing space and has leading "File " at
start instead (probably a bug).
- Small separation between to time related fields, space saving.
- Removed colons, for consistency and space saving again.
- Frame field is zero aligned for higher visual stability.
- Marker name shows a rarer name, "<none>" (using <> is typical for cases
in which there is nothing: <none>, <empty>, <blank>, etc).
- Top area for misc info that can be really long (file, note and render date).
- Bottom area for more constantly changing but short ones (marker, SMPTE,
frame, camera and scene).
- Only render date moves a line (when note field is not used), and frame one
moves if no SMPTE (still in same line, so no big jump), for extra visual
stability (marker is fixed, assuming most people would show frame and or
SMPTE).
- ISO 8601 date format for render date, localization independant.
Comparision images:
http://www.infernal-iceberg.com/blender/stamp-original.png
http://www.infernal-iceberg.com/blender/stamp-cleanup.png
2007-10-23 22:51:50 +00:00
|
|
|
}
|
2007-10-28 22:27:07 +00:00
|
|
|
|
2009-01-04 14:14:06 +00:00
|
|
|
if (scene->r.stamp & R_STAMP_TIME) {
|
2007-10-28 22:27:07 +00:00
|
|
|
int h, m, s, f;
|
2007-10-20 16:17:27 +00:00
|
|
|
h= m= s= f= 0;
|
2009-01-04 14:14:06 +00:00
|
|
|
f = (int)(scene->r.cfra % scene->r.frs_sec);
|
|
|
|
s = (int)(scene->r.cfra / scene->r.frs_sec);
|
2007-10-20 16:17:27 +00:00
|
|
|
|
|
|
|
if (s) {
|
|
|
|
m = (int)(s / 60);
|
|
|
|
s %= 60;
|
|
|
|
|
|
|
|
if (m) {
|
|
|
|
h = (int)(m / 60);
|
|
|
|
m %= 60;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-01-04 14:14:06 +00:00
|
|
|
if (scene->r.frs_sec < 100)
|
2007-10-28 22:27:07 +00:00
|
|
|
sprintf (text, "%02d:%02d:%02d.%02d", h, m, s, f);
|
2007-10-20 16:17:27 +00:00
|
|
|
else
|
2007-10-28 22:27:07 +00:00
|
|
|
sprintf (text, "%02d:%02d:%02d.%03d", h, m, s, f);
|
2007-10-20 16:17:27 +00:00
|
|
|
|
2007-10-28 22:27:07 +00:00
|
|
|
if (do_prefix) sprintf(stamp_data->time, "Time %s", text);
|
|
|
|
else sprintf(stamp_data->time, "%s", text);
|
|
|
|
} else {
|
|
|
|
stamp_data->time[0] = '\0';
|
2007-10-20 16:17:27 +00:00
|
|
|
}
|
2007-10-28 22:27:07 +00:00
|
|
|
|
2009-01-04 14:14:06 +00:00
|
|
|
if (scene->r.stamp & R_STAMP_FRAME) {
|
2007-10-28 22:27:07 +00:00
|
|
|
char format[32];
|
2009-08-18 19:26:53 +00:00
|
|
|
if (do_prefix) sprintf(format, "Frame %%0%di", 1 + (int) log10(scene->r.efra));
|
|
|
|
else sprintf(format, "%%0%di", 1 + (int) log10(scene->r.efra));
|
2009-01-04 14:14:06 +00:00
|
|
|
sprintf (stamp_data->frame, format, scene->r.cfra);
|
2007-10-28 22:27:07 +00:00
|
|
|
} else {
|
|
|
|
stamp_data->frame[0] = '\0';
|
2007-10-20 16:17:27 +00:00
|
|
|
}
|
|
|
|
|
2009-01-04 14:14:06 +00:00
|
|
|
if (scene->r.stamp & R_STAMP_CAMERA) {
|
|
|
|
if (scene->camera) strcpy(text, ((Camera *) scene->camera)->id.name+2);
|
2008-05-17 00:35:30 +00:00
|
|
|
else strcpy(text, "<none>");
|
|
|
|
|
|
|
|
if (do_prefix) sprintf(stamp_data->camera, "Camera %s", text);
|
|
|
|
else sprintf(stamp_data->camera, "%s", text);
|
2007-10-28 22:27:07 +00:00
|
|
|
} else {
|
|
|
|
stamp_data->camera[0] = '\0';
|
2007-10-20 16:17:27 +00:00
|
|
|
}
|
|
|
|
|
2009-01-04 14:14:06 +00:00
|
|
|
if (scene->r.stamp & R_STAMP_SCENE) {
|
|
|
|
if (do_prefix) sprintf(stamp_data->scene, "Scene %s", scene->id.name+2);
|
|
|
|
else sprintf(stamp_data->scene, "%s", scene->id.name+2);
|
2007-10-28 22:27:07 +00:00
|
|
|
} else {
|
|
|
|
stamp_data->scene[0] = '\0';
|
|
|
|
}
|
2007-11-08 13:02:59 +00:00
|
|
|
|
2009-01-04 14:14:06 +00:00
|
|
|
if (scene->r.stamp & R_STAMP_SEQSTRIP) {
|
2009-06-08 20:08:19 +00:00
|
|
|
Sequence *seq= NULL; //XXX = get_foreground_frame_seq(scene->r.cfra);
|
2007-11-08 13:02:59 +00:00
|
|
|
|
|
|
|
if (seq) strcpy(text, seq->name+2);
|
|
|
|
else strcpy(text, "<none>");
|
|
|
|
|
|
|
|
if (do_prefix) sprintf(stamp_data->strip, "Strip %s", text);
|
|
|
|
else sprintf(stamp_data->strip, "%s", text);
|
|
|
|
} else {
|
|
|
|
stamp_data->strip[0] = '\0';
|
|
|
|
}
|
2009-10-15 19:18:40 +00:00
|
|
|
|
|
|
|
{
|
2010-03-27 15:35:34 +00:00
|
|
|
Render *re= RE_GetRender(scene->id.name);
|
2009-10-15 19:18:40 +00:00
|
|
|
RenderStats *stats= re ? RE_GetStats(re):NULL;
|
|
|
|
|
|
|
|
if (stats && (scene->r.stamp & R_STAMP_RENDERTIME)) {
|
|
|
|
BLI_timestr(stats->lastframetime, text);
|
|
|
|
|
|
|
|
if (do_prefix) sprintf(stamp_data->rendertime, "RenderTime %s", text);
|
|
|
|
else sprintf(stamp_data->rendertime, "%s", text);
|
|
|
|
} else {
|
|
|
|
stamp_data->rendertime[0] = '\0';
|
|
|
|
}
|
|
|
|
}
|
2007-10-28 22:27:07 +00:00
|
|
|
}
|
|
|
|
|
2009-08-18 19:26:53 +00:00
|
|
|
// XXX - Bad level call.
|
|
|
|
extern int datatoc_bmonofont_ttf_size;
|
|
|
|
extern char datatoc_bmonofont_ttf[];
|
|
|
|
|
BugFix:
[#20854] PROPERTIES STAMP: Rendering stamp flickers in output renders
Blenfont was not thread safe, that is why one thread can change
the font properties (size, dpi, color, etc) at the same time
that the stamp draw on the image, and then the problem.
To make blenfont thread safe I have to change two important things:
1) Every BLF_* function take one argument, the font id.
2) We have two new function to make font "thread safe":
BLF_load_unique
BLF_load_mem_unique
This two function are for case like stamp, that need and own font
that don't share the glyph cache, so can draw without problem
in a different thread.
Why the BLF_*_unique function ?
Because blenfont keep only one copy of a font and keep a list of
"glyph cache". Every glyph cache have size and dpi, so if two
different thread access the same font at the same time, they can
change value and finish with something like the stamp problem.
Why don't remove the glyph cache ?
Because if we do that, we finish with a font object for every size
and dpi, and the stamp is really a special case that happen in
the rendering process, so I really thing is better keep the
glyph cache and make this two new function to handle this
special case.
(When I say "font object" I mean have the same freetype font multiple
times just to have differents size and dpi)
As Matt point we still can have one case that two thread access
the BLF_*_unique function at the same time, but I am looking to
fix this with some class of thread lock.
For now I test and work fine, so if some one found problem, please
let me know.
Campbell I have to change the python api (python/generic/blf_api.c)
to the new syntax, so maybe you can take a look at this.
2010-04-22 10:56:45 +00:00
|
|
|
// XXX - copied from text_font_begin ! Change all the BLF_* here
|
|
|
|
static int mono= -1;
|
2009-08-18 19:26:53 +00:00
|
|
|
|
BugFix:
[#20854] PROPERTIES STAMP: Rendering stamp flickers in output renders
Blenfont was not thread safe, that is why one thread can change
the font properties (size, dpi, color, etc) at the same time
that the stamp draw on the image, and then the problem.
To make blenfont thread safe I have to change two important things:
1) Every BLF_* function take one argument, the font id.
2) We have two new function to make font "thread safe":
BLF_load_unique
BLF_load_mem_unique
This two function are for case like stamp, that need and own font
that don't share the glyph cache, so can draw without problem
in a different thread.
Why the BLF_*_unique function ?
Because blenfont keep only one copy of a font and keep a list of
"glyph cache". Every glyph cache have size and dpi, so if two
different thread access the same font at the same time, they can
change value and finish with something like the stamp problem.
Why don't remove the glyph cache ?
Because if we do that, we finish with a font object for every size
and dpi, and the stamp is really a special case that happen in
the rendering process, so I really thing is better keep the
glyph cache and make this two new function to handle this
special case.
(When I say "font object" I mean have the same freetype font multiple
times just to have differents size and dpi)
As Matt point we still can have one case that two thread access
the BLF_*_unique function at the same time, but I am looking to
fix this with some class of thread lock.
For now I test and work fine, so if some one found problem, please
let me know.
Campbell I have to change the python api (python/generic/blf_api.c)
to the new syntax, so maybe you can take a look at this.
2010-04-22 10:56:45 +00:00
|
|
|
int stamp_font_begin(int size)
|
|
|
|
{
|
2009-08-18 19:26:53 +00:00
|
|
|
if (mono == -1)
|
BugFix:
[#20854] PROPERTIES STAMP: Rendering stamp flickers in output renders
Blenfont was not thread safe, that is why one thread can change
the font properties (size, dpi, color, etc) at the same time
that the stamp draw on the image, and then the problem.
To make blenfont thread safe I have to change two important things:
1) Every BLF_* function take one argument, the font id.
2) We have two new function to make font "thread safe":
BLF_load_unique
BLF_load_mem_unique
This two function are for case like stamp, that need and own font
that don't share the glyph cache, so can draw without problem
in a different thread.
Why the BLF_*_unique function ?
Because blenfont keep only one copy of a font and keep a list of
"glyph cache". Every glyph cache have size and dpi, so if two
different thread access the same font at the same time, they can
change value and finish with something like the stamp problem.
Why don't remove the glyph cache ?
Because if we do that, we finish with a font object for every size
and dpi, and the stamp is really a special case that happen in
the rendering process, so I really thing is better keep the
glyph cache and make this two new function to handle this
special case.
(When I say "font object" I mean have the same freetype font multiple
times just to have differents size and dpi)
As Matt point we still can have one case that two thread access
the BLF_*_unique function at the same time, but I am looking to
fix this with some class of thread lock.
For now I test and work fine, so if some one found problem, please
let me know.
Campbell I have to change the python api (python/generic/blf_api.c)
to the new syntax, so maybe you can take a look at this.
2010-04-22 10:56:45 +00:00
|
|
|
mono= BLF_load_mem_unique("monospace", (unsigned char *)datatoc_bmonofont_ttf, datatoc_bmonofont_ttf_size);
|
2009-08-18 19:26:53 +00:00
|
|
|
|
BugFix:
[#20854] PROPERTIES STAMP: Rendering stamp flickers in output renders
Blenfont was not thread safe, that is why one thread can change
the font properties (size, dpi, color, etc) at the same time
that the stamp draw on the image, and then the problem.
To make blenfont thread safe I have to change two important things:
1) Every BLF_* function take one argument, the font id.
2) We have two new function to make font "thread safe":
BLF_load_unique
BLF_load_mem_unique
This two function are for case like stamp, that need and own font
that don't share the glyph cache, so can draw without problem
in a different thread.
Why the BLF_*_unique function ?
Because blenfont keep only one copy of a font and keep a list of
"glyph cache". Every glyph cache have size and dpi, so if two
different thread access the same font at the same time, they can
change value and finish with something like the stamp problem.
Why don't remove the glyph cache ?
Because if we do that, we finish with a font object for every size
and dpi, and the stamp is really a special case that happen in
the rendering process, so I really thing is better keep the
glyph cache and make this two new function to handle this
special case.
(When I say "font object" I mean have the same freetype font multiple
times just to have differents size and dpi)
As Matt point we still can have one case that two thread access
the BLF_*_unique function at the same time, but I am looking to
fix this with some class of thread lock.
For now I test and work fine, so if some one found problem, please
let me know.
Campbell I have to change the python api (python/generic/blf_api.c)
to the new syntax, so maybe you can take a look at this.
2010-04-22 10:56:45 +00:00
|
|
|
BLF_aspect(mono, 1.0);
|
|
|
|
BLF_size(mono, size, 72);
|
|
|
|
return(mono); // XXX This is for image_gen.c!!
|
2009-08-18 19:26:53 +00:00
|
|
|
}
|
|
|
|
|
2009-01-04 14:14:06 +00:00
|
|
|
void BKE_stamp_buf(Scene *scene, unsigned char *rect, float *rectf, int width, int height, int channels)
|
2007-10-28 22:27:07 +00:00
|
|
|
{
|
|
|
|
struct StampData stamp_data;
|
2009-08-18 19:26:53 +00:00
|
|
|
float w, h, pad;
|
|
|
|
int x, y;
|
2007-10-28 22:27:07 +00:00
|
|
|
|
|
|
|
if (!rect && !rectf)
|
|
|
|
return;
|
|
|
|
|
2009-01-04 14:14:06 +00:00
|
|
|
stampdata(scene, &stamp_data, 1);
|
2009-10-15 19:18:40 +00:00
|
|
|
|
|
|
|
/* TODO, do_versions */
|
|
|
|
if(scene->r.stamp_font_id < 8)
|
|
|
|
scene->r.stamp_font_id= 12;
|
|
|
|
|
|
|
|
stamp_font_begin(scene->r.stamp_font_id);
|
2009-08-18 19:26:53 +00:00
|
|
|
|
BugFix:
[#20854] PROPERTIES STAMP: Rendering stamp flickers in output renders
Blenfont was not thread safe, that is why one thread can change
the font properties (size, dpi, color, etc) at the same time
that the stamp draw on the image, and then the problem.
To make blenfont thread safe I have to change two important things:
1) Every BLF_* function take one argument, the font id.
2) We have two new function to make font "thread safe":
BLF_load_unique
BLF_load_mem_unique
This two function are for case like stamp, that need and own font
that don't share the glyph cache, so can draw without problem
in a different thread.
Why the BLF_*_unique function ?
Because blenfont keep only one copy of a font and keep a list of
"glyph cache". Every glyph cache have size and dpi, so if two
different thread access the same font at the same time, they can
change value and finish with something like the stamp problem.
Why don't remove the glyph cache ?
Because if we do that, we finish with a font object for every size
and dpi, and the stamp is really a special case that happen in
the rendering process, so I really thing is better keep the
glyph cache and make this two new function to handle this
special case.
(When I say "font object" I mean have the same freetype font multiple
times just to have differents size and dpi)
As Matt point we still can have one case that two thread access
the BLF_*_unique function at the same time, but I am looking to
fix this with some class of thread lock.
For now I test and work fine, so if some one found problem, please
let me know.
Campbell I have to change the python api (python/generic/blf_api.c)
to the new syntax, so maybe you can take a look at this.
2010-04-22 10:56:45 +00:00
|
|
|
BLF_buffer(mono, rectf, rect, width, height, channels);
|
|
|
|
BLF_buffer_col(mono, scene->r.fg_stamp[0], scene->r.fg_stamp[1], scene->r.fg_stamp[2], 1.0);
|
|
|
|
pad= BLF_width(mono, "--");
|
2009-08-18 19:26:53 +00:00
|
|
|
|
|
|
|
x= 0;
|
|
|
|
y= height;
|
|
|
|
|
2007-10-28 22:27:07 +00:00
|
|
|
if (stamp_data.file[0]) {
|
|
|
|
/* Top left corner */
|
BugFix:
[#20854] PROPERTIES STAMP: Rendering stamp flickers in output renders
Blenfont was not thread safe, that is why one thread can change
the font properties (size, dpi, color, etc) at the same time
that the stamp draw on the image, and then the problem.
To make blenfont thread safe I have to change two important things:
1) Every BLF_* function take one argument, the font id.
2) We have two new function to make font "thread safe":
BLF_load_unique
BLF_load_mem_unique
This two function are for case like stamp, that need and own font
that don't share the glyph cache, so can draw without problem
in a different thread.
Why the BLF_*_unique function ?
Because blenfont keep only one copy of a font and keep a list of
"glyph cache". Every glyph cache have size and dpi, so if two
different thread access the same font at the same time, they can
change value and finish with something like the stamp problem.
Why don't remove the glyph cache ?
Because if we do that, we finish with a font object for every size
and dpi, and the stamp is really a special case that happen in
the rendering process, so I really thing is better keep the
glyph cache and make this two new function to handle this
special case.
(When I say "font object" I mean have the same freetype font multiple
times just to have differents size and dpi)
As Matt point we still can have one case that two thread access
the BLF_*_unique function at the same time, but I am looking to
fix this with some class of thread lock.
For now I test and work fine, so if some one found problem, please
let me know.
Campbell I have to change the python api (python/generic/blf_api.c)
to the new syntax, so maybe you can take a look at this.
2010-04-22 10:56:45 +00:00
|
|
|
BLF_width_and_height(mono, stamp_data.file, &w, &h);
|
2009-08-18 19:26:53 +00:00
|
|
|
y -= h;
|
|
|
|
|
|
|
|
/* also a little of space to the background. */
|
|
|
|
buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, x, y-3, w+3, y+h+3);
|
|
|
|
|
|
|
|
/* and draw the text. */
|
BugFix:
[#20854] PROPERTIES STAMP: Rendering stamp flickers in output renders
Blenfont was not thread safe, that is why one thread can change
the font properties (size, dpi, color, etc) at the same time
that the stamp draw on the image, and then the problem.
To make blenfont thread safe I have to change two important things:
1) Every BLF_* function take one argument, the font id.
2) We have two new function to make font "thread safe":
BLF_load_unique
BLF_load_mem_unique
This two function are for case like stamp, that need and own font
that don't share the glyph cache, so can draw without problem
in a different thread.
Why the BLF_*_unique function ?
Because blenfont keep only one copy of a font and keep a list of
"glyph cache". Every glyph cache have size and dpi, so if two
different thread access the same font at the same time, they can
change value and finish with something like the stamp problem.
Why don't remove the glyph cache ?
Because if we do that, we finish with a font object for every size
and dpi, and the stamp is really a special case that happen in
the rendering process, so I really thing is better keep the
glyph cache and make this two new function to handle this
special case.
(When I say "font object" I mean have the same freetype font multiple
times just to have differents size and dpi)
As Matt point we still can have one case that two thread access
the BLF_*_unique function at the same time, but I am looking to
fix this with some class of thread lock.
For now I test and work fine, so if some one found problem, please
let me know.
Campbell I have to change the python api (python/generic/blf_api.c)
to the new syntax, so maybe you can take a look at this.
2010-04-22 10:56:45 +00:00
|
|
|
BLF_position(mono, x, y, 0.0);
|
|
|
|
BLF_draw_buffer(mono, stamp_data.file);
|
2009-08-18 19:26:53 +00:00
|
|
|
|
|
|
|
/* the extra pixel for background. */
|
|
|
|
y -= 4;
|
2007-10-28 22:27:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Top left corner, below File */
|
|
|
|
if (stamp_data.note[0]) {
|
BugFix:
[#20854] PROPERTIES STAMP: Rendering stamp flickers in output renders
Blenfont was not thread safe, that is why one thread can change
the font properties (size, dpi, color, etc) at the same time
that the stamp draw on the image, and then the problem.
To make blenfont thread safe I have to change two important things:
1) Every BLF_* function take one argument, the font id.
2) We have two new function to make font "thread safe":
BLF_load_unique
BLF_load_mem_unique
This two function are for case like stamp, that need and own font
that don't share the glyph cache, so can draw without problem
in a different thread.
Why the BLF_*_unique function ?
Because blenfont keep only one copy of a font and keep a list of
"glyph cache". Every glyph cache have size and dpi, so if two
different thread access the same font at the same time, they can
change value and finish with something like the stamp problem.
Why don't remove the glyph cache ?
Because if we do that, we finish with a font object for every size
and dpi, and the stamp is really a special case that happen in
the rendering process, so I really thing is better keep the
glyph cache and make this two new function to handle this
special case.
(When I say "font object" I mean have the same freetype font multiple
times just to have differents size and dpi)
As Matt point we still can have one case that two thread access
the BLF_*_unique function at the same time, but I am looking to
fix this with some class of thread lock.
For now I test and work fine, so if some one found problem, please
let me know.
Campbell I have to change the python api (python/generic/blf_api.c)
to the new syntax, so maybe you can take a look at this.
2010-04-22 10:56:45 +00:00
|
|
|
BLF_width_and_height(mono, stamp_data.note, &w, &h);
|
2009-08-18 19:26:53 +00:00
|
|
|
y -= h;
|
|
|
|
|
|
|
|
/* and space for background. */
|
|
|
|
buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, 0, y-2, w+3, y+h+2);
|
|
|
|
|
BugFix:
[#20854] PROPERTIES STAMP: Rendering stamp flickers in output renders
Blenfont was not thread safe, that is why one thread can change
the font properties (size, dpi, color, etc) at the same time
that the stamp draw on the image, and then the problem.
To make blenfont thread safe I have to change two important things:
1) Every BLF_* function take one argument, the font id.
2) We have two new function to make font "thread safe":
BLF_load_unique
BLF_load_mem_unique
This two function are for case like stamp, that need and own font
that don't share the glyph cache, so can draw without problem
in a different thread.
Why the BLF_*_unique function ?
Because blenfont keep only one copy of a font and keep a list of
"glyph cache". Every glyph cache have size and dpi, so if two
different thread access the same font at the same time, they can
change value and finish with something like the stamp problem.
Why don't remove the glyph cache ?
Because if we do that, we finish with a font object for every size
and dpi, and the stamp is really a special case that happen in
the rendering process, so I really thing is better keep the
glyph cache and make this two new function to handle this
special case.
(When I say "font object" I mean have the same freetype font multiple
times just to have differents size and dpi)
As Matt point we still can have one case that two thread access
the BLF_*_unique function at the same time, but I am looking to
fix this with some class of thread lock.
For now I test and work fine, so if some one found problem, please
let me know.
Campbell I have to change the python api (python/generic/blf_api.c)
to the new syntax, so maybe you can take a look at this.
2010-04-22 10:56:45 +00:00
|
|
|
BLF_position(mono, x, y+1, 0.0);
|
|
|
|
BLF_draw_buffer(mono, stamp_data.note);
|
2009-08-18 19:26:53 +00:00
|
|
|
|
|
|
|
/* the extra pixel for background. */
|
|
|
|
y -= 4;
|
2007-10-28 22:27:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Top left corner, below File (or Note) */
|
|
|
|
if (stamp_data.date[0]) {
|
BugFix:
[#20854] PROPERTIES STAMP: Rendering stamp flickers in output renders
Blenfont was not thread safe, that is why one thread can change
the font properties (size, dpi, color, etc) at the same time
that the stamp draw on the image, and then the problem.
To make blenfont thread safe I have to change two important things:
1) Every BLF_* function take one argument, the font id.
2) We have two new function to make font "thread safe":
BLF_load_unique
BLF_load_mem_unique
This two function are for case like stamp, that need and own font
that don't share the glyph cache, so can draw without problem
in a different thread.
Why the BLF_*_unique function ?
Because blenfont keep only one copy of a font and keep a list of
"glyph cache". Every glyph cache have size and dpi, so if two
different thread access the same font at the same time, they can
change value and finish with something like the stamp problem.
Why don't remove the glyph cache ?
Because if we do that, we finish with a font object for every size
and dpi, and the stamp is really a special case that happen in
the rendering process, so I really thing is better keep the
glyph cache and make this two new function to handle this
special case.
(When I say "font object" I mean have the same freetype font multiple
times just to have differents size and dpi)
As Matt point we still can have one case that two thread access
the BLF_*_unique function at the same time, but I am looking to
fix this with some class of thread lock.
For now I test and work fine, so if some one found problem, please
let me know.
Campbell I have to change the python api (python/generic/blf_api.c)
to the new syntax, so maybe you can take a look at this.
2010-04-22 10:56:45 +00:00
|
|
|
BLF_width_and_height(mono, stamp_data.date, &w, &h);
|
2009-08-18 19:26:53 +00:00
|
|
|
y -= h;
|
|
|
|
|
|
|
|
/* and space for background. */
|
|
|
|
buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, 0, y-3, w+3, y+h+3);
|
|
|
|
|
BugFix:
[#20854] PROPERTIES STAMP: Rendering stamp flickers in output renders
Blenfont was not thread safe, that is why one thread can change
the font properties (size, dpi, color, etc) at the same time
that the stamp draw on the image, and then the problem.
To make blenfont thread safe I have to change two important things:
1) Every BLF_* function take one argument, the font id.
2) We have two new function to make font "thread safe":
BLF_load_unique
BLF_load_mem_unique
This two function are for case like stamp, that need and own font
that don't share the glyph cache, so can draw without problem
in a different thread.
Why the BLF_*_unique function ?
Because blenfont keep only one copy of a font and keep a list of
"glyph cache". Every glyph cache have size and dpi, so if two
different thread access the same font at the same time, they can
change value and finish with something like the stamp problem.
Why don't remove the glyph cache ?
Because if we do that, we finish with a font object for every size
and dpi, and the stamp is really a special case that happen in
the rendering process, so I really thing is better keep the
glyph cache and make this two new function to handle this
special case.
(When I say "font object" I mean have the same freetype font multiple
times just to have differents size and dpi)
As Matt point we still can have one case that two thread access
the BLF_*_unique function at the same time, but I am looking to
fix this with some class of thread lock.
For now I test and work fine, so if some one found problem, please
let me know.
Campbell I have to change the python api (python/generic/blf_api.c)
to the new syntax, so maybe you can take a look at this.
2010-04-22 10:56:45 +00:00
|
|
|
BLF_position(mono, x, y, 0.0);
|
|
|
|
BLF_draw_buffer(mono, stamp_data.date);
|
2009-10-15 19:18:40 +00:00
|
|
|
|
|
|
|
/* the extra pixel for background. */
|
|
|
|
y -= 4;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Top left corner, below File, Date or Note */
|
|
|
|
if (stamp_data.rendertime[0]) {
|
BugFix:
[#20854] PROPERTIES STAMP: Rendering stamp flickers in output renders
Blenfont was not thread safe, that is why one thread can change
the font properties (size, dpi, color, etc) at the same time
that the stamp draw on the image, and then the problem.
To make blenfont thread safe I have to change two important things:
1) Every BLF_* function take one argument, the font id.
2) We have two new function to make font "thread safe":
BLF_load_unique
BLF_load_mem_unique
This two function are for case like stamp, that need and own font
that don't share the glyph cache, so can draw without problem
in a different thread.
Why the BLF_*_unique function ?
Because blenfont keep only one copy of a font and keep a list of
"glyph cache". Every glyph cache have size and dpi, so if two
different thread access the same font at the same time, they can
change value and finish with something like the stamp problem.
Why don't remove the glyph cache ?
Because if we do that, we finish with a font object for every size
and dpi, and the stamp is really a special case that happen in
the rendering process, so I really thing is better keep the
glyph cache and make this two new function to handle this
special case.
(When I say "font object" I mean have the same freetype font multiple
times just to have differents size and dpi)
As Matt point we still can have one case that two thread access
the BLF_*_unique function at the same time, but I am looking to
fix this with some class of thread lock.
For now I test and work fine, so if some one found problem, please
let me know.
Campbell I have to change the python api (python/generic/blf_api.c)
to the new syntax, so maybe you can take a look at this.
2010-04-22 10:56:45 +00:00
|
|
|
BLF_width_and_height(mono, stamp_data.rendertime, &w, &h);
|
2009-10-15 19:18:40 +00:00
|
|
|
y -= h;
|
|
|
|
|
|
|
|
/* and space for background. */
|
|
|
|
buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, 0, y-3, w+3, y+h+3);
|
|
|
|
|
BugFix:
[#20854] PROPERTIES STAMP: Rendering stamp flickers in output renders
Blenfont was not thread safe, that is why one thread can change
the font properties (size, dpi, color, etc) at the same time
that the stamp draw on the image, and then the problem.
To make blenfont thread safe I have to change two important things:
1) Every BLF_* function take one argument, the font id.
2) We have two new function to make font "thread safe":
BLF_load_unique
BLF_load_mem_unique
This two function are for case like stamp, that need and own font
that don't share the glyph cache, so can draw without problem
in a different thread.
Why the BLF_*_unique function ?
Because blenfont keep only one copy of a font and keep a list of
"glyph cache". Every glyph cache have size and dpi, so if two
different thread access the same font at the same time, they can
change value and finish with something like the stamp problem.
Why don't remove the glyph cache ?
Because if we do that, we finish with a font object for every size
and dpi, and the stamp is really a special case that happen in
the rendering process, so I really thing is better keep the
glyph cache and make this two new function to handle this
special case.
(When I say "font object" I mean have the same freetype font multiple
times just to have differents size and dpi)
As Matt point we still can have one case that two thread access
the BLF_*_unique function at the same time, but I am looking to
fix this with some class of thread lock.
For now I test and work fine, so if some one found problem, please
let me know.
Campbell I have to change the python api (python/generic/blf_api.c)
to the new syntax, so maybe you can take a look at this.
2010-04-22 10:56:45 +00:00
|
|
|
BLF_position(mono, x, y, 0.0);
|
|
|
|
BLF_draw_buffer(mono, stamp_data.rendertime);
|
2007-10-28 22:27:07 +00:00
|
|
|
}
|
|
|
|
|
2009-08-18 19:26:53 +00:00
|
|
|
x= 0;
|
|
|
|
y= 0;
|
|
|
|
|
2007-10-28 22:27:07 +00:00
|
|
|
/* Bottom left corner, leaving space for timing */
|
|
|
|
if (stamp_data.marker[0]) {
|
BugFix:
[#20854] PROPERTIES STAMP: Rendering stamp flickers in output renders
Blenfont was not thread safe, that is why one thread can change
the font properties (size, dpi, color, etc) at the same time
that the stamp draw on the image, and then the problem.
To make blenfont thread safe I have to change two important things:
1) Every BLF_* function take one argument, the font id.
2) We have two new function to make font "thread safe":
BLF_load_unique
BLF_load_mem_unique
This two function are for case like stamp, that need and own font
that don't share the glyph cache, so can draw without problem
in a different thread.
Why the BLF_*_unique function ?
Because blenfont keep only one copy of a font and keep a list of
"glyph cache". Every glyph cache have size and dpi, so if two
different thread access the same font at the same time, they can
change value and finish with something like the stamp problem.
Why don't remove the glyph cache ?
Because if we do that, we finish with a font object for every size
and dpi, and the stamp is really a special case that happen in
the rendering process, so I really thing is better keep the
glyph cache and make this two new function to handle this
special case.
(When I say "font object" I mean have the same freetype font multiple
times just to have differents size and dpi)
As Matt point we still can have one case that two thread access
the BLF_*_unique function at the same time, but I am looking to
fix this with some class of thread lock.
For now I test and work fine, so if some one found problem, please
let me know.
Campbell I have to change the python api (python/generic/blf_api.c)
to the new syntax, so maybe you can take a look at this.
2010-04-22 10:56:45 +00:00
|
|
|
BLF_width_and_height(mono, stamp_data.marker, &w, &h);
|
2009-08-18 19:26:53 +00:00
|
|
|
|
|
|
|
/* extra space for background. */
|
|
|
|
buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, x, y, w+2, y+h+3);
|
|
|
|
|
|
|
|
/* and pad the text. */
|
BugFix:
[#20854] PROPERTIES STAMP: Rendering stamp flickers in output renders
Blenfont was not thread safe, that is why one thread can change
the font properties (size, dpi, color, etc) at the same time
that the stamp draw on the image, and then the problem.
To make blenfont thread safe I have to change two important things:
1) Every BLF_* function take one argument, the font id.
2) We have two new function to make font "thread safe":
BLF_load_unique
BLF_load_mem_unique
This two function are for case like stamp, that need and own font
that don't share the glyph cache, so can draw without problem
in a different thread.
Why the BLF_*_unique function ?
Because blenfont keep only one copy of a font and keep a list of
"glyph cache". Every glyph cache have size and dpi, so if two
different thread access the same font at the same time, they can
change value and finish with something like the stamp problem.
Why don't remove the glyph cache ?
Because if we do that, we finish with a font object for every size
and dpi, and the stamp is really a special case that happen in
the rendering process, so I really thing is better keep the
glyph cache and make this two new function to handle this
special case.
(When I say "font object" I mean have the same freetype font multiple
times just to have differents size and dpi)
As Matt point we still can have one case that two thread access
the BLF_*_unique function at the same time, but I am looking to
fix this with some class of thread lock.
For now I test and work fine, so if some one found problem, please
let me know.
Campbell I have to change the python api (python/generic/blf_api.c)
to the new syntax, so maybe you can take a look at this.
2010-04-22 10:56:45 +00:00
|
|
|
BLF_position(mono, x, y+3, 0.0);
|
|
|
|
BLF_draw_buffer(mono, stamp_data.marker);
|
2009-08-18 19:26:53 +00:00
|
|
|
|
|
|
|
/* space width. */
|
|
|
|
x += w + pad;
|
2007-10-28 22:27:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Left bottom corner */
|
|
|
|
if (stamp_data.time[0]) {
|
BugFix:
[#20854] PROPERTIES STAMP: Rendering stamp flickers in output renders
Blenfont was not thread safe, that is why one thread can change
the font properties (size, dpi, color, etc) at the same time
that the stamp draw on the image, and then the problem.
To make blenfont thread safe I have to change two important things:
1) Every BLF_* function take one argument, the font id.
2) We have two new function to make font "thread safe":
BLF_load_unique
BLF_load_mem_unique
This two function are for case like stamp, that need and own font
that don't share the glyph cache, so can draw without problem
in a different thread.
Why the BLF_*_unique function ?
Because blenfont keep only one copy of a font and keep a list of
"glyph cache". Every glyph cache have size and dpi, so if two
different thread access the same font at the same time, they can
change value and finish with something like the stamp problem.
Why don't remove the glyph cache ?
Because if we do that, we finish with a font object for every size
and dpi, and the stamp is really a special case that happen in
the rendering process, so I really thing is better keep the
glyph cache and make this two new function to handle this
special case.
(When I say "font object" I mean have the same freetype font multiple
times just to have differents size and dpi)
As Matt point we still can have one case that two thread access
the BLF_*_unique function at the same time, but I am looking to
fix this with some class of thread lock.
For now I test and work fine, so if some one found problem, please
let me know.
Campbell I have to change the python api (python/generic/blf_api.c)
to the new syntax, so maybe you can take a look at this.
2010-04-22 10:56:45 +00:00
|
|
|
BLF_width_and_height(mono, stamp_data.time, &w, &h);
|
2009-08-18 19:26:53 +00:00
|
|
|
|
|
|
|
/* extra space for background */
|
|
|
|
buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, x, y, x+w+2, y+h+3);
|
|
|
|
|
|
|
|
/* and pad the text. */
|
BugFix:
[#20854] PROPERTIES STAMP: Rendering stamp flickers in output renders
Blenfont was not thread safe, that is why one thread can change
the font properties (size, dpi, color, etc) at the same time
that the stamp draw on the image, and then the problem.
To make blenfont thread safe I have to change two important things:
1) Every BLF_* function take one argument, the font id.
2) We have two new function to make font "thread safe":
BLF_load_unique
BLF_load_mem_unique
This two function are for case like stamp, that need and own font
that don't share the glyph cache, so can draw without problem
in a different thread.
Why the BLF_*_unique function ?
Because blenfont keep only one copy of a font and keep a list of
"glyph cache". Every glyph cache have size and dpi, so if two
different thread access the same font at the same time, they can
change value and finish with something like the stamp problem.
Why don't remove the glyph cache ?
Because if we do that, we finish with a font object for every size
and dpi, and the stamp is really a special case that happen in
the rendering process, so I really thing is better keep the
glyph cache and make this two new function to handle this
special case.
(When I say "font object" I mean have the same freetype font multiple
times just to have differents size and dpi)
As Matt point we still can have one case that two thread access
the BLF_*_unique function at the same time, but I am looking to
fix this with some class of thread lock.
For now I test and work fine, so if some one found problem, please
let me know.
Campbell I have to change the python api (python/generic/blf_api.c)
to the new syntax, so maybe you can take a look at this.
2010-04-22 10:56:45 +00:00
|
|
|
BLF_position(mono, x, y+3, 0.0);
|
|
|
|
BLF_draw_buffer(mono, stamp_data.time);
|
2009-08-18 19:26:53 +00:00
|
|
|
|
|
|
|
/* space width. */
|
|
|
|
x += w + pad;
|
2007-10-28 22:27:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (stamp_data.frame[0]) {
|
BugFix:
[#20854] PROPERTIES STAMP: Rendering stamp flickers in output renders
Blenfont was not thread safe, that is why one thread can change
the font properties (size, dpi, color, etc) at the same time
that the stamp draw on the image, and then the problem.
To make blenfont thread safe I have to change two important things:
1) Every BLF_* function take one argument, the font id.
2) We have two new function to make font "thread safe":
BLF_load_unique
BLF_load_mem_unique
This two function are for case like stamp, that need and own font
that don't share the glyph cache, so can draw without problem
in a different thread.
Why the BLF_*_unique function ?
Because blenfont keep only one copy of a font and keep a list of
"glyph cache". Every glyph cache have size and dpi, so if two
different thread access the same font at the same time, they can
change value and finish with something like the stamp problem.
Why don't remove the glyph cache ?
Because if we do that, we finish with a font object for every size
and dpi, and the stamp is really a special case that happen in
the rendering process, so I really thing is better keep the
glyph cache and make this two new function to handle this
special case.
(When I say "font object" I mean have the same freetype font multiple
times just to have differents size and dpi)
As Matt point we still can have one case that two thread access
the BLF_*_unique function at the same time, but I am looking to
fix this with some class of thread lock.
For now I test and work fine, so if some one found problem, please
let me know.
Campbell I have to change the python api (python/generic/blf_api.c)
to the new syntax, so maybe you can take a look at this.
2010-04-22 10:56:45 +00:00
|
|
|
BLF_width_and_height(mono, stamp_data.frame, &w, &h);
|
2009-08-18 19:26:53 +00:00
|
|
|
|
|
|
|
/* extra space for background. */
|
|
|
|
buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, x, y, x+w+2, y+h+3);
|
|
|
|
|
|
|
|
/* and pad the text. */
|
BugFix:
[#20854] PROPERTIES STAMP: Rendering stamp flickers in output renders
Blenfont was not thread safe, that is why one thread can change
the font properties (size, dpi, color, etc) at the same time
that the stamp draw on the image, and then the problem.
To make blenfont thread safe I have to change two important things:
1) Every BLF_* function take one argument, the font id.
2) We have two new function to make font "thread safe":
BLF_load_unique
BLF_load_mem_unique
This two function are for case like stamp, that need and own font
that don't share the glyph cache, so can draw without problem
in a different thread.
Why the BLF_*_unique function ?
Because blenfont keep only one copy of a font and keep a list of
"glyph cache". Every glyph cache have size and dpi, so if two
different thread access the same font at the same time, they can
change value and finish with something like the stamp problem.
Why don't remove the glyph cache ?
Because if we do that, we finish with a font object for every size
and dpi, and the stamp is really a special case that happen in
the rendering process, so I really thing is better keep the
glyph cache and make this two new function to handle this
special case.
(When I say "font object" I mean have the same freetype font multiple
times just to have differents size and dpi)
As Matt point we still can have one case that two thread access
the BLF_*_unique function at the same time, but I am looking to
fix this with some class of thread lock.
For now I test and work fine, so if some one found problem, please
let me know.
Campbell I have to change the python api (python/generic/blf_api.c)
to the new syntax, so maybe you can take a look at this.
2010-04-22 10:56:45 +00:00
|
|
|
BLF_position(mono, x, y+3, 0.0);
|
|
|
|
BLF_draw_buffer(mono, stamp_data.frame);
|
2009-08-18 19:26:53 +00:00
|
|
|
|
|
|
|
/* space width. */
|
|
|
|
x += w + pad;
|
2007-10-28 22:27:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (stamp_data.camera[0]) {
|
BugFix:
[#20854] PROPERTIES STAMP: Rendering stamp flickers in output renders
Blenfont was not thread safe, that is why one thread can change
the font properties (size, dpi, color, etc) at the same time
that the stamp draw on the image, and then the problem.
To make blenfont thread safe I have to change two important things:
1) Every BLF_* function take one argument, the font id.
2) We have two new function to make font "thread safe":
BLF_load_unique
BLF_load_mem_unique
This two function are for case like stamp, that need and own font
that don't share the glyph cache, so can draw without problem
in a different thread.
Why the BLF_*_unique function ?
Because blenfont keep only one copy of a font and keep a list of
"glyph cache". Every glyph cache have size and dpi, so if two
different thread access the same font at the same time, they can
change value and finish with something like the stamp problem.
Why don't remove the glyph cache ?
Because if we do that, we finish with a font object for every size
and dpi, and the stamp is really a special case that happen in
the rendering process, so I really thing is better keep the
glyph cache and make this two new function to handle this
special case.
(When I say "font object" I mean have the same freetype font multiple
times just to have differents size and dpi)
As Matt point we still can have one case that two thread access
the BLF_*_unique function at the same time, but I am looking to
fix this with some class of thread lock.
For now I test and work fine, so if some one found problem, please
let me know.
Campbell I have to change the python api (python/generic/blf_api.c)
to the new syntax, so maybe you can take a look at this.
2010-04-22 10:56:45 +00:00
|
|
|
BLF_width_and_height(mono, stamp_data.camera, &w, &h);
|
2009-08-18 19:26:53 +00:00
|
|
|
|
|
|
|
/* extra space for background. */
|
|
|
|
buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, x, y, x+w+2, y+h+3);
|
BugFix:
[#20854] PROPERTIES STAMP: Rendering stamp flickers in output renders
Blenfont was not thread safe, that is why one thread can change
the font properties (size, dpi, color, etc) at the same time
that the stamp draw on the image, and then the problem.
To make blenfont thread safe I have to change two important things:
1) Every BLF_* function take one argument, the font id.
2) We have two new function to make font "thread safe":
BLF_load_unique
BLF_load_mem_unique
This two function are for case like stamp, that need and own font
that don't share the glyph cache, so can draw without problem
in a different thread.
Why the BLF_*_unique function ?
Because blenfont keep only one copy of a font and keep a list of
"glyph cache". Every glyph cache have size and dpi, so if two
different thread access the same font at the same time, they can
change value and finish with something like the stamp problem.
Why don't remove the glyph cache ?
Because if we do that, we finish with a font object for every size
and dpi, and the stamp is really a special case that happen in
the rendering process, so I really thing is better keep the
glyph cache and make this two new function to handle this
special case.
(When I say "font object" I mean have the same freetype font multiple
times just to have differents size and dpi)
As Matt point we still can have one case that two thread access
the BLF_*_unique function at the same time, but I am looking to
fix this with some class of thread lock.
For now I test and work fine, so if some one found problem, please
let me know.
Campbell I have to change the python api (python/generic/blf_api.c)
to the new syntax, so maybe you can take a look at this.
2010-04-22 10:56:45 +00:00
|
|
|
BLF_position(mono, x, y+3, 0.0);
|
|
|
|
BLF_draw_buffer(mono, stamp_data.camera);
|
2007-10-28 22:27:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (stamp_data.scene[0]) {
|
BugFix:
[#20854] PROPERTIES STAMP: Rendering stamp flickers in output renders
Blenfont was not thread safe, that is why one thread can change
the font properties (size, dpi, color, etc) at the same time
that the stamp draw on the image, and then the problem.
To make blenfont thread safe I have to change two important things:
1) Every BLF_* function take one argument, the font id.
2) We have two new function to make font "thread safe":
BLF_load_unique
BLF_load_mem_unique
This two function are for case like stamp, that need and own font
that don't share the glyph cache, so can draw without problem
in a different thread.
Why the BLF_*_unique function ?
Because blenfont keep only one copy of a font and keep a list of
"glyph cache". Every glyph cache have size and dpi, so if two
different thread access the same font at the same time, they can
change value and finish with something like the stamp problem.
Why don't remove the glyph cache ?
Because if we do that, we finish with a font object for every size
and dpi, and the stamp is really a special case that happen in
the rendering process, so I really thing is better keep the
glyph cache and make this two new function to handle this
special case.
(When I say "font object" I mean have the same freetype font multiple
times just to have differents size and dpi)
As Matt point we still can have one case that two thread access
the BLF_*_unique function at the same time, but I am looking to
fix this with some class of thread lock.
For now I test and work fine, so if some one found problem, please
let me know.
Campbell I have to change the python api (python/generic/blf_api.c)
to the new syntax, so maybe you can take a look at this.
2010-04-22 10:56:45 +00:00
|
|
|
BLF_width_and_height(mono, stamp_data.scene, &w, &h);
|
2009-08-18 19:26:53 +00:00
|
|
|
|
|
|
|
/* Bottom right corner, with an extra space because blenfont is too strict! */
|
|
|
|
x= width - w - 2;
|
|
|
|
|
|
|
|
/* extra space for background. */
|
|
|
|
buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, x, y, x+w+3, y+h+3);
|
|
|
|
|
|
|
|
/* and pad the text. */
|
BugFix:
[#20854] PROPERTIES STAMP: Rendering stamp flickers in output renders
Blenfont was not thread safe, that is why one thread can change
the font properties (size, dpi, color, etc) at the same time
that the stamp draw on the image, and then the problem.
To make blenfont thread safe I have to change two important things:
1) Every BLF_* function take one argument, the font id.
2) We have two new function to make font "thread safe":
BLF_load_unique
BLF_load_mem_unique
This two function are for case like stamp, that need and own font
that don't share the glyph cache, so can draw without problem
in a different thread.
Why the BLF_*_unique function ?
Because blenfont keep only one copy of a font and keep a list of
"glyph cache". Every glyph cache have size and dpi, so if two
different thread access the same font at the same time, they can
change value and finish with something like the stamp problem.
Why don't remove the glyph cache ?
Because if we do that, we finish with a font object for every size
and dpi, and the stamp is really a special case that happen in
the rendering process, so I really thing is better keep the
glyph cache and make this two new function to handle this
special case.
(When I say "font object" I mean have the same freetype font multiple
times just to have differents size and dpi)
As Matt point we still can have one case that two thread access
the BLF_*_unique function at the same time, but I am looking to
fix this with some class of thread lock.
For now I test and work fine, so if some one found problem, please
let me know.
Campbell I have to change the python api (python/generic/blf_api.c)
to the new syntax, so maybe you can take a look at this.
2010-04-22 10:56:45 +00:00
|
|
|
BLF_position(mono, x, y+3, 0.0);
|
|
|
|
BLF_draw_buffer(mono, stamp_data.scene);
|
2007-10-20 16:17:27 +00:00
|
|
|
}
|
2007-11-08 13:02:59 +00:00
|
|
|
|
|
|
|
if (stamp_data.strip[0]) {
|
BugFix:
[#20854] PROPERTIES STAMP: Rendering stamp flickers in output renders
Blenfont was not thread safe, that is why one thread can change
the font properties (size, dpi, color, etc) at the same time
that the stamp draw on the image, and then the problem.
To make blenfont thread safe I have to change two important things:
1) Every BLF_* function take one argument, the font id.
2) We have two new function to make font "thread safe":
BLF_load_unique
BLF_load_mem_unique
This two function are for case like stamp, that need and own font
that don't share the glyph cache, so can draw without problem
in a different thread.
Why the BLF_*_unique function ?
Because blenfont keep only one copy of a font and keep a list of
"glyph cache". Every glyph cache have size and dpi, so if two
different thread access the same font at the same time, they can
change value and finish with something like the stamp problem.
Why don't remove the glyph cache ?
Because if we do that, we finish with a font object for every size
and dpi, and the stamp is really a special case that happen in
the rendering process, so I really thing is better keep the
glyph cache and make this two new function to handle this
special case.
(When I say "font object" I mean have the same freetype font multiple
times just to have differents size and dpi)
As Matt point we still can have one case that two thread access
the BLF_*_unique function at the same time, but I am looking to
fix this with some class of thread lock.
For now I test and work fine, so if some one found problem, please
let me know.
Campbell I have to change the python api (python/generic/blf_api.c)
to the new syntax, so maybe you can take a look at this.
2010-04-22 10:56:45 +00:00
|
|
|
BLF_width_and_height(mono, stamp_data.scene, &w, &h);
|
2009-08-18 19:26:53 +00:00
|
|
|
|
|
|
|
/* Top right corner, with an extra space because blenfont is too strict! */
|
|
|
|
x= width - w - pad;
|
|
|
|
y= height - h;
|
|
|
|
|
|
|
|
/* extra space for background. */
|
|
|
|
buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, x, y-3, x+w+pad, y+h+3);
|
|
|
|
|
BugFix:
[#20854] PROPERTIES STAMP: Rendering stamp flickers in output renders
Blenfont was not thread safe, that is why one thread can change
the font properties (size, dpi, color, etc) at the same time
that the stamp draw on the image, and then the problem.
To make blenfont thread safe I have to change two important things:
1) Every BLF_* function take one argument, the font id.
2) We have two new function to make font "thread safe":
BLF_load_unique
BLF_load_mem_unique
This two function are for case like stamp, that need and own font
that don't share the glyph cache, so can draw without problem
in a different thread.
Why the BLF_*_unique function ?
Because blenfont keep only one copy of a font and keep a list of
"glyph cache". Every glyph cache have size and dpi, so if two
different thread access the same font at the same time, they can
change value and finish with something like the stamp problem.
Why don't remove the glyph cache ?
Because if we do that, we finish with a font object for every size
and dpi, and the stamp is really a special case that happen in
the rendering process, so I really thing is better keep the
glyph cache and make this two new function to handle this
special case.
(When I say "font object" I mean have the same freetype font multiple
times just to have differents size and dpi)
As Matt point we still can have one case that two thread access
the BLF_*_unique function at the same time, but I am looking to
fix this with some class of thread lock.
For now I test and work fine, so if some one found problem, please
let me know.
Campbell I have to change the python api (python/generic/blf_api.c)
to the new syntax, so maybe you can take a look at this.
2010-04-22 10:56:45 +00:00
|
|
|
BLF_position(mono, x, y, 0.0);
|
|
|
|
BLF_draw_buffer(mono, stamp_data.strip);
|
2007-11-08 13:02:59 +00:00
|
|
|
}
|
2009-08-18 19:26:53 +00:00
|
|
|
|
|
|
|
/* cleanup the buffer. */
|
BugFix:
[#20854] PROPERTIES STAMP: Rendering stamp flickers in output renders
Blenfont was not thread safe, that is why one thread can change
the font properties (size, dpi, color, etc) at the same time
that the stamp draw on the image, and then the problem.
To make blenfont thread safe I have to change two important things:
1) Every BLF_* function take one argument, the font id.
2) We have two new function to make font "thread safe":
BLF_load_unique
BLF_load_mem_unique
This two function are for case like stamp, that need and own font
that don't share the glyph cache, so can draw without problem
in a different thread.
Why the BLF_*_unique function ?
Because blenfont keep only one copy of a font and keep a list of
"glyph cache". Every glyph cache have size and dpi, so if two
different thread access the same font at the same time, they can
change value and finish with something like the stamp problem.
Why don't remove the glyph cache ?
Because if we do that, we finish with a font object for every size
and dpi, and the stamp is really a special case that happen in
the rendering process, so I really thing is better keep the
glyph cache and make this two new function to handle this
special case.
(When I say "font object" I mean have the same freetype font multiple
times just to have differents size and dpi)
As Matt point we still can have one case that two thread access
the BLF_*_unique function at the same time, but I am looking to
fix this with some class of thread lock.
For now I test and work fine, so if some one found problem, please
let me know.
Campbell I have to change the python api (python/generic/blf_api.c)
to the new syntax, so maybe you can take a look at this.
2010-04-22 10:56:45 +00:00
|
|
|
BLF_buffer(mono, NULL, NULL, 0, 0, 0);
|
2007-10-20 16:17:27 +00:00
|
|
|
}
|
3D view orbit option: Around Active
This fixes the active object in place when orbiting the view.
Choppy 15fps demo can be seen there: http://www.elysiun.com/~theeth/bf/around_active.html
Image Memory Grabage Collection
This adds memory handling to the image code. An image is tagged each time it is used.
During a collection cycle (frequency of cycles is user defined), if an image is older
than a user defined limit, its buffer gets deallocated. This also applies to gl memory buffers.
Images that are loading in GL memory needs to go through two time outs before being fully deallocated: the first time out deallocated the gl memorry, the second the buffer in ram.
Notes:
Image buffer loaded from python gets tagged as permanent upon load. That tag is removed when python stops using the image.
I might have missed some tagging spots, especially in the rendering pipeline. Someone with more knowledge about this code should check to be careful.
Tagging is done on every access, for rendering, this will probably be a performance hit. A scheme should be developped to only tag when the rendering is completed.
Collecting is called in draw_object, most likely not the best place to do it.
Safe from undo, since using undo deallocates memory anyway (like when loading a blend file with one currently opened)
Userpref DNA changes:
I've changed a couple of flagging variables from short to int. Some because they needed more space, others to keep SDNA happy.
Info window changes:
I've grouped a couple of buttons in aligned blocks and changed the color of mutually exclusive options to make them clearer.
Matt didn't do any changes on that in tuhopuu, so hopefully I'm not stepping on anyone's feet with this.
Also changed double constants into floats with f in a couple of places (mostly space.c) to make compiler happier.
2005-07-06 00:33:41 +00:00
|
|
|
|
2009-01-04 14:14:06 +00:00
|
|
|
void BKE_stamp_info(Scene *scene, struct ImBuf *ibuf)
|
2007-10-28 22:27:07 +00:00
|
|
|
{
|
|
|
|
struct StampData stamp_data;
|
|
|
|
|
|
|
|
if (!ibuf) return;
|
|
|
|
|
|
|
|
/* fill all the data values, no prefix */
|
2009-01-04 14:14:06 +00:00
|
|
|
stampdata(scene, &stamp_data, 0);
|
2007-10-28 22:27:07 +00:00
|
|
|
|
|
|
|
if (stamp_data.file[0]) IMB_imginfo_change_field (ibuf, "File", stamp_data.file);
|
|
|
|
if (stamp_data.note[0]) IMB_imginfo_change_field (ibuf, "Note", stamp_data.note);
|
|
|
|
if (stamp_data.date[0]) IMB_imginfo_change_field (ibuf, "Date", stamp_data.date);
|
|
|
|
if (stamp_data.marker[0]) IMB_imginfo_change_field (ibuf, "Marker", stamp_data.marker);
|
|
|
|
if (stamp_data.time[0]) IMB_imginfo_change_field (ibuf, "Time", stamp_data.time);
|
|
|
|
if (stamp_data.frame[0]) IMB_imginfo_change_field (ibuf, "Frame", stamp_data.frame);
|
|
|
|
if (stamp_data.camera[0]) IMB_imginfo_change_field (ibuf, "Camera", stamp_data.camera);
|
|
|
|
if (stamp_data.scene[0]) IMB_imginfo_change_field (ibuf, "Scene", stamp_data.scene);
|
2007-11-08 13:02:59 +00:00
|
|
|
if (stamp_data.strip[0]) IMB_imginfo_change_field (ibuf, "Strip", stamp_data.strip);
|
2007-10-28 22:27:07 +00:00
|
|
|
}
|
|
|
|
|
2009-01-04 14:14:06 +00:00
|
|
|
int BKE_write_ibuf(Scene *scene, ImBuf *ibuf, char *name, int imtype, int subimtype, int quality)
|
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 22:05:47 +00:00
|
|
|
{
|
|
|
|
int ok;
|
|
|
|
|
|
|
|
if(imtype==0);
|
2006-11-01 12:54:29 +00:00
|
|
|
else if(imtype== R_IRIS)
|
|
|
|
ibuf->ftype= IMAGIC;
|
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 22:05:47 +00:00
|
|
|
else if ((imtype==R_RADHDR)) {
|
|
|
|
ibuf->ftype= RADHDR;
|
|
|
|
}
|
2.5: Render
* UI layout for scene buttons has quite some changes, I tried to
better organize things according to the pipeline, and also showing
important properties by default, and collapsing less important ones.
Some changes compared to 2.4x:
* Panorama is now a Camera property.
* Sequence and Compositing are now enabled by default, but will only
do something when there is a node tree using nodes, or a strip in the
sequence editor.
* Enabling Full Sample now automatically enables Save Buffers too.
* Stamp option to include info in file is removed, it now simply always
does this if one of the stamp infos is enabled.
* Xvid, H.264 and Ogg Theora are now directly in the file format menu,
but still using FFMPEG. Unfortunately Ogg is broken at the moment
(also in 2.4x), so that's disabled. And Xvid crashes on 64bit linux,
maybe solvable by upgrading extern/xvidcore/, using ubuntu libs makes
it work.
* Organized file format menu by image/movie types.
Added:
* Render layers RNA wrapped, operatorized, layouted.
* FFMPEG format/codec options are now working.
Defaults changed:
* Compositing & Sequencer enabled.
* Tiles set to 8x8.
* Time/Date/Frame/Scene/Camera/Filename enabled for stamp.
2009-07-13 19:09:13 +00:00
|
|
|
else if (ELEM5(imtype, R_PNG, R_FFMPEG, R_H264, R_THEORA, R_XVID)) {
|
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 22:05:47 +00:00
|
|
|
ibuf->ftype= PNG;
|
|
|
|
}
|
2007-06-25 19:50:25 +00:00
|
|
|
#ifdef WITH_DDS
|
|
|
|
else if ((imtype==R_DDS)) {
|
|
|
|
ibuf->ftype= DDS;
|
|
|
|
}
|
|
|
|
#endif
|
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 22:05:47 +00:00
|
|
|
else if ((imtype==R_BMP)) {
|
|
|
|
ibuf->ftype= BMP;
|
|
|
|
}
|
|
|
|
else if ((G.have_libtiff) && (imtype==R_TIFF)) {
|
|
|
|
ibuf->ftype= TIF;
|
2008-03-10 11:39:37 +00:00
|
|
|
|
|
|
|
if(subimtype & R_TIFF_16BIT)
|
|
|
|
ibuf->ftype |= TIF_16BIT;
|
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 22:05:47 +00:00
|
|
|
}
|
|
|
|
#ifdef WITH_OPENEXR
|
2006-12-20 17:57:56 +00:00
|
|
|
else if (imtype==R_OPENEXR || imtype==R_MULTILAYER) {
|
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 22:05:47 +00:00
|
|
|
ibuf->ftype= OPENEXR;
|
|
|
|
if(subimtype & R_OPENEXR_HALF)
|
|
|
|
ibuf->ftype |= OPENEXR_HALF;
|
|
|
|
ibuf->ftype |= (quality & OPENEXR_COMPRESS);
|
|
|
|
|
|
|
|
if(!(subimtype & R_OPENEXR_ZBUF))
|
|
|
|
ibuf->zbuf_float = NULL; /* signal for exr saving */
|
|
|
|
|
|
|
|
}
|
|
|
|
#endif
|
2006-03-12 14:11:23 +00:00
|
|
|
else if (imtype==R_CINEON) {
|
|
|
|
ibuf->ftype = CINEON;
|
|
|
|
}
|
|
|
|
else if (imtype==R_DPX) {
|
|
|
|
ibuf->ftype = DPX;
|
|
|
|
}
|
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 22:05:47 +00:00
|
|
|
else if (imtype==R_TARGA) {
|
|
|
|
ibuf->ftype= TGA;
|
|
|
|
}
|
|
|
|
else if(imtype==R_RAWTGA) {
|
|
|
|
ibuf->ftype= RAWTGA;
|
|
|
|
}
|
|
|
|
else if(imtype==R_HAMX) {
|
|
|
|
ibuf->ftype= AN_hamx;
|
|
|
|
}
|
2009-01-26 08:34:40 +00:00
|
|
|
#ifdef WITH_OPENJPEG
|
|
|
|
else if(imtype==R_JP2) {
|
|
|
|
if(quality < 10) quality= 90;
|
|
|
|
ibuf->ftype= JP2|quality;
|
|
|
|
|
|
|
|
if (subimtype & R_JPEG2K_16BIT) {
|
|
|
|
ibuf->ftype |= JP2_16BIT;
|
|
|
|
} else if (subimtype & R_JPEG2K_12BIT) {
|
|
|
|
ibuf->ftype |= JP2_12BIT;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (subimtype & R_JPEG2K_YCC) {
|
|
|
|
ibuf->ftype |= JP2_YCC;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (subimtype & R_JPEG2K_CINE_PRESET) {
|
|
|
|
ibuf->ftype |= JP2_CINE;
|
|
|
|
if (subimtype & R_JPEG2K_CINE_48FPS)
|
|
|
|
ibuf->ftype |= JP2_CINE_48FPS;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|
2006-07-08 13:18:57 +00:00
|
|
|
else {
|
|
|
|
/* R_JPEG90, R_MOVIE, etc. default we save jpegs */
|
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 22:05:47 +00:00
|
|
|
if(quality < 10) quality= 90;
|
|
|
|
ibuf->ftype= JPG|quality;
|
2006-06-13 18:51:52 +00:00
|
|
|
if(ibuf->depth==32) ibuf->depth= 24; /* unsupported feature only confuses other s/w */
|
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 22:05:47 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
BLI_make_existing_file(name);
|
2007-10-20 16:17:27 +00:00
|
|
|
|
2010-01-07 16:57:17 +00:00
|
|
|
if(scene && scene->r.stamp & R_STAMP_ALL)
|
2009-01-04 14:14:06 +00:00
|
|
|
BKE_stamp_info(scene, ibuf);
|
2007-10-28 22:27:07 +00: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 22:05:47 +00:00
|
|
|
ok = IMB_saveiff(ibuf, name, IB_rect | IB_zbuf | IB_zbuffloat);
|
|
|
|
if (ok == 0) {
|
|
|
|
perror(name);
|
|
|
|
}
|
|
|
|
|
|
|
|
return(ok);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2010-01-08 13:52:38 +00:00
|
|
|
void BKE_makepicstring(char *string, char *base, int frame, int imtype, int use_ext)
|
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 22:05:47 +00:00
|
|
|
{
|
2006-08-10 10:38:50 +00:00
|
|
|
if (string==NULL) return;
|
2006-12-20 17:57:56 +00:00
|
|
|
BLI_strncpy(string, base, FILE_MAX - 10); /* weak assumption */
|
2010-03-09 17:36:23 +00:00
|
|
|
BLI_path_abs(string, G.sce);
|
|
|
|
BLI_path_frame(string, frame, 4);
|
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 22:05:47 +00:00
|
|
|
|
2010-01-08 13:52:38 +00:00
|
|
|
if(use_ext)
|
|
|
|
BKE_add_image_extension(string, imtype);
|
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 22:05:47 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
2006-12-20 17:57:56 +00:00
|
|
|
/* used by sequencer too */
|
2006-08-20 10:18:01 +00:00
|
|
|
struct anim *openanim(char *name, int flags)
|
2002-10-12 11:37:38 +00:00
|
|
|
{
|
2006-08-20 10:18:01 +00:00
|
|
|
struct anim *anim;
|
|
|
|
struct ImBuf *ibuf;
|
2002-10-12 11:37:38 +00:00
|
|
|
|
|
|
|
anim = IMB_open_anim(name, flags);
|
2006-08-20 10:18:01 +00:00
|
|
|
if (anim == NULL) return(0);
|
2002-10-12 11:37:38 +00:00
|
|
|
|
|
|
|
ibuf = IMB_anim_absolute(anim, 0);
|
2006-02-11 23:17:41 +00:00
|
|
|
if (ibuf == NULL) {
|
2010-01-18 11:46:19 +00:00
|
|
|
if(BLI_exists(name))
|
|
|
|
printf("not an anim: %s\n", name);
|
|
|
|
else
|
|
|
|
printf("anim file doesn't exist: %s\n", name);
|
2002-10-12 11:37:38 +00:00
|
|
|
IMB_free_anim(anim);
|
|
|
|
return(0);
|
|
|
|
}
|
|
|
|
IMB_freeImBuf(ibuf);
|
|
|
|
|
|
|
|
return(anim);
|
|
|
|
}
|
|
|
|
|
2006-12-20 17:57:56 +00:00
|
|
|
/* ************************* New Image API *************** */
|
|
|
|
|
|
|
|
|
|
|
|
/* Notes about Image storage
|
|
|
|
- packedfile
|
|
|
|
-> written in .blend
|
|
|
|
- filename
|
|
|
|
-> written in .blend
|
|
|
|
- movie
|
|
|
|
-> comes from packedfile or filename
|
|
|
|
- renderresult
|
|
|
|
-> comes from packedfile or filename
|
|
|
|
- listbase
|
|
|
|
-> ibufs from exrhandle
|
|
|
|
- flipbook array
|
|
|
|
-> ibufs come from movie, temporary renderresult or sequence
|
|
|
|
- ibuf
|
|
|
|
-> comes from packedfile or filename or generated
|
2002-10-12 11:37:38 +00:00
|
|
|
|
Biiig commit! Thanks to 2-3 weeks of cvs freeze...
Render:
- New; support for dual CPU render (SDL thread)
Currently only works with alternating scanlines, but gives excellent
performance. For both normal render as unified implemented.
Note the "mutex" locks on z-transp buffer render and imbuf loads.
- This has been made possible by major cleanups in render code, especially
getting rid of globals (example Tin Tr Tg Tb Ta for textures) or struct
OSA or using Materials or Texture data to write to.
- Made normal render fully 4x32 floats too, and removed all old optimizes
with chars or shorts.
- Made normal render and unified render use same code for sky and halo
render, giving equal (and better) results for halo render. Old render
now also uses PostProcess options (brightness, mul, gamma)
- Added option ("FBuf") in F10 Output Panel, this keeps a 4x32 bits buffer
after render. Using PostProcess menu you will note an immediate re-
display of image too (32 bits RGBA)
- Added "Hue" and "Saturation" sliders to PostProcess options
- Render module is still not having a "nice" API, but amount of dependencies
went down a lot. Next todo: remove abusive "previewrender" code.
The last main global in Render (struct Render) now can be re-used for fully
controlling a render, to allow multiple "instances" of render to open.
- Renderwindow now displays a smal bar on top with the stats, and keeps the
stats after render too. Including "spare" page support.
Not only easier visible that way, but also to remove the awkward code that
was drawing stats in the Info header (extreme slow on some ATIs too)
- Cleaned up blendef.h and BKE_utildefines.h, these two had overlapping
defines.
- I might have forgotten stuff... and will write a nice doc on the architecture!
2004-12-27 19:28:52 +00:00
|
|
|
*/
|
2004-01-26 12:37:34 +00:00
|
|
|
|
|
|
|
|
2010-01-14 10:59:42 +00:00
|
|
|
/* forces existence of 1 Image for renderout or nodes, returns Image */
|
2006-12-20 17:57:56 +00:00
|
|
|
/* name is only for default, when making new one */
|
|
|
|
Image *BKE_image_verify_viewer(int type, const char *name)
|
|
|
|
{
|
|
|
|
Image *ima;
|
2006-02-02 18:28:01 +00:00
|
|
|
|
2006-12-20 17:57:56 +00:00
|
|
|
for(ima=G.main->image.first; ima; ima= ima->id.next)
|
|
|
|
if(ima->source==IMA_SRC_VIEWER)
|
|
|
|
if(ima->type==type)
|
|
|
|
break;
|
|
|
|
|
|
|
|
if(ima==NULL)
|
|
|
|
ima= image_alloc(name, IMA_SRC_VIEWER, type);
|
|
|
|
|
|
|
|
/* happens on reload, imagewindow cannot be image user when hidden*/
|
|
|
|
if(ima->id.us==0)
|
|
|
|
id_us_plus(&ima->id);
|
2002-10-12 11:37:38 +00:00
|
|
|
|
2006-12-20 17:57:56 +00:00
|
|
|
return ima;
|
|
|
|
}
|
2002-10-12 11:37:38 +00:00
|
|
|
|
2006-12-20 17:57:56 +00:00
|
|
|
void BKE_image_assign_ibuf(Image *ima, ImBuf *ibuf)
|
|
|
|
{
|
|
|
|
image_assign_ibuf(ima, ibuf, IMA_NO_INDEX, 0);
|
|
|
|
}
|
2006-10-26 10:13:16 +00:00
|
|
|
|
2006-12-20 17:57:56 +00:00
|
|
|
void BKE_image_signal(Image *ima, ImageUser *iuser, int signal)
|
|
|
|
{
|
|
|
|
if(ima==NULL)
|
|
|
|
return;
|
|
|
|
|
|
|
|
switch(signal) {
|
|
|
|
case IMA_SIGNAL_FREE:
|
|
|
|
image_free_buffers(ima);
|
|
|
|
if(iuser)
|
|
|
|
iuser->ok= 1;
|
|
|
|
break;
|
|
|
|
case IMA_SIGNAL_SRC_CHANGE:
|
2009-09-16 19:27:08 +00:00
|
|
|
if(ima->type == IMA_TYPE_UV_TEST)
|
|
|
|
if(ima->source != IMA_SRC_GENERATED)
|
|
|
|
ima->type= IMA_TYPE_IMAGE;
|
|
|
|
|
|
|
|
if(ima->source==IMA_SRC_GENERATED) {
|
2006-12-20 17:57:56 +00:00
|
|
|
if(ima->gen_x==0 || ima->gen_y==0) {
|
|
|
|
ImBuf *ibuf= image_get_ibuf(ima, IMA_NO_INDEX, 0);
|
|
|
|
if(ibuf) {
|
|
|
|
ima->gen_x= ibuf->x;
|
|
|
|
ima->gen_y= ibuf->y;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2009-09-16 19:27:08 +00:00
|
|
|
|
|
|
|
image_free_buffers(ima);
|
|
|
|
|
2006-12-20 17:57:56 +00:00
|
|
|
ima->ok= 1;
|
|
|
|
if(iuser)
|
|
|
|
iuser->ok= 1;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case IMA_SIGNAL_RELOAD:
|
|
|
|
/* try to repack file */
|
|
|
|
if(ima->packedfile) {
|
|
|
|
PackedFile *pf;
|
2009-06-30 19:20:45 +00:00
|
|
|
pf = newPackedFile(NULL, ima->name);
|
2006-12-20 17:57:56 +00:00
|
|
|
if (pf) {
|
|
|
|
freePackedFile(ima->packedfile);
|
|
|
|
ima->packedfile = pf;
|
|
|
|
image_free_buffers(ima);
|
|
|
|
} else {
|
|
|
|
printf("ERROR: Image not available. Keeping packed image\n");
|
|
|
|
}
|
Biiig commit! Thanks to 2-3 weeks of cvs freeze...
Render:
- New; support for dual CPU render (SDL thread)
Currently only works with alternating scanlines, but gives excellent
performance. For both normal render as unified implemented.
Note the "mutex" locks on z-transp buffer render and imbuf loads.
- This has been made possible by major cleanups in render code, especially
getting rid of globals (example Tin Tr Tg Tb Ta for textures) or struct
OSA or using Materials or Texture data to write to.
- Made normal render fully 4x32 floats too, and removed all old optimizes
with chars or shorts.
- Made normal render and unified render use same code for sky and halo
render, giving equal (and better) results for halo render. Old render
now also uses PostProcess options (brightness, mul, gamma)
- Added option ("FBuf") in F10 Output Panel, this keeps a 4x32 bits buffer
after render. Using PostProcess menu you will note an immediate re-
display of image too (32 bits RGBA)
- Added "Hue" and "Saturation" sliders to PostProcess options
- Render module is still not having a "nice" API, but amount of dependencies
went down a lot. Next todo: remove abusive "previewrender" code.
The last main global in Render (struct Render) now can be re-used for fully
controlling a render, to allow multiple "instances" of render to open.
- Renderwindow now displays a smal bar on top with the stats, and keeps the
stats after render too. Including "spare" page support.
Not only easier visible that way, but also to remove the awkward code that
was drawing stats in the Info header (extreme slow on some ATIs too)
- Cleaned up blendef.h and BKE_utildefines.h, these two had overlapping
defines.
- I might have forgotten stuff... and will write a nice doc on the architecture!
2004-12-27 19:28:52 +00:00
|
|
|
}
|
2006-12-20 17:57:56 +00:00
|
|
|
else
|
|
|
|
image_free_buffers(ima);
|
|
|
|
|
|
|
|
if(iuser)
|
|
|
|
iuser->ok= 1;
|
|
|
|
|
|
|
|
break;
|
|
|
|
case IMA_SIGNAL_USER_NEW_IMAGE:
|
|
|
|
if(iuser) {
|
|
|
|
iuser->ok= 1;
|
|
|
|
if(ima->source==IMA_SRC_FILE || ima->source==IMA_SRC_SEQUENCE) {
|
|
|
|
if(ima->type==IMA_TYPE_MULTILAYER) {
|
|
|
|
iuser->multi_index= 0;
|
|
|
|
iuser->layer= iuser->pass= 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2006-12-20 17:57:56 +00:00
|
|
|
/* if layer or pass changes, we need an index for the imbufs list */
|
|
|
|
/* note it is called for rendered results, but it doesnt use the index! */
|
|
|
|
/* and because rendered results use fake layer/passes, don't correct for wrong indices here */
|
|
|
|
RenderPass *BKE_image_multilayer_index(RenderResult *rr, ImageUser *iuser)
|
2002-10-12 11:37:38 +00:00
|
|
|
{
|
2006-12-20 17:57:56 +00:00
|
|
|
RenderLayer *rl;
|
|
|
|
RenderPass *rpass= NULL;
|
2002-10-12 11:37:38 +00:00
|
|
|
|
2006-12-20 17:57:56 +00:00
|
|
|
if(rr==NULL)
|
|
|
|
return NULL;
|
2002-10-12 11:37:38 +00:00
|
|
|
|
2006-12-20 17:57:56 +00:00
|
|
|
if(iuser) {
|
|
|
|
short index= 0, rl_index= 0, rp_index;
|
2002-10-12 11:37:38 +00:00
|
|
|
|
2006-12-20 17:57:56 +00:00
|
|
|
for(rl= rr->layers.first; rl; rl= rl->next, rl_index++) {
|
|
|
|
rp_index= 0;
|
|
|
|
for(rpass= rl->passes.first; rpass; rpass= rpass->next, index++, rp_index++)
|
|
|
|
if(iuser->layer==rl_index && iuser->pass==rp_index)
|
|
|
|
break;
|
|
|
|
if(rpass)
|
|
|
|
break;
|
|
|
|
}
|
Orange branch: OpenEXR finally in Blender!
Credits go to Gernot Ziegler, who originally coded EXR support, and to
Austin Benesh for bringing it further. Kent Mein provided a lot of code
for integrating float buffers in Blender imbuf and ImBuf API cleanup,
and provided Make and Scons and static linking.
At this moment; the EXR libraries are a *dependency*, so you cannot get
the Orange branch compiled without having OpenEXR installed. Get the
(precompiled or sources) stuff from www.openexr.com. Current default is
that the headers and lib resides in /user/local/
Several changes/additions/fixes were added:
- EXR code only supported 'half' format (16 bits per channel). I've added
float writing, but for reading it I need tomorrow. :)
- Quite some clumsy copying of data happened in EXR code.
- cleaned up the api calls already a bit, preparing for more advanced
support
- Zbuffers were saved 16 bits, now 32 bits
- automatic adding of .exr extensions went wrong
Imbuf:
- added proper imbuf->flags and imbuf->mall support for float buffers, it
was created for *each* imbuf. :)
- found bugs for float buffers in scaling and flipping. Code there will
need more checks still
- imbuf also needs to be verified to behave properly when no 32 bits
rect exists (for saving for example)
TODO:
- support internal float images for textures, backbuf, AO probes, and
display in Image window
Hope this commit won't screwup syncing with bf-blender... :/
2006-01-09 00:40:35 +00:00
|
|
|
|
2006-12-20 17:57:56 +00:00
|
|
|
if(rpass)
|
|
|
|
iuser->multi_index= index;
|
|
|
|
else
|
|
|
|
iuser->multi_index= 0;
|
|
|
|
}
|
|
|
|
if(rpass==NULL) {
|
|
|
|
rl= rr->layers.first;
|
|
|
|
if(rl)
|
|
|
|
rpass= rl->passes.first;
|
|
|
|
}
|
|
|
|
|
|
|
|
return rpass;
|
|
|
|
}
|
|
|
|
|
2010-03-27 15:35:34 +00:00
|
|
|
RenderResult *BKE_image_acquire_renderresult(Scene *scene, Image *ima)
|
2006-12-20 17:57:56 +00:00
|
|
|
{
|
2010-03-27 15:35:34 +00:00
|
|
|
if(ima->rr) {
|
2006-12-20 17:57:56 +00:00
|
|
|
return ima->rr;
|
2010-03-27 15:35:34 +00:00
|
|
|
}
|
|
|
|
else if(ima->type==IMA_TYPE_R_RESULT) {
|
|
|
|
if(ima->render_slot == ima->last_render_slot)
|
|
|
|
return RE_AcquireResultRead(RE_GetRender(scene->id.name));
|
|
|
|
else
|
|
|
|
return ima->renders[ima->render_slot];
|
|
|
|
}
|
|
|
|
else
|
|
|
|
return NULL;
|
2006-12-20 17:57:56 +00:00
|
|
|
}
|
|
|
|
|
2010-03-27 15:35:34 +00:00
|
|
|
void BKE_image_release_renderresult(Scene *scene, Image *ima)
|
2009-09-30 18:18:32 +00:00
|
|
|
{
|
|
|
|
if(ima->rr);
|
2010-03-27 15:35:34 +00:00
|
|
|
else if(ima->type==IMA_TYPE_R_RESULT) {
|
|
|
|
if(ima->render_slot == ima->last_render_slot)
|
|
|
|
RE_ReleaseResult(RE_GetRender(scene->id.name));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void BKE_image_backup_render(Scene *scene, Image *ima)
|
|
|
|
{
|
|
|
|
/* called right before rendering, ima->renders contains render
|
|
|
|
result pointers for everything but the current render */
|
|
|
|
Render *re= RE_GetRender(scene->id.name);
|
|
|
|
int slot= ima->render_slot, last= ima->last_render_slot;
|
|
|
|
|
|
|
|
if(slot != last) {
|
|
|
|
if(ima->renders[slot]) {
|
|
|
|
RE_FreeRenderResult(ima->renders[slot]);
|
|
|
|
ima->renders[slot]= NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
ima->renders[last]= NULL;
|
|
|
|
RE_SwapResult(re, &ima->renders[last]);
|
|
|
|
}
|
|
|
|
|
|
|
|
ima->last_render_slot= slot;
|
2009-09-30 18:18:32 +00:00
|
|
|
}
|
|
|
|
|
2006-12-20 17:57:56 +00:00
|
|
|
/* after imbuf load, openexr type can return with a exrhandle open */
|
|
|
|
/* in that case we have to build a render-result */
|
|
|
|
static void image_create_multilayer(Image *ima, ImBuf *ibuf, int framenr)
|
|
|
|
{
|
|
|
|
|
|
|
|
ima->rr= RE_MultilayerConvert(ibuf->userdata, ibuf->x, ibuf->y);
|
2006-12-24 16:03:31 +00:00
|
|
|
|
|
|
|
#ifdef WITH_OPENEXR
|
2006-12-20 17:57:56 +00:00
|
|
|
IMB_exr_close(ibuf->userdata);
|
2006-12-24 16:03:31 +00:00
|
|
|
#endif
|
|
|
|
|
2006-12-20 17:57:56 +00:00
|
|
|
ibuf->userdata= NULL;
|
|
|
|
if(ima->rr)
|
|
|
|
ima->rr->framenr= framenr;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* common stuff to do with images after loading */
|
|
|
|
static void image_initialize_after_load(Image *ima, ImBuf *ibuf)
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
/* preview is NULL when it has never been used as an icon before */
|
|
|
|
if(G.background==0 && ima->preview==NULL)
|
|
|
|
BKE_icon_changed(BKE_icon_getid(&ima->id));
|
|
|
|
|
|
|
|
/* stringcodes also in ibuf, ibuf->name is used to retrieve original (buttons) */
|
|
|
|
BLI_strncpy(ibuf->name, ima->name, FILE_MAX);
|
|
|
|
|
|
|
|
/* fields */
|
|
|
|
if (ima->flag & IMA_FIELDS) {
|
|
|
|
if(ima->flag & IMA_STD_FIELD) de_interlace_st(ibuf);
|
|
|
|
else de_interlace_ng(ibuf);
|
|
|
|
}
|
|
|
|
/* timer */
|
|
|
|
ima->lastused = clock() / CLOCKS_PER_SEC;
|
|
|
|
|
|
|
|
ima->ok= IMA_OK_LOADED;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
static ImBuf *image_load_sequence_file(Image *ima, ImageUser *iuser, int frame)
|
|
|
|
{
|
|
|
|
struct ImBuf *ibuf;
|
|
|
|
unsigned short numlen;
|
|
|
|
char name[FILE_MAX], head[FILE_MAX], tail[FILE_MAX];
|
|
|
|
|
2010-02-13 13:09:30 +00:00
|
|
|
/* XXX temp stuff? */
|
|
|
|
if(ima->lastframe != frame)
|
|
|
|
ima->tpageflag |= IMA_TPAGE_REFRESH;
|
|
|
|
|
2006-12-20 17:57:56 +00:00
|
|
|
ima->lastframe= frame;
|
|
|
|
|
|
|
|
BLI_stringdec(ima->name, head, tail, &numlen);
|
|
|
|
BLI_stringenc(ima->name, head, tail, numlen, frame);
|
|
|
|
BLI_strncpy(name, ima->name, sizeof(name));
|
|
|
|
|
|
|
|
if(ima->id.lib)
|
2010-03-09 17:36:23 +00:00
|
|
|
BLI_path_abs(name, ima->id.lib->filename);
|
2006-12-20 17:57:56 +00:00
|
|
|
else
|
2010-03-09 17:36:23 +00:00
|
|
|
BLI_path_abs(name, G.sce);
|
2008-05-04 09:41:15 +00:00
|
|
|
|
2006-12-20 17:57:56 +00:00
|
|
|
/* read ibuf */
|
|
|
|
ibuf = IMB_loadiffname(name, IB_rect|IB_multilayer);
|
2007-01-15 12:44:45 +00:00
|
|
|
if(G.f & G_DEBUG) printf("loaded %s\n", name);
|
2006-12-20 17:57:56 +00:00
|
|
|
|
|
|
|
if (ibuf) {
|
2006-12-24 20:19:56 +00:00
|
|
|
#ifdef WITH_OPENEXR
|
2006-12-20 17:57:56 +00:00
|
|
|
/* handle multilayer case, don't assign ibuf. will be handled in BKE_image_get_ibuf */
|
|
|
|
if (ibuf->ftype==OPENEXR && ibuf->userdata) {
|
|
|
|
image_create_multilayer(ima, ibuf, frame);
|
|
|
|
ima->type= IMA_TYPE_MULTILAYER;
|
|
|
|
IMB_freeImBuf(ibuf);
|
|
|
|
ibuf= NULL;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
image_initialize_after_load(ima, ibuf);
|
2008-04-28 20:57:03 +00:00
|
|
|
image_assign_ibuf(ima, ibuf, 0, frame);
|
2006-12-20 17:57:56 +00:00
|
|
|
}
|
2006-12-24 20:19:56 +00:00
|
|
|
#else
|
|
|
|
image_initialize_after_load(ima, ibuf);
|
2008-04-28 20:57:03 +00:00
|
|
|
image_assign_ibuf(ima, ibuf, 0, frame);
|
2006-12-24 20:19:56 +00:00
|
|
|
#endif
|
2008-07-06 13:52:17 +00:00
|
|
|
|
|
|
|
if(ima->flag & IMA_DO_PREMUL)
|
|
|
|
converttopremul(ibuf);
|
|
|
|
|
2006-12-20 17:57:56 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
ima->ok= 0;
|
|
|
|
|
|
|
|
if(iuser)
|
|
|
|
iuser->ok= ima->ok;
|
|
|
|
|
|
|
|
return ibuf;
|
|
|
|
}
|
|
|
|
|
|
|
|
static ImBuf *image_load_sequence_multilayer(Image *ima, ImageUser *iuser, int frame)
|
|
|
|
{
|
|
|
|
struct ImBuf *ibuf= NULL;
|
|
|
|
|
|
|
|
/* either we load from RenderResult, or we have to load a new one */
|
|
|
|
|
|
|
|
/* check for new RenderResult */
|
|
|
|
if(ima->rr==NULL || frame!=ima->rr->framenr) {
|
|
|
|
/* copy to survive not found multilayer image */
|
|
|
|
RenderResult *oldrr= ima->rr;
|
|
|
|
|
|
|
|
ima->rr= NULL;
|
|
|
|
ibuf = image_load_sequence_file(ima, iuser, frame);
|
Biiig commit! Thanks to 2-3 weeks of cvs freeze...
Render:
- New; support for dual CPU render (SDL thread)
Currently only works with alternating scanlines, but gives excellent
performance. For both normal render as unified implemented.
Note the "mutex" locks on z-transp buffer render and imbuf loads.
- This has been made possible by major cleanups in render code, especially
getting rid of globals (example Tin Tr Tg Tb Ta for textures) or struct
OSA or using Materials or Texture data to write to.
- Made normal render fully 4x32 floats too, and removed all old optimizes
with chars or shorts.
- Made normal render and unified render use same code for sky and halo
render, giving equal (and better) results for halo render. Old render
now also uses PostProcess options (brightness, mul, gamma)
- Added option ("FBuf") in F10 Output Panel, this keeps a 4x32 bits buffer
after render. Using PostProcess menu you will note an immediate re-
display of image too (32 bits RGBA)
- Added "Hue" and "Saturation" sliders to PostProcess options
- Render module is still not having a "nice" API, but amount of dependencies
went down a lot. Next todo: remove abusive "previewrender" code.
The last main global in Render (struct Render) now can be re-used for fully
controlling a render, to allow multiple "instances" of render to open.
- Renderwindow now displays a smal bar on top with the stats, and keeps the
stats after render too. Including "spare" page support.
Not only easier visible that way, but also to remove the awkward code that
was drawing stats in the Info header (extreme slow on some ATIs too)
- Cleaned up blendef.h and BKE_utildefines.h, these two had overlapping
defines.
- I might have forgotten stuff... and will write a nice doc on the architecture!
2004-12-27 19:28:52 +00:00
|
|
|
|
2006-12-20 17:57:56 +00:00
|
|
|
if(ibuf) { /* actually an error */
|
|
|
|
ima->type= IMA_TYPE_IMAGE;
|
|
|
|
printf("error, multi is normal image\n");
|
|
|
|
}
|
|
|
|
// printf("loaded new result %p\n", ima->rr);
|
|
|
|
/* free result if new one found */
|
|
|
|
if(ima->rr) {
|
|
|
|
// if(oldrr) printf("freed previous result %p\n", oldrr);
|
|
|
|
if(oldrr) RE_FreeRenderResult(oldrr);
|
|
|
|
}
|
2008-04-28 20:57:03 +00:00
|
|
|
else {
|
2006-12-20 17:57:56 +00:00
|
|
|
ima->rr= oldrr;
|
2008-04-28 20:57:03 +00:00
|
|
|
}
|
2006-12-20 17:57:56 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
if(ima->rr) {
|
|
|
|
RenderPass *rpass= BKE_image_multilayer_index(ima->rr, iuser);
|
2002-10-12 11:37:38 +00:00
|
|
|
|
2006-12-20 17:57:56 +00:00
|
|
|
if(rpass) {
|
|
|
|
// printf("load from pass %s\n", rpass->name);
|
|
|
|
/* since we free render results, we copy the rect */
|
|
|
|
ibuf= IMB_allocImBuf(ima->rr->rectx, ima->rr->recty, 32, 0, 0);
|
|
|
|
ibuf->rect_float= MEM_dupallocN(rpass->rect);
|
|
|
|
ibuf->flags |= IB_rectfloat;
|
|
|
|
ibuf->mall= IB_rectfloat;
|
|
|
|
ibuf->channels= rpass->channels;
|
|
|
|
|
|
|
|
image_initialize_after_load(ima, ibuf);
|
2008-10-08 16:50:06 +00:00
|
|
|
image_assign_ibuf(ima, ibuf, iuser?iuser->multi_index:0, frame);
|
2006-12-20 17:57:56 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
// else printf("pass not found\n");
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
2006-12-20 17:57:56 +00:00
|
|
|
else
|
|
|
|
ima->ok= 0;
|
|
|
|
|
|
|
|
if(iuser)
|
|
|
|
iuser->ok= ima->ok;
|
|
|
|
|
|
|
|
return ibuf;
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
|
|
|
|
2006-12-20 17:57:56 +00:00
|
|
|
|
|
|
|
static ImBuf *image_load_movie_file(Image *ima, ImageUser *iuser, int frame)
|
2002-10-12 11:37:38 +00:00
|
|
|
{
|
2006-12-20 17:57:56 +00:00
|
|
|
struct ImBuf *ibuf= NULL;
|
2002-10-12 11:37:38 +00:00
|
|
|
|
2006-12-20 17:57:56 +00:00
|
|
|
ima->lastframe= frame;
|
2002-10-12 11:37:38 +00:00
|
|
|
|
2006-12-20 17:57:56 +00:00
|
|
|
if(ima->anim==NULL) {
|
|
|
|
char str[FILE_MAX];
|
2002-10-12 11:37:38 +00:00
|
|
|
|
2006-12-20 17:57:56 +00:00
|
|
|
BLI_strncpy(str, ima->name, FILE_MAX);
|
|
|
|
if(ima->id.lib)
|
2010-03-09 17:36:23 +00:00
|
|
|
BLI_path_abs(str, ima->id.lib->filename);
|
2006-12-20 17:57:56 +00:00
|
|
|
else
|
2010-03-09 17:36:23 +00:00
|
|
|
BLI_path_abs(str, G.sce);
|
Orange branch: OpenEXR finally in Blender!
Credits go to Gernot Ziegler, who originally coded EXR support, and to
Austin Benesh for bringing it further. Kent Mein provided a lot of code
for integrating float buffers in Blender imbuf and ImBuf API cleanup,
and provided Make and Scons and static linking.
At this moment; the EXR libraries are a *dependency*, so you cannot get
the Orange branch compiled without having OpenEXR installed. Get the
(precompiled or sources) stuff from www.openexr.com. Current default is
that the headers and lib resides in /user/local/
Several changes/additions/fixes were added:
- EXR code only supported 'half' format (16 bits per channel). I've added
float writing, but for reading it I need tomorrow. :)
- Quite some clumsy copying of data happened in EXR code.
- cleaned up the api calls already a bit, preparing for more advanced
support
- Zbuffers were saved 16 bits, now 32 bits
- automatic adding of .exr extensions went wrong
Imbuf:
- added proper imbuf->flags and imbuf->mall support for float buffers, it
was created for *each* imbuf. :)
- found bugs for float buffers in scaling and flipping. Code there will
need more checks still
- imbuf also needs to be verified to behave properly when no 32 bits
rect exists (for saving for example)
TODO:
- support internal float images for textures, backbuf, AO probes, and
display in Image window
Hope this commit won't screwup syncing with bf-blender... :/
2006-01-09 00:40:35 +00:00
|
|
|
|
2006-12-20 17:57:56 +00:00
|
|
|
ima->anim = openanim(str, IB_cmap | IB_rect);
|
Biiig commit! Thanks to 2-3 weeks of cvs freeze...
Render:
- New; support for dual CPU render (SDL thread)
Currently only works with alternating scanlines, but gives excellent
performance. For both normal render as unified implemented.
Note the "mutex" locks on z-transp buffer render and imbuf loads.
- This has been made possible by major cleanups in render code, especially
getting rid of globals (example Tin Tr Tg Tb Ta for textures) or struct
OSA or using Materials or Texture data to write to.
- Made normal render fully 4x32 floats too, and removed all old optimizes
with chars or shorts.
- Made normal render and unified render use same code for sky and halo
render, giving equal (and better) results for halo render. Old render
now also uses PostProcess options (brightness, mul, gamma)
- Added option ("FBuf") in F10 Output Panel, this keeps a 4x32 bits buffer
after render. Using PostProcess menu you will note an immediate re-
display of image too (32 bits RGBA)
- Added "Hue" and "Saturation" sliders to PostProcess options
- Render module is still not having a "nice" API, but amount of dependencies
went down a lot. Next todo: remove abusive "previewrender" code.
The last main global in Render (struct Render) now can be re-used for fully
controlling a render, to allow multiple "instances" of render to open.
- Renderwindow now displays a smal bar on top with the stats, and keeps the
stats after render too. Including "spare" page support.
Not only easier visible that way, but also to remove the awkward code that
was drawing stats in the Info header (extreme slow on some ATIs too)
- Cleaned up blendef.h and BKE_utildefines.h, these two had overlapping
defines.
- I might have forgotten stuff... and will write a nice doc on the architecture!
2004-12-27 19:28:52 +00:00
|
|
|
|
2006-12-20 17:57:56 +00:00
|
|
|
/* let's initialize this user */
|
|
|
|
if(ima->anim && iuser && iuser->frames==0)
|
|
|
|
iuser->frames= IMB_anim_get_duration(ima->anim);
|
|
|
|
}
|
|
|
|
|
|
|
|
if(ima->anim) {
|
|
|
|
int dur = IMB_anim_get_duration(ima->anim);
|
|
|
|
int fra= frame-1;
|
2002-10-12 11:37:38 +00:00
|
|
|
|
2006-12-20 17:57:56 +00:00
|
|
|
if(fra<0) fra = 0;
|
|
|
|
if(fra>(dur-1)) fra= dur-1;
|
|
|
|
ibuf = IMB_anim_absolute(ima->anim, fra);
|
|
|
|
|
|
|
|
if(ibuf) {
|
|
|
|
image_initialize_after_load(ima, ibuf);
|
2008-04-28 20:57:03 +00:00
|
|
|
image_assign_ibuf(ima, ibuf, 0, frame);
|
2006-12-20 17:57:56 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
ima->ok= 0;
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
2006-12-20 17:57:56 +00:00
|
|
|
else
|
|
|
|
ima->ok= 0;
|
|
|
|
|
|
|
|
if(iuser)
|
|
|
|
iuser->ok= ima->ok;
|
|
|
|
|
|
|
|
return ibuf;
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
|
|
|
|
2006-12-20 17:57:56 +00:00
|
|
|
/* cfra used for # code, Image can only have this # for all its users */
|
|
|
|
static ImBuf *image_load_image_file(Image *ima, ImageUser *iuser, int cfra)
|
2006-07-05 17:32:49 +00:00
|
|
|
{
|
2006-12-20 17:57:56 +00:00
|
|
|
struct ImBuf *ibuf;
|
|
|
|
char str[FILE_MAX];
|
2008-04-28 20:57:03 +00:00
|
|
|
int assign = 0;
|
2006-12-20 17:57:56 +00:00
|
|
|
|
|
|
|
/* always ensure clean ima */
|
|
|
|
image_free_buffers(ima);
|
|
|
|
|
|
|
|
/* is there a PackedFile with this image ? */
|
|
|
|
if (ima->packedfile) {
|
|
|
|
ibuf = IMB_ibImageFromMemory((int *) ima->packedfile->data, ima->packedfile->size, IB_rect|IB_multilayer);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
|
|
|
|
/* get the right string */
|
|
|
|
BLI_strncpy(str, ima->name, sizeof(str));
|
|
|
|
if(ima->id.lib)
|
2010-03-09 17:36:23 +00:00
|
|
|
BLI_path_abs(str, ima->id.lib->filename);
|
2006-12-20 17:57:56 +00:00
|
|
|
else
|
2010-03-09 17:36:23 +00:00
|
|
|
BLI_path_abs(str, G.sce);
|
2008-05-04 09:41:15 +00:00
|
|
|
|
2010-03-09 17:36:23 +00:00
|
|
|
BLI_path_frame(str, cfra, 0);
|
2006-12-20 17:57:56 +00:00
|
|
|
|
|
|
|
/* read ibuf */
|
2007-10-20 16:17:27 +00:00
|
|
|
ibuf = IMB_loadiffname(str, IB_rect|IB_multilayer|IB_imginfo);
|
2006-12-20 17:57:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (ibuf) {
|
|
|
|
/* handle multilayer case, don't assign ibuf. will be handled in BKE_image_get_ibuf */
|
|
|
|
if (ibuf->ftype==OPENEXR && ibuf->userdata) {
|
|
|
|
image_create_multilayer(ima, ibuf, cfra);
|
|
|
|
ima->type= IMA_TYPE_MULTILAYER;
|
|
|
|
IMB_freeImBuf(ibuf);
|
|
|
|
ibuf= NULL;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
image_initialize_after_load(ima, ibuf);
|
2008-04-28 20:57:03 +00:00
|
|
|
assign= 1;
|
2006-12-20 17:57:56 +00:00
|
|
|
|
|
|
|
/* check if the image is a font image... */
|
|
|
|
detectBitmapFont(ibuf);
|
|
|
|
|
|
|
|
/* make packed file for autopack */
|
|
|
|
if ((ima->packedfile == NULL) && (G.fileflags & G_AUTOPACK))
|
2009-06-30 19:20:45 +00:00
|
|
|
ima->packedfile = newPackedFile(NULL, str);
|
2006-12-20 17:57:56 +00:00
|
|
|
}
|
2007-11-28 12:32:25 +00:00
|
|
|
|
|
|
|
if(ima->flag & IMA_DO_PREMUL)
|
|
|
|
converttopremul(ibuf);
|
2006-12-20 17:57:56 +00:00
|
|
|
}
|
2006-07-05 17:32:49 +00:00
|
|
|
else
|
2006-12-20 17:57:56 +00:00
|
|
|
ima->ok= 0;
|
|
|
|
|
2008-04-28 20:57:03 +00:00
|
|
|
if(assign)
|
|
|
|
image_assign_ibuf(ima, ibuf, IMA_NO_INDEX, 0);
|
|
|
|
|
2006-12-20 17:57:56 +00:00
|
|
|
if(iuser)
|
|
|
|
iuser->ok= ima->ok;
|
|
|
|
|
|
|
|
return ibuf;
|
2006-07-05 17:32:49 +00:00
|
|
|
}
|
|
|
|
|
2006-12-20 17:57:56 +00:00
|
|
|
static ImBuf *image_get_ibuf_multilayer(Image *ima, ImageUser *iuser)
|
2002-10-12 11:37:38 +00:00
|
|
|
{
|
2006-12-20 17:57:56 +00:00
|
|
|
ImBuf *ibuf= NULL;
|
Biiig commit! Thanks to 2-3 weeks of cvs freeze...
Render:
- New; support for dual CPU render (SDL thread)
Currently only works with alternating scanlines, but gives excellent
performance. For both normal render as unified implemented.
Note the "mutex" locks on z-transp buffer render and imbuf loads.
- This has been made possible by major cleanups in render code, especially
getting rid of globals (example Tin Tr Tg Tb Ta for textures) or struct
OSA or using Materials or Texture data to write to.
- Made normal render fully 4x32 floats too, and removed all old optimizes
with chars or shorts.
- Made normal render and unified render use same code for sky and halo
render, giving equal (and better) results for halo render. Old render
now also uses PostProcess options (brightness, mul, gamma)
- Added option ("FBuf") in F10 Output Panel, this keeps a 4x32 bits buffer
after render. Using PostProcess menu you will note an immediate re-
display of image too (32 bits RGBA)
- Added "Hue" and "Saturation" sliders to PostProcess options
- Render module is still not having a "nice" API, but amount of dependencies
went down a lot. Next todo: remove abusive "previewrender" code.
The last main global in Render (struct Render) now can be re-used for fully
controlling a render, to allow multiple "instances" of render to open.
- Renderwindow now displays a smal bar on top with the stats, and keeps the
stats after render too. Including "spare" page support.
Not only easier visible that way, but also to remove the awkward code that
was drawing stats in the Info header (extreme slow on some ATIs too)
- Cleaned up blendef.h and BKE_utildefines.h, these two had overlapping
defines.
- I might have forgotten stuff... and will write a nice doc on the architecture!
2004-12-27 19:28:52 +00:00
|
|
|
|
2006-12-20 17:57:56 +00:00
|
|
|
if(ima->rr==NULL) {
|
|
|
|
ibuf = image_load_image_file(ima, iuser, 0);
|
|
|
|
if(ibuf) { /* actually an error */
|
|
|
|
ima->type= IMA_TYPE_IMAGE;
|
|
|
|
return ibuf;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if(ima->rr) {
|
|
|
|
RenderPass *rpass= BKE_image_multilayer_index(ima->rr, iuser);
|
|
|
|
|
|
|
|
if(rpass) {
|
|
|
|
ibuf= IMB_allocImBuf(ima->rr->rectx, ima->rr->recty, 32, 0, 0);
|
|
|
|
|
|
|
|
image_initialize_after_load(ima, ibuf);
|
|
|
|
|
|
|
|
ibuf->rect_float= rpass->rect;
|
|
|
|
ibuf->flags |= IB_rectfloat;
|
|
|
|
ibuf->channels= rpass->channels;
|
2010-01-09 00:16:35 +00:00
|
|
|
ibuf->profile = IB_PROFILE_LINEAR_RGB;
|
2008-04-28 20:57:03 +00:00
|
|
|
|
|
|
|
image_assign_ibuf(ima, ibuf, iuser?iuser->multi_index:IMA_NO_INDEX, 0);
|
2006-12-20 17:57:56 +00:00
|
|
|
}
|
|
|
|
}
|
Biiig commit! Thanks to 2-3 weeks of cvs freeze...
Render:
- New; support for dual CPU render (SDL thread)
Currently only works with alternating scanlines, but gives excellent
performance. For both normal render as unified implemented.
Note the "mutex" locks on z-transp buffer render and imbuf loads.
- This has been made possible by major cleanups in render code, especially
getting rid of globals (example Tin Tr Tg Tb Ta for textures) or struct
OSA or using Materials or Texture data to write to.
- Made normal render fully 4x32 floats too, and removed all old optimizes
with chars or shorts.
- Made normal render and unified render use same code for sky and halo
render, giving equal (and better) results for halo render. Old render
now also uses PostProcess options (brightness, mul, gamma)
- Added option ("FBuf") in F10 Output Panel, this keeps a 4x32 bits buffer
after render. Using PostProcess menu you will note an immediate re-
display of image too (32 bits RGBA)
- Added "Hue" and "Saturation" sliders to PostProcess options
- Render module is still not having a "nice" API, but amount of dependencies
went down a lot. Next todo: remove abusive "previewrender" code.
The last main global in Render (struct Render) now can be re-used for fully
controlling a render, to allow multiple "instances" of render to open.
- Renderwindow now displays a smal bar on top with the stats, and keeps the
stats after render too. Including "spare" page support.
Not only easier visible that way, but also to remove the awkward code that
was drawing stats in the Info header (extreme slow on some ATIs too)
- Cleaned up blendef.h and BKE_utildefines.h, these two had overlapping
defines.
- I might have forgotten stuff... and will write a nice doc on the architecture!
2004-12-27 19:28:52 +00:00
|
|
|
|
2006-12-20 17:57:56 +00:00
|
|
|
if(ibuf==NULL)
|
|
|
|
ima->ok= 0;
|
|
|
|
if(iuser)
|
|
|
|
iuser->ok= ima->ok;
|
2002-10-12 11:37:38 +00:00
|
|
|
|
2006-12-20 17:57:56 +00:00
|
|
|
return ibuf;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* showing RGBA result itself (from compo/sequence) or
|
|
|
|
like exr, using layers etc */
|
2009-02-05 19:28:28 +00:00
|
|
|
/* always returns a single ibuf, also during render progress */
|
2009-09-30 18:18:32 +00:00
|
|
|
static ImBuf *image_get_render_result(Image *ima, ImageUser *iuser, void **lock_r)
|
2006-12-20 17:57:56 +00:00
|
|
|
{
|
2010-03-16 16:58:45 +00:00
|
|
|
Render *re;
|
|
|
|
RenderResult rres;
|
|
|
|
float *rectf, *rectz;
|
|
|
|
unsigned int *rect;
|
|
|
|
float dither;
|
|
|
|
int channels, layer, pass;
|
|
|
|
ImBuf *ibuf;
|
2010-03-27 15:35:34 +00:00
|
|
|
int from_render= (ima->render_slot == ima->last_render_slot);
|
2010-03-16 16:58:45 +00:00
|
|
|
|
|
|
|
if(!(iuser && iuser->scene))
|
|
|
|
return NULL;
|
|
|
|
|
2009-09-30 18:18:32 +00:00
|
|
|
/* if we the caller is not going to release the lock, don't give the image */
|
|
|
|
if(!lock_r)
|
|
|
|
return NULL;
|
|
|
|
|
2010-03-27 15:35:34 +00:00
|
|
|
re= RE_GetRender(iuser->scene->id.name);
|
2010-03-16 16:58:45 +00:00
|
|
|
|
|
|
|
channels= 4;
|
|
|
|
layer= (iuser)? iuser->layer: 0;
|
|
|
|
pass= (iuser)? iuser->pass: 0;
|
2010-03-27 15:35:34 +00:00
|
|
|
|
|
|
|
if(from_render)
|
|
|
|
RE_AcquireResultImage(re, &rres);
|
|
|
|
else if(ima->renders[ima->render_slot])
|
|
|
|
rres= *(ima->renders[ima->render_slot]);
|
|
|
|
else
|
|
|
|
memset(&rres, 0, sizeof(RenderResult));
|
2010-03-16 16:58:45 +00:00
|
|
|
|
2010-03-27 15:35:34 +00:00
|
|
|
if(!(rres.rectx > 0 && rres.recty > 0)) {
|
2010-04-01 12:51:24 +00:00
|
|
|
if(from_render)
|
|
|
|
RE_ReleaseResultImage(re);
|
2010-03-27 15:35:34 +00:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* release is done in BKE_image_release_ibuf using lock_r */
|
2010-04-01 12:51:24 +00:00
|
|
|
if(from_render) {
|
|
|
|
BLI_lock_thread(LOCK_VIEWER);
|
2010-03-27 15:35:34 +00:00
|
|
|
*lock_r= re;
|
2010-04-01 12:51:24 +00:00
|
|
|
}
|
2010-03-27 15:35:34 +00:00
|
|
|
|
2010-03-16 16:58:45 +00:00
|
|
|
/* this gives active layer, composite or seqence result */
|
|
|
|
rect= (unsigned int *)rres.rect32;
|
|
|
|
rectf= rres.rectf;
|
|
|
|
rectz= rres.rectz;
|
|
|
|
dither= iuser->scene->r.dither_intensity;
|
|
|
|
|
|
|
|
/* get compo/seq result by default */
|
2010-04-01 12:51:24 +00:00
|
|
|
if(rres.compo_seq && layer==0);
|
2010-03-16 16:58:45 +00:00
|
|
|
else if(rres.layers.first) {
|
2010-04-01 12:51:24 +00:00
|
|
|
RenderLayer *rl= BLI_findlink(&rres.layers, layer-(rres.compo_seq?1:0));
|
2010-03-16 16:58:45 +00:00
|
|
|
if(rl) {
|
|
|
|
RenderPass *rpass;
|
|
|
|
|
|
|
|
/* there's no combined pass, is in renderlayer itself */
|
|
|
|
if(pass==0) {
|
|
|
|
rectf= rl->rectf;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
rpass= BLI_findlink(&rl->passes, pass-1);
|
|
|
|
if(rpass) {
|
|
|
|
channels= rpass->channels;
|
|
|
|
rectf= rpass->rect;
|
|
|
|
dither= 0.0f; /* don't dither passes */
|
|
|
|
}
|
|
|
|
}
|
2010-02-16 19:24:04 +00:00
|
|
|
|
2010-03-16 16:58:45 +00:00
|
|
|
for(rpass= rl->passes.first; rpass; rpass= rpass->next)
|
|
|
|
if(rpass->passtype == SCE_PASS_Z)
|
|
|
|
rectz= rpass->rect;
|
|
|
|
}
|
2009-02-05 19:28:28 +00:00
|
|
|
}
|
2010-02-07 00:28:49 +00:00
|
|
|
|
2010-03-16 16:58:45 +00:00
|
|
|
ibuf= image_get_ibuf(ima, IMA_NO_INDEX, 0);
|
2006-12-20 17:57:56 +00:00
|
|
|
|
2010-03-16 16:58:45 +00:00
|
|
|
/* make ibuf if needed, and initialize it */
|
|
|
|
if(ibuf==NULL) {
|
|
|
|
ibuf= IMB_allocImBuf(rres.rectx, rres.recty, 32, 0, 0);
|
|
|
|
image_assign_ibuf(ima, ibuf, IMA_NO_INDEX, 0);
|
|
|
|
}
|
2010-03-27 15:35:34 +00:00
|
|
|
|
2010-03-16 16:58:45 +00:00
|
|
|
ibuf->x= rres.rectx;
|
|
|
|
ibuf->y= rres.recty;
|
|
|
|
|
2010-04-01 12:51:24 +00:00
|
|
|
if(ibuf->rect_float!=rectf || rect) /* ensure correct redraw */
|
2010-03-16 16:58:45 +00:00
|
|
|
imb_freerectImBuf(ibuf);
|
2010-04-01 12:51:24 +00:00
|
|
|
|
2010-03-16 16:58:45 +00:00
|
|
|
if(rect)
|
|
|
|
ibuf->rect= rect;
|
|
|
|
|
2010-04-23 18:02:50 +00:00
|
|
|
if(rectf) {
|
|
|
|
ibuf->rect_float= rectf;
|
|
|
|
ibuf->flags |= IB_rectfloat;
|
|
|
|
ibuf->channels= channels;
|
|
|
|
}
|
2010-04-26 12:50:48 +00:00
|
|
|
else {
|
|
|
|
ibuf->rect_float= NULL;
|
|
|
|
ibuf->flags &= ~IB_rectfloat;
|
|
|
|
}
|
2010-04-23 18:02:50 +00:00
|
|
|
|
|
|
|
if(rectz) {
|
|
|
|
ibuf->zbuf_float= rectz;
|
|
|
|
ibuf->flags |= IB_zbuffloat;
|
|
|
|
}
|
2010-04-26 12:50:48 +00:00
|
|
|
else {
|
|
|
|
ibuf->zbuf_float= NULL;
|
|
|
|
ibuf->flags &= ~IB_zbuffloat;
|
|
|
|
}
|
2010-04-23 18:02:50 +00:00
|
|
|
|
2010-03-16 16:58:45 +00:00
|
|
|
ibuf->dither= dither;
|
2009-09-30 18:18:32 +00:00
|
|
|
|
2010-03-16 16:58:45 +00:00
|
|
|
ima->ok= IMA_OK_LOADED;
|
2009-09-30 18:18:32 +00:00
|
|
|
|
2010-03-16 16:58:45 +00:00
|
|
|
return ibuf;
|
2006-12-20 17:57:56 +00:00
|
|
|
}
|
|
|
|
|
2008-04-28 20:57:03 +00:00
|
|
|
static ImBuf *image_get_ibuf_threadsafe(Image *ima, ImageUser *iuser, int *frame_r, int *index_r)
|
2006-12-20 17:57:56 +00:00
|
|
|
{
|
2008-04-28 20:57:03 +00:00
|
|
|
ImBuf *ibuf = NULL;
|
|
|
|
int frame = 0, index = 0;
|
2006-12-20 17:57:56 +00:00
|
|
|
|
2008-04-28 20:57:03 +00:00
|
|
|
/* see if we already have an appropriate ibuf, with image source and type */
|
2006-12-20 17:57:56 +00:00
|
|
|
if(ima->source==IMA_SRC_MOVIE) {
|
2008-04-28 20:57:03 +00:00
|
|
|
frame= iuser?iuser->framenr:ima->lastframe;
|
2006-12-20 17:57:56 +00:00
|
|
|
ibuf= image_get_ibuf(ima, 0, frame);
|
2010-02-13 21:24:13 +00:00
|
|
|
/* XXX temp stuff? */
|
|
|
|
if(ima->lastframe != frame)
|
|
|
|
ima->tpageflag |= IMA_TPAGE_REFRESH;
|
|
|
|
ima->lastframe = frame;
|
2006-12-20 17:57:56 +00:00
|
|
|
}
|
|
|
|
else if(ima->source==IMA_SRC_SEQUENCE) {
|
|
|
|
if(ima->type==IMA_TYPE_IMAGE) {
|
2008-04-28 20:57:03 +00:00
|
|
|
frame= iuser?iuser->framenr:ima->lastframe;
|
2006-12-20 17:57:56 +00:00
|
|
|
ibuf= image_get_ibuf(ima, 0, frame);
|
2010-02-13 13:09:30 +00:00
|
|
|
|
|
|
|
/* XXX temp stuff? */
|
|
|
|
if(ima->lastframe != frame)
|
|
|
|
ima->tpageflag |= IMA_TPAGE_REFRESH;
|
|
|
|
ima->lastframe = frame;
|
2010-04-01 12:51:24 +00:00
|
|
|
}
|
2008-04-28 20:57:03 +00:00
|
|
|
else if(ima->type==IMA_TYPE_MULTILAYER) {
|
|
|
|
frame= iuser?iuser->framenr:ima->lastframe;
|
|
|
|
index= iuser?iuser->multi_index:IMA_NO_INDEX;
|
2006-12-20 17:57:56 +00:00
|
|
|
ibuf= image_get_ibuf(ima, index, frame);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if(ima->source==IMA_SRC_FILE) {
|
2008-04-28 20:57:03 +00:00
|
|
|
if(ima->type==IMA_TYPE_IMAGE)
|
2006-12-20 17:57:56 +00:00
|
|
|
ibuf= image_get_ibuf(ima, IMA_NO_INDEX, 0);
|
2008-04-28 20:57:03 +00:00
|
|
|
else if(ima->type==IMA_TYPE_MULTILAYER)
|
2006-12-20 17:57:56 +00:00
|
|
|
ibuf= image_get_ibuf(ima, iuser?iuser->multi_index:IMA_NO_INDEX, 0);
|
|
|
|
}
|
|
|
|
else if(ima->source == IMA_SRC_GENERATED) {
|
|
|
|
ibuf= image_get_ibuf(ima, IMA_NO_INDEX, 0);
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
2006-12-20 17:57:56 +00:00
|
|
|
else if(ima->source == IMA_SRC_VIEWER) {
|
|
|
|
if(ima->type==IMA_TYPE_R_RESULT) {
|
2008-04-28 20:57:03 +00:00
|
|
|
/* always verify entirely, not that this shouldn't happen
|
|
|
|
* during render anyway */
|
2006-12-20 17:57:56 +00:00
|
|
|
}
|
|
|
|
else if(ima->type==IMA_TYPE_COMPOSITE) {
|
2008-04-28 20:57:03 +00:00
|
|
|
frame= iuser?iuser->framenr:0;
|
2006-12-20 17:57:56 +00:00
|
|
|
ibuf= image_get_ibuf(ima, 0, frame);
|
2008-04-28 20:57:03 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
*frame_r = frame;
|
|
|
|
*index_r = index;
|
|
|
|
|
|
|
|
return ibuf;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Checks optional ImageUser and verifies/creates ImBuf. */
|
2009-09-30 18:18:32 +00:00
|
|
|
/* use this one if you want to get a render result in progress,
|
|
|
|
* if not, use BKE_image_get_ibuf which doesn't require a release */
|
|
|
|
ImBuf *BKE_image_acquire_ibuf(Image *ima, ImageUser *iuser, void **lock_r)
|
2008-04-28 20:57:03 +00:00
|
|
|
{
|
|
|
|
ImBuf *ibuf= NULL;
|
|
|
|
float color[] = {0, 0, 0, 1};
|
|
|
|
int frame= 0, index= 0;
|
|
|
|
|
|
|
|
/* This function is intended to be thread-safe. It postpones the mutex lock
|
|
|
|
* until it needs to load the image, if the image is already there it
|
|
|
|
* should just get the pointer and return. The reason is that a lot of mutex
|
|
|
|
* locks appears to be very slow on certain multicore macs, causing a render
|
|
|
|
* with image textures to actually slow down as more threads are used.
|
|
|
|
*
|
|
|
|
* Note that all the image loading functions should also make sure they do
|
|
|
|
* things in a threadsafe way for image_get_ibuf_threadsafe to work correct.
|
|
|
|
* That means, the last two steps must be, 1) add the ibuf to the list and
|
|
|
|
* 2) set ima/iuser->ok to 0 to IMA_OK_LOADED */
|
2009-09-30 18:18:32 +00:00
|
|
|
|
|
|
|
if(lock_r)
|
|
|
|
*lock_r= NULL;
|
2008-04-28 20:57:03 +00:00
|
|
|
|
|
|
|
/* quick reject tests */
|
|
|
|
if(ima==NULL)
|
|
|
|
return NULL;
|
|
|
|
if(iuser) {
|
|
|
|
if(iuser->ok==0)
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
else if(ima->ok==0)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
/* try to get the ibuf without locking */
|
|
|
|
ibuf= image_get_ibuf_threadsafe(ima, iuser, &frame, &index);
|
|
|
|
|
|
|
|
if(ibuf == NULL) {
|
|
|
|
/* couldn't get ibuf and image is not ok, so let's lock and try to
|
|
|
|
* load the image */
|
|
|
|
BLI_lock_thread(LOCK_IMAGE);
|
|
|
|
|
|
|
|
/* need to check ok flag and loading ibuf again, because the situation
|
|
|
|
* might have changed in the meantime */
|
|
|
|
if(iuser) {
|
|
|
|
if(iuser->ok==0) {
|
|
|
|
BLI_unlock_thread(LOCK_IMAGE);
|
|
|
|
return NULL;
|
2006-12-20 17:57:56 +00:00
|
|
|
}
|
|
|
|
}
|
2008-04-28 20:57:03 +00:00
|
|
|
else if(ima->ok==0) {
|
|
|
|
BLI_unlock_thread(LOCK_IMAGE);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
ibuf= image_get_ibuf_threadsafe(ima, iuser, &frame, &index);
|
|
|
|
|
|
|
|
if(ibuf == NULL) {
|
|
|
|
/* we are sure we have to load the ibuf, using source and type */
|
|
|
|
if(ima->source==IMA_SRC_MOVIE) {
|
|
|
|
/* source is from single file, use flipbook to store ibuf */
|
|
|
|
ibuf= image_load_movie_file(ima, iuser, frame);
|
|
|
|
}
|
|
|
|
else if(ima->source==IMA_SRC_SEQUENCE) {
|
|
|
|
if(ima->type==IMA_TYPE_IMAGE) {
|
|
|
|
/* regular files, ibufs in flipbook, allows saving */
|
|
|
|
ibuf= image_load_sequence_file(ima, iuser, frame);
|
|
|
|
}
|
|
|
|
/* no else; on load the ima type can change */
|
|
|
|
if(ima->type==IMA_TYPE_MULTILAYER) {
|
|
|
|
/* only 1 layer/pass stored in imbufs, no exrhandle anim storage, no saving */
|
|
|
|
ibuf= image_load_sequence_multilayer(ima, iuser, frame);
|
|
|
|
}
|
|
|
|
|
|
|
|
if(ibuf)
|
|
|
|
BLI_strncpy(ima->name, ibuf->name, sizeof(ima->name));
|
|
|
|
}
|
|
|
|
else if(ima->source==IMA_SRC_FILE) {
|
|
|
|
|
|
|
|
if(ima->type==IMA_TYPE_IMAGE)
|
2009-01-04 14:14:06 +00:00
|
|
|
ibuf= image_load_image_file(ima, iuser, frame); /* cfra only for '#', this global is OK */
|
2008-04-28 20:57:03 +00:00
|
|
|
/* no else; on load the ima type can change */
|
|
|
|
if(ima->type==IMA_TYPE_MULTILAYER)
|
|
|
|
/* keeps render result, stores ibufs in listbase, allows saving */
|
|
|
|
ibuf= image_get_ibuf_multilayer(ima, iuser);
|
|
|
|
|
|
|
|
}
|
|
|
|
else if(ima->source == IMA_SRC_GENERATED) {
|
|
|
|
/* generated is: ibuf is allocated dynamically */
|
2009-01-04 18:16:34 +00:00
|
|
|
/* UV testgrid or black or solid etc */
|
2009-09-16 19:27:08 +00:00
|
|
|
if(ima->gen_x==0) ima->gen_x= 1024;
|
|
|
|
if(ima->gen_y==0) ima->gen_y= 1024;
|
2009-01-04 18:16:34 +00:00
|
|
|
ibuf= add_ibuf_size(ima->gen_x, ima->gen_y, ima->name, 0, ima->gen_type, color);
|
|
|
|
image_assign_ibuf(ima, ibuf, IMA_NO_INDEX, 0);
|
|
|
|
ima->ok= IMA_OK_LOADED;
|
2008-04-28 20:57:03 +00:00
|
|
|
}
|
|
|
|
else if(ima->source == IMA_SRC_VIEWER) {
|
|
|
|
if(ima->type==IMA_TYPE_R_RESULT) {
|
2009-09-30 18:18:32 +00:00
|
|
|
/* always verify entirely, and potentially
|
|
|
|
returns pointer to release later */
|
|
|
|
ibuf= image_get_render_result(ima, iuser, lock_r);
|
2008-04-28 20:57:03 +00:00
|
|
|
}
|
|
|
|
else if(ima->type==IMA_TYPE_COMPOSITE) {
|
2010-03-16 16:58:45 +00:00
|
|
|
/* requires lock/unlock, otherwise don't return image */
|
|
|
|
if(lock_r) {
|
|
|
|
/* unlock in BKE_image_release_ibuf */
|
|
|
|
BLI_lock_thread(LOCK_VIEWER);
|
|
|
|
*lock_r= ima;
|
|
|
|
|
|
|
|
/* Composite Viewer, all handled in compositor */
|
|
|
|
/* fake ibuf, will be filled in compositor */
|
|
|
|
ibuf= IMB_allocImBuf(256, 256, 32, IB_rect, 0);
|
|
|
|
image_assign_ibuf(ima, ibuf, 0, frame);
|
|
|
|
}
|
2008-04-28 20:57:03 +00:00
|
|
|
}
|
2006-12-20 17:57:56 +00:00
|
|
|
}
|
|
|
|
}
|
2008-04-28 20:57:03 +00:00
|
|
|
|
|
|
|
BLI_unlock_thread(LOCK_IMAGE);
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
3D view orbit option: Around Active
This fixes the active object in place when orbiting the view.
Choppy 15fps demo can be seen there: http://www.elysiun.com/~theeth/bf/around_active.html
Image Memory Grabage Collection
This adds memory handling to the image code. An image is tagged each time it is used.
During a collection cycle (frequency of cycles is user defined), if an image is older
than a user defined limit, its buffer gets deallocated. This also applies to gl memory buffers.
Images that are loading in GL memory needs to go through two time outs before being fully deallocated: the first time out deallocated the gl memorry, the second the buffer in ram.
Notes:
Image buffer loaded from python gets tagged as permanent upon load. That tag is removed when python stops using the image.
I might have missed some tagging spots, especially in the rendering pipeline. Someone with more knowledge about this code should check to be careful.
Tagging is done on every access, for rendering, this will probably be a performance hit. A scheme should be developped to only tag when the rendering is completed.
Collecting is called in draw_object, most likely not the best place to do it.
Safe from undo, since using undo deallocates memory anyway (like when loading a blend file with one currently opened)
Userpref DNA changes:
I've changed a couple of flagging variables from short to int. Some because they needed more space, others to keep SDNA happy.
Info window changes:
I've grouped a couple of buttons in aligned blocks and changed the color of mutually exclusive options to make them clearer.
Matt didn't do any changes on that in tuhopuu, so hopefully I'm not stepping on anyone's feet with this.
Also changed double constants into floats with f in a couple of places (mostly space.c) to make compiler happier.
2005-07-06 00:33:41 +00:00
|
|
|
|
2008-04-28 20:57:03 +00:00
|
|
|
/* we assuming that if it is not rendering, it's also not multithreaded
|
|
|
|
* (a somewhat weak assumption) */
|
2006-12-20 17:57:56 +00:00
|
|
|
if(G.rendering==0)
|
|
|
|
tag_image_time(ima);
|
|
|
|
|
|
|
|
return ibuf;
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
|
|
|
|
2009-09-30 18:18:32 +00:00
|
|
|
void BKE_image_release_ibuf(Image *ima, void *lock)
|
|
|
|
{
|
2010-03-16 16:58:45 +00:00
|
|
|
/* for getting image during threaded render / compositing, need to release */
|
2010-04-01 12:51:24 +00:00
|
|
|
if(lock == ima) {
|
2010-03-16 16:58:45 +00:00
|
|
|
BLI_unlock_thread(LOCK_VIEWER); /* viewer image */
|
2010-04-01 12:51:24 +00:00
|
|
|
}
|
|
|
|
else if(lock) {
|
2010-03-16 16:58:45 +00:00
|
|
|
RE_ReleaseResultImage(lock); /* render result */
|
2010-04-01 12:51:24 +00:00
|
|
|
BLI_unlock_thread(LOCK_VIEWER); /* view image imbuf */
|
|
|
|
}
|
2009-09-30 18:18:32 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
ImBuf *BKE_image_get_ibuf(Image *ima, ImageUser *iuser)
|
|
|
|
{
|
|
|
|
return BKE_image_acquire_ibuf(ima, iuser, NULL);
|
|
|
|
}
|
2002-10-12 11:37:38 +00:00
|
|
|
|
2010-01-19 14:04:33 +00:00
|
|
|
void BKE_image_user_calc_frame(ImageUser *iuser, int cfra, int fieldnr)
|
2006-12-20 17:57:56 +00:00
|
|
|
{
|
|
|
|
int imanr, len;
|
|
|
|
|
|
|
|
/* here (+fie_ima/2-1) makes sure that division happens correctly */
|
|
|
|
len= (iuser->fie_ima*iuser->frames)/2;
|
|
|
|
|
|
|
|
if(len==0) {
|
|
|
|
iuser->framenr= 0;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
cfra= cfra - iuser->sfra+1;
|
|
|
|
|
|
|
|
/* cyclic */
|
|
|
|
if(iuser->cycl) {
|
|
|
|
cfra= ( (cfra) % len );
|
|
|
|
if(cfra < 0) cfra+= len;
|
|
|
|
if(cfra==0) cfra= len;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(cfra<1) cfra= 1;
|
|
|
|
else if(cfra>len) cfra= len;
|
|
|
|
|
|
|
|
/* convert current frame to current field */
|
|
|
|
cfra= 2*(cfra);
|
|
|
|
if(fieldnr) cfra++;
|
|
|
|
|
|
|
|
/* transform to images space */
|
|
|
|
imanr= (cfra+iuser->fie_ima-2)/iuser->fie_ima;
|
|
|
|
if(imanr>iuser->frames) imanr= iuser->frames;
|
|
|
|
imanr+= iuser->offset;
|
|
|
|
|
|
|
|
if(iuser->cycl) {
|
|
|
|
imanr= ( (imanr) % len );
|
|
|
|
while(imanr < 0) imanr+= len;
|
|
|
|
if(imanr==0) imanr= len;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* allows image users to handle redraws */
|
|
|
|
if(iuser->flag & IMA_ANIM_ALWAYS)
|
|
|
|
if(imanr!=iuser->framenr)
|
|
|
|
iuser->flag |= IMA_ANIM_REFRESHED;
|
|
|
|
|
|
|
|
iuser->framenr= imanr;
|
|
|
|
if(iuser->ok==0) iuser->ok= 1;
|
|
|
|
}
|
|
|
|
}
|