svn merge ^/trunk/blender -r42722:42742

This commit is contained in:
Campbell Barton 2011-12-20 01:33:14 +00:00
commit efb4eff353
25 changed files with 215 additions and 263 deletions

@ -723,11 +723,7 @@ elseif(WIN32)
set(GETTEXT_LIBRARIES gnu_gettext) set(GETTEXT_LIBRARIES gnu_gettext)
endif() endif()
if(CMAKE_CL_64) set(PNG_LIBRARIES libpng)
set(PNG_LIBRARIES libpng)
else()
set(PNG_LIBRARIES libpng_st)
endif()
set(JPEG_LIBRARIES libjpeg) set(JPEG_LIBRARIES libjpeg)
set(PNG "${LIBDIR}/png") set(PNG "${LIBDIR}/png")

@ -726,10 +726,6 @@ if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'win64-vc', 'linuxcross'):
# For MinGW and linuxcross static linking will be used # For MinGW and linuxcross static linking will be used
dllsources += ['${LCGDIR}/gettext/lib/gnu_gettext.dll'] dllsources += ['${LCGDIR}/gettext/lib/gnu_gettext.dll']
#currently win64-vc doesn't appear to have libpng.dll
if env['OURPLATFORM'] != 'win64-vc':
dllsources += ['${BF_PNG_LIBPATH}/libpng.dll']
dllsources += ['${BF_ZLIB_LIBPATH}/zlib.dll'] dllsources += ['${BF_ZLIB_LIBPATH}/zlib.dll']
# Used when linking to libtiff was dynamic # Used when linking to libtiff was dynamic
# keep it here until compilation on all platform would be ok # keep it here until compilation on all platform would be ok

@ -64,7 +64,7 @@ BF_JPEG_LIB = 'liblibjpeg'
BF_JPEG_LIBPATH = '${BF_JPEG}/lib' BF_JPEG_LIBPATH = '${BF_JPEG}/lib'
WITH_BF_PNG = True WITH_BF_PNG = True
BF_PNG = LIBDIR + 'gcc/png' BF_PNG = LIBDIR + '/gcc/png'
BF_PNG_INC = '${BF_PNG}/include' BF_PNG_INC = '${BF_PNG}/include'
BF_PNG_LIB = 'png' BF_PNG_LIB = 'png'
BF_PNG_LIBPATH = '${BF_PNG}/lib' BF_PNG_LIBPATH = '${BF_PNG}/lib'

@ -72,7 +72,7 @@ BF_JPEG_LIBPATH = '${BF_JPEG}/lib'
WITH_BF_PNG = True WITH_BF_PNG = True
BF_PNG = LIBDIR + '/png' BF_PNG = LIBDIR + '/png'
BF_PNG_INC = '${BF_PNG}/include' BF_PNG_INC = '${BF_PNG}/include'
BF_PNG_LIB = 'libpng_st' BF_PNG_LIB = 'libpng'
BF_PNG_LIBPATH = '${BF_PNG}/lib' BF_PNG_LIBPATH = '${BF_PNG}/lib'
WITH_BF_TIFF = True WITH_BF_TIFF = True

@ -207,6 +207,7 @@ static void blender_camera_sync(Camera *cam, BlenderCamera *bcam, int width, int
/* transform, note the blender camera points along the negative z-axis */ /* transform, note the blender camera points along the negative z-axis */
cam->matrix = bcam->matrix * transform_scale(1.0f, 1.0f, -1.0f); cam->matrix = bcam->matrix * transform_scale(1.0f, 1.0f, -1.0f);
cam->matrix = transform_clear_scale(cam->matrix);
/* set update flag */ /* set update flag */
if(cam->modified(prevcam)) if(cam->modified(prevcam))

@ -209,6 +209,13 @@ __device_inline float3 transform_get_column(const Transform *t, int column)
return make_float3(t->x[column], t->y[column], t->z[column]); return make_float3(t->x[column], t->y[column], t->z[column]);
} }
__device_inline void transform_set_column(Transform *t, int column, float3 value)
{
t->x[column] = value.x;
t->y[column] = value.y;
t->z[column] = value.z;
}
Transform transform_inverse(const Transform& a); Transform transform_inverse(const Transform& a);
__device_inline bool transform_uniform_scale(const Transform& tfm, float& scale) __device_inline bool transform_uniform_scale(const Transform& tfm, float& scale)
@ -244,6 +251,17 @@ __device_inline bool transform_negative_scale(const Transform& tfm)
return (dot(cross(c0, c1), c2) < 0.0f); return (dot(cross(c0, c1), c2) < 0.0f);
} }
__device_inline Transform transform_clear_scale(const Transform& tfm)
{
Transform ntfm = tfm;
transform_set_column(&ntfm, 0, normalize(transform_get_column(&ntfm, 0)));
transform_set_column(&ntfm, 1, normalize(transform_get_column(&ntfm, 1)));
transform_set_column(&ntfm, 2, normalize(transform_get_column(&ntfm, 2)));
return ntfm;
}
#endif #endif
CCL_NAMESPACE_END CCL_NAMESPACE_END

@ -34,6 +34,7 @@
#endif #endif
#include <OpenGL/gl.h> #include <OpenGL/gl.h>
#include <OpenGL/CGLRenderers.h>
/***** Multithreaded opengl code : uncomment for enabling /***** Multithreaded opengl code : uncomment for enabling
#include <OpenGL/OpenGL.h> #include <OpenGL/OpenGL.h>
*/ */
@ -485,7 +486,14 @@ GHOST_WindowCocoa::GHOST_WindowCocoa(
// needed for 'Draw Overlap' drawing method // needed for 'Draw Overlap' drawing method
pixelFormatAttrsWindow[i++] = NSOpenGLPFABackingStore; pixelFormatAttrsWindow[i++] = NSOpenGLPFABackingStore;
pixelFormatAttrsWindow[i++] = NSOpenGLPFAAccelerated; // Force software OpenGL, for debugging
if(getenv("BLENDER_SOFTWAREGL")) {
pixelFormatAttrsWindow[i++] = NSOpenGLPFARendererID;
pixelFormatAttrsWindow[i++] = kCGLRendererGenericID;
}
else
pixelFormatAttrsWindow[i++] = NSOpenGLPFAAccelerated;
//pixelFormatAttrsWindow[i++] = NSOpenGLPFAAllowOfflineRenderers,; // Removed to allow 10.4 builds, and 2 GPUs rendering is not used anyway //pixelFormatAttrsWindow[i++] = NSOpenGLPFAAllowOfflineRenderers,; // Removed to allow 10.4 builds, and 2 GPUs rendering is not used anyway
pixelFormatAttrsWindow[i++] = NSOpenGLPFADepthSize; pixelFormatAttrsWindow[i++] = NSOpenGLPFADepthSize;
@ -521,7 +529,14 @@ GHOST_WindowCocoa::GHOST_WindowCocoa(
// needed for 'Draw Overlap' drawing method // needed for 'Draw Overlap' drawing method
pixelFormatAttrsWindow[i++] = NSOpenGLPFABackingStore; pixelFormatAttrsWindow[i++] = NSOpenGLPFABackingStore;
pixelFormatAttrsWindow[i++] = NSOpenGLPFAAccelerated; // Force software OpenGL, for debugging
if(getenv("BLENDER_SOFTWAREGL")) {
pixelFormatAttrsWindow[i++] = NSOpenGLPFARendererID;
pixelFormatAttrsWindow[i++] = kCGLRendererGenericID;
}
else
pixelFormatAttrsWindow[i++] = NSOpenGLPFAAccelerated;
//pixelFormatAttrsWindow[i++] = NSOpenGLPFAAllowOfflineRenderers,; // Removed to allow 10.4 builds, and 2 GPUs rendering is not used anyway //pixelFormatAttrsWindow[i++] = NSOpenGLPFAAllowOfflineRenderers,; // Removed to allow 10.4 builds, and 2 GPUs rendering is not used anyway
pixelFormatAttrsWindow[i++] = NSOpenGLPFADepthSize; pixelFormatAttrsWindow[i++] = NSOpenGLPFADepthSize;

@ -174,9 +174,7 @@ class TEXT_MT_text(Menu):
st = context.space_data st = context.space_data
text = st.text text = st.text
layout.operator_context = 'EXEC_AREA'
layout.operator("text.new") layout.operator("text.new")
layout.operator_context = 'INVOKE_AREA'
layout.operator("text.open") layout.operator("text.open")
if text: if text:

@ -305,8 +305,6 @@ void ntreeSwitchID(struct bNodeTree *ntree, struct ID *sce_from, struct ID *sc
void ntreeMakeLocal(struct bNodeTree *ntree); void ntreeMakeLocal(struct bNodeTree *ntree);
int ntreeHasType(struct bNodeTree *ntree, int type); int ntreeHasType(struct bNodeTree *ntree, int type);
void ntreeSocketUseFlags(struct bNodeTree *ntree);
void ntreeUpdateTree(struct bNodeTree *ntree); void ntreeUpdateTree(struct bNodeTree *ntree);
/* XXX Currently each tree update call does call to ntreeVerifyNodes too. /* XXX Currently each tree update call does call to ntreeVerifyNodes too.
* Some day this should be replaced by a decent depsgraph automatism! * Some day this should be replaced by a decent depsgraph automatism!

@ -67,7 +67,7 @@ void free_plugin_tex(struct PluginTex *pit);
void init_colorband(struct ColorBand *coba, int rangetype); void init_colorband(struct ColorBand *coba, int rangetype);
struct ColorBand *add_colorband(int rangetype); struct ColorBand *add_colorband(int rangetype);
int do_colorband(struct ColorBand *coba, float in, float out[4]); int do_colorband(const struct ColorBand *coba, float in, float out[4]);
void colorband_table_RGBA(struct ColorBand *coba, float **array, int *size); void colorband_table_RGBA(struct ColorBand *coba, float **array, int *size);
int vergcband(const void *a1, const void *a2); int vergcband(const void *a1, const void *a2);
struct CBData *colorband_element_add(struct ColorBand *coba, float position); struct CBData *colorband_element_add(struct ColorBand *coba, float position);

@ -883,7 +883,7 @@ enum {
CALC_WP_AUTO_NORMALIZE= (1<<1) CALC_WP_AUTO_NORMALIZE= (1<<1)
}; };
void weightpaint_color(unsigned char r_col[4], ColorBand *coba, const float input) static void weightpaint_color(unsigned char r_col[4], ColorBand *coba, const float input)
{ {
float colf[4]; float colf[4];
@ -910,10 +910,10 @@ static void calc_weightpaint_vert_color(
if ((selected > 1) && (draw_flag & CALC_WP_MULTIPAINT)) { if ((selected > 1) && (draw_flag & CALC_WP_MULTIPAINT)) {
int was_a_nonzero= FALSE; int was_a_nonzero= FALSE;
int i; unsigned int i;
MDeformWeight *dw= dv->dw; MDeformWeight *dw= dv->dw;
for (i = dv->totweight; i > 0; i--, dw++) { for (i = dv->totweight; i != 0; i--, dw++) {
/* in multipaint, get the average if auto normalize is inactive /* in multipaint, get the average if auto normalize is inactive
* get the sum if it is active */ * get the sum if it is active */
if (dw->def_nr < defbase_tot) { if (dw->def_nr < defbase_tot) {
@ -958,70 +958,81 @@ void vDM_ColorBand_store(ColorBand *coba)
stored_cb= coba; stored_cb= coba;
} }
static void add_weight_mcol_dm(Object *ob, DerivedMesh *dm, int const draw_flag) /* return an array of vertex weight colors */
static unsigned char *calc_weightpaint_vert_array(Object *ob, int const draw_flag, ColorBand *coba)
{ {
Mesh *me = ob->data; Mesh *me = ob->data;
unsigned char *wtcol_v = MEM_callocN (sizeof(unsigned char) * me->totvert * 4, "weightmap_v");
if (me->dvert) {
unsigned char *wc = wtcol_v;
MDeformVert *dv= me->dvert;
unsigned int i;
/* varisbles for multipaint */
const int defbase_tot = BLI_countlist(&ob->defbase);
const int defbase_act = ob->actdef-1;
char *dg_flags = MEM_mallocN(defbase_tot * sizeof(char), __func__);
const int selected = get_selected_defgroups(ob, dg_flags, defbase_tot);
/* const int unselected = defbase_tot - selected; */ /* UNUSED */
for (i = me->totvert; i != 0; i--, wc += 4, dv++) {
calc_weightpaint_vert_color(wc, dv, coba, defbase_tot, defbase_act, dg_flags, selected, draw_flag);
}
MEM_freeN(dg_flags);
}
else {
int col_i;
weightpaint_color((unsigned char *)&col_i, coba, 0.0f);
fill_vn_i((int *)wtcol_v, me->totvert, col_i);
}
return wtcol_v;
}
static void add_weight_mcol_dm(Object *ob, DerivedMesh *dm, int const draw_flag)
{
ColorBand *coba= stored_cb; /* warning, not a local var */
unsigned char *wtcol_v = calc_weightpaint_vert_array(ob, draw_flag, coba);
unsigned char *wtcol_f;
unsigned char(*wtcol_l)[4] = NULL;
BLI_array_declare(wtcol_l);
MFace *mf = dm->getTessFaceArray(dm); MFace *mf = dm->getTessFaceArray(dm);
MLoop *mloop = dm->getLoopArray(dm), *ml; MLoop *mloop = dm->getLoopArray(dm), *ml;
MPoly *mp = dm->getPolyArray(dm); MPoly *mp = dm->getPolyArray(dm);
ColorBand *coba= stored_cb; /* warning, not a local var */
unsigned char *wtcol;
unsigned char(*wlcol)[4] = NULL;
BLI_array_declare(wlcol);
int i, j, totface=dm->getNumTessFaces(dm), totloop; int i, j, totface=dm->getNumTessFaces(dm), totloop;
int *origIndex = dm->getVertDataArray(dm, CD_ORIGINDEX); int *origIndex = dm->getVertDataArray(dm, CD_ORIGINDEX);
int defbase_tot = BLI_countlist(&ob->defbase); wtcol_f = MEM_mallocN(sizeof (unsigned char) * totface*4*4, "weightmap_f");
const int defbase_act = ob->actdef-1;
char *dg_flags = MEM_mallocN(defbase_tot * sizeof(char), __func__);
int selected = get_selected_defgroups(ob, dg_flags, defbase_tot);
wtcol = MEM_callocN (sizeof (unsigned char) * totface*4*4, "weightmap"); /*first add colors to the tesselation faces*/
for (i=0; i<totface; i++, mf++) {
/*origindex being NULL means we're operating on original mesh data*/
unsigned int fidx= mf->v4 ? 3:2;
do {
copy_v4_v4_char((char *)&wtcol_f[(4 * i + fidx) * 4],
(char *)&wtcol_v[4 * (*(&mf->v1 + fidx))]);
} while (fidx--);
}
if (me->dvert) { CustomData_add_layer(&dm->faceData, CD_WEIGHT_MCOL, CD_ASSIGN, wtcol_f, totface);
MDeformVert *dvert= me->dvert;
/*first add colors to the tesselation faces*/
memset(wtcol, 0x55, sizeof (unsigned char) * totface*4*4);
for (i=0; i<totface; i++, mf++) {
/*origindex being NULL means we're operating on original mesh data*/
unsigned int fidx= mf->v4 ? 3:2;
do {
calc_weightpaint_vert_color(&wtcol[(i*4 + fidx)*4],
&dvert[*(&mf->v1 + fidx)], coba,
defbase_tot, defbase_act,
dg_flags, selected, draw_flag);
} while (fidx--);
}
}
else {
/* no weights, fill in zero */
int col_i;
weightpaint_color((unsigned char *)&col_i, coba, 0.0f);
fill_vn_i((int *)wtcol, totface*4, col_i);
}
CustomData_add_layer(&dm->faceData, CD_WEIGHT_MCOL, CD_ASSIGN, wtcol, totface);
/*now add to loops, so the data can be passed through the modifier stack*/ /*now add to loops, so the data can be passed through the modifier stack*/
totloop = 0; totloop = 0;
for (i=0; i<dm->numPolyData; i++, mp++) { for (i=0; i<dm->numPolyData; i++, mp++) {
MDeformVert *dvert= me->dvert;
ml = mloop + mp->loopstart; ml = mloop + mp->loopstart;
for (j=0; j<mp->totloop; j++, ml++, totloop++) { for (j=0; j<mp->totloop; j++, ml++, totloop++) {
BLI_array_growone(wlcol); BLI_array_growone(wtcol_l);
copy_v4_v4_char((char *)&wtcol_l[totloop],
calc_weightpaint_vert_color((unsigned char *)&wlcol[totloop], (char *)&wtcol_v[4 * (origIndex ? origIndex[ml->v] : ml->v)]);
&dvert[origIndex ? origIndex[ml->v] : ml->v], coba,
defbase_tot, defbase_act,
dg_flags, selected, draw_flag);
} }
} }
MEM_freeN(dg_flags); MEM_freeN(wtcol_v);
CustomData_add_layer(&dm->loopData, CD_WEIGHT_MLOOPCOL, CD_ASSIGN, wlcol, totloop); CustomData_add_layer(&dm->loopData, CD_WEIGHT_MLOOPCOL, CD_ASSIGN, wtcol_l, totloop);
} }

@ -1325,32 +1325,6 @@ void nodeSetActive(bNodeTree *ntree, bNode *node)
node->flag |= NODE_ACTIVE_TEXTURE; node->flag |= NODE_ACTIVE_TEXTURE;
} }
/* use flags are not persistent yet, groups might need different tagging, so we do it each time
when we need to get this info */
void ntreeSocketUseFlags(bNodeTree *ntree)
{
bNode *node;
bNodeSocket *sock;
bNodeLink *link;
/* clear flags */
for(node= ntree->nodes.first; node; node= node->next) {
for(sock= node->inputs.first; sock; sock= sock->next)
sock->flag &= ~SOCK_IN_USE;
for(sock= node->outputs.first; sock; sock= sock->next)
sock->flag &= ~SOCK_IN_USE;
}
/* tag all thats in use */
for(link= ntree->links.first; link; link= link->next) {
if(link->fromsock) // FIXME, see below
link->fromsock->flag |= SOCK_IN_USE;
if(link->tosock) // FIXME This can be NULL, when dragging a new link in the UI, should probably copy the node tree for preview render - campbell
link->tosock->flag |= SOCK_IN_USE;
}
}
/* ************** dependency stuff *********** */ /* ************** dependency stuff *********** */
/* node is guaranteed to be not checked before */ /* node is guaranteed to be not checked before */
@ -1425,16 +1399,27 @@ static void ntree_update_link_pointers(bNodeTree *ntree)
/* first clear data */ /* first clear data */
for(node= ntree->nodes.first; node; node= node->next) { for(node= ntree->nodes.first; node; node= node->next) {
for(sock= node->inputs.first; sock; sock= sock->next) for(sock= node->inputs.first; sock; sock= sock->next) {
sock->link= NULL; sock->link= NULL;
sock->flag &= ~SOCK_IN_USE;
}
for(sock= node->outputs.first; sock; sock= sock->next) {
sock->flag &= ~SOCK_IN_USE;
}
} }
/* clear socket links */ for(sock= ntree->inputs.first; sock; sock= sock->next) {
for(sock= ntree->outputs.first; sock; sock= sock->next) sock->flag &= ~SOCK_IN_USE;
}
for(sock= ntree->outputs.first; sock; sock= sock->next) {
sock->link= NULL; sock->link= NULL;
sock->flag &= ~SOCK_IN_USE;
}
for(link= ntree->links.first; link; link= link->next) { for(link= ntree->links.first; link; link= link->next) {
if (link->tosock) link->tosock->link= link;
link->tosock->link= link;
link->fromsock->flag |= SOCK_IN_USE;
link->tosock->flag |= SOCK_IN_USE;
} }
} }

@ -349,9 +349,9 @@ ColorBand *add_colorband(int rangetype)
/* ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------- */
int do_colorband(ColorBand *coba, float in, float out[4]) int do_colorband(const ColorBand *coba, float in, float out[4])
{ {
CBData *cbd1, *cbd2, *cbd0, *cbd3; const CBData *cbd1, *cbd2, *cbd0, *cbd3;
float fac, mfac, t[4]; float fac, mfac, t[4];
int a; int a;

@ -7520,6 +7520,30 @@ void do_versions_image_settings_2_60(Scene *sce)
} }
/* socket use flags were only temporary before */
static void do_versions_nodetree_socket_use_flags_2_62(bNodeTree *ntree)
{
bNode *node;
bNodeSocket *sock;
bNodeLink *link;
for (node=ntree->nodes.first; node; node=node->next) {
for (sock=node->inputs.first; sock; sock=sock->next)
sock->flag &= ~SOCK_IN_USE;
for (sock=node->outputs.first; sock; sock=sock->next)
sock->flag &= ~SOCK_IN_USE;
}
for (sock=ntree->inputs.first; sock; sock=sock->next)
sock->flag &= ~SOCK_IN_USE;
for (sock=ntree->outputs.first; sock; sock=sock->next)
sock->flag &= ~SOCK_IN_USE;
for (link=ntree->links.first; link; link=link->next) {
link->fromsock->flag |= SOCK_IN_USE;
link->tosock->flag |= SOCK_IN_USE;
}
}
static void do_versions(FileData *fd, Library *lib, Main *main) static void do_versions(FileData *fd, Library *lib, Main *main)
{ {
/* WATCH IT!!!: pointers from libdata have not been converted */ /* WATCH IT!!!: pointers from libdata have not been converted */
@ -12749,7 +12773,38 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
/* put compatibility code here until next subversion bump */ /* put compatibility code here until next subversion bump */
{ {
/* nothing! */ {
/* update use flags for node sockets (was only temporary before) */
Scene *sce;
Material *mat;
Tex *tex;
Lamp *lamp;
World *world;
bNodeTree *ntree;
for (sce=main->scene.first; sce; sce=sce->id.next)
if (sce->nodetree)
do_versions_nodetree_socket_use_flags_2_62(sce->nodetree);
for (mat=main->mat.first; mat; mat=mat->id.next)
if (mat->nodetree)
do_versions_nodetree_socket_use_flags_2_62(mat->nodetree);
for (tex=main->tex.first; tex; tex=tex->id.next)
if (tex->nodetree)
do_versions_nodetree_socket_use_flags_2_62(tex->nodetree);
for (lamp=main->lamp.first; lamp; lamp=lamp->id.next)
if (lamp->nodetree)
do_versions_nodetree_socket_use_flags_2_62(lamp->nodetree);
for (world=main->world.first; world; world=world->id.next)
if (world->nodetree)
do_versions_nodetree_socket_use_flags_2_62(world->nodetree);
for (ntree=main->nodetree.first; ntree; ntree=ntree->id.next)
do_versions_nodetree_socket_use_flags_2_62(ntree);
}
} }
/* WATCH IT!!!: pointers from libdata have not been converted yet here! */ /* WATCH IT!!!: pointers from libdata have not been converted yet here! */

@ -115,6 +115,9 @@ static void active_node_panel(const bContext *C, Panel *pa)
uiItemS(layout); uiItemS(layout);
uiItemR(layout, &ptr, "name", 0, NULL, ICON_NODE); uiItemR(layout, &ptr, "name", 0, NULL, ICON_NODE);
uiItemS(layout); uiItemS(layout);
uiItemO(layout, NULL, 0, "NODE_OT_hide_socket_toggle");
uiItemS(layout);
/* draw this node's settings */ /* draw this node's settings */
if (node->typeinfo && node->typeinfo->uifuncbut) if (node->typeinfo && node->typeinfo->uifuncbut)

@ -351,10 +351,10 @@ static void node_update_hidden(bNode *node)
/* calculate minimal radius */ /* calculate minimal radius */
for(nsock= node->inputs.first; nsock; nsock= nsock->next) for(nsock= node->inputs.first; nsock; nsock= nsock->next)
if(!(nsock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL))) if(!(nsock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL)) && (nsock->flag & SOCK_IN_USE))
totin++; totin++;
for(nsock= node->outputs.first; nsock; nsock= nsock->next) for(nsock= node->outputs.first; nsock; nsock= nsock->next)
if(!(nsock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL))) if(!(nsock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL)) && (nsock->flag & SOCK_IN_USE))
totout++; totout++;
tot= MAX2(totin, totout); tot= MAX2(totin, totout);
@ -371,7 +371,7 @@ static void node_update_hidden(bNode *node)
rad=drad= (float)M_PI/(1.0f + (float)totout); rad=drad= (float)M_PI/(1.0f + (float)totout);
for(nsock= node->outputs.first; nsock; nsock= nsock->next) { for(nsock= node->outputs.first; nsock; nsock= nsock->next) {
if(!(nsock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL))) { if(!(nsock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL)) && (nsock->flag & SOCK_IN_USE)) {
nsock->locx= node->totr.xmax - hiddenrad + (float)sin(rad)*hiddenrad; nsock->locx= node->totr.xmax - hiddenrad + (float)sin(rad)*hiddenrad;
nsock->locy= node->totr.ymin + hiddenrad + (float)cos(rad)*hiddenrad; nsock->locy= node->totr.ymin + hiddenrad + (float)cos(rad)*hiddenrad;
rad+= drad; rad+= drad;
@ -382,7 +382,7 @@ static void node_update_hidden(bNode *node)
rad=drad= - (float)M_PI/(1.0f + (float)totin); rad=drad= - (float)M_PI/(1.0f + (float)totin);
for(nsock= node->inputs.first; nsock; nsock= nsock->next) { for(nsock= node->inputs.first; nsock; nsock= nsock->next) {
if(!(nsock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL))) { if(!(nsock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL)) && (nsock->flag & SOCK_IN_USE)) {
nsock->locx= node->totr.xmin + hiddenrad + (float)sin(rad)*hiddenrad; nsock->locx= node->totr.xmin + hiddenrad + (float)sin(rad)*hiddenrad;
nsock->locy= node->totr.ymin + hiddenrad + (float)cos(rad)*hiddenrad; nsock->locy= node->totr.ymin + hiddenrad + (float)cos(rad)*hiddenrad;
rad+= drad; rad+= drad;
@ -854,12 +854,12 @@ static void node_draw_hidden(const bContext *C, ARegion *ar, SpaceNode *snode, b
/* sockets */ /* sockets */
for(sock= node->inputs.first; sock; sock= sock->next) { for(sock= node->inputs.first; sock; sock= sock->next) {
if(!(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL))) if(!(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL)) && (sock->flag & SOCK_IN_USE))
node_socket_circle_draw(snode->nodetree, sock, socket_size); node_socket_circle_draw(snode->nodetree, sock, socket_size);
} }
for(sock= node->outputs.first; sock; sock= sock->next) { for(sock= node->outputs.first; sock; sock= sock->next) {
if(!(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL))) if(!(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL)) && (sock->flag & SOCK_IN_USE))
node_socket_circle_draw(snode->nodetree, sock, socket_size); node_socket_circle_draw(snode->nodetree, sock, socket_size);
} }

@ -195,7 +195,6 @@ void TEXT_OT_new(wmOperatorType *ot)
ot->description= "Create a new text data block"; ot->description= "Create a new text data block";
/* api callbacks */ /* api callbacks */
ot->invoke= WM_operator_confirm;
ot->exec= text_new_exec; ot->exec= text_new_exec;
ot->poll= text_new_poll; ot->poll= text_new_poll;

@ -181,6 +181,7 @@ typedef struct World {
#define TEXCO_ANGMAP 64 #define TEXCO_ANGMAP 64
#define TEXCO_H_SPHEREMAP 256 #define TEXCO_H_SPHEREMAP 256
#define TEXCO_H_TUBEMAP 1024 #define TEXCO_H_TUBEMAP 1024
#define TEXCO_EQUIRECTMAP 2048
/* mapto */ /* mapto */
#define WOMAP_BLEND 1 #define WOMAP_BLEND 1

@ -143,6 +143,7 @@ static void rna_def_world_mtex(BlenderRNA *brna)
{TEXCO_GLOB, "GLOBAL", 0, "Global", "Use global coordinates for the texture coordinates (interior mist)"}, {TEXCO_GLOB, "GLOBAL", 0, "Global", "Use global coordinates for the texture coordinates (interior mist)"},
{TEXCO_ANGMAP, "ANGMAP", 0, "AngMap", "Use 360 degree angular coordinates, e.g. for spherical light probes"}, {TEXCO_ANGMAP, "ANGMAP", 0, "AngMap", "Use 360 degree angular coordinates, e.g. for spherical light probes"},
{TEXCO_H_SPHEREMAP, "SPHERE", 0, "Sphere", "For 360 degree panorama sky, spherical mapped, only top half"}, {TEXCO_H_SPHEREMAP, "SPHERE", 0, "Sphere", "For 360 degree panorama sky, spherical mapped, only top half"},
{TEXCO_EQUIRECTMAP, "EQUIRECT", 0, "Equirectangular", "For 360 degree panorama sky, equirectangular mapping"},
{TEXCO_H_TUBEMAP, "TUBE", 0, "Tube", "For 360 degree panorama sky, cylindrical mapped, only top half"}, {TEXCO_H_TUBEMAP, "TUBE", 0, "Tube", "For 360 degree panorama sky, cylindrical mapped, only top half"},
{TEXCO_OBJECT, "OBJECT", 0, "Object", "Use linked object's coordinates for texture coordinates"}, {TEXCO_OBJECT, "OBJECT", 0, "Object", "Use linked object's coordinates for texture coordinates"},
{0, NULL, 0, NULL, NULL}}; {0, NULL, 0, NULL, NULL}};

@ -177,10 +177,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
int UNUSED(useRenderParams), int UNUSED(isFinalCalc)) int UNUSED(useRenderParams), int UNUSED(isFinalCalc))
{ {
WeightVGEditModifierData *wmd = (WeightVGEditModifierData*) md; WeightVGEditModifierData *wmd = (WeightVGEditModifierData*) md;
DerivedMesh *dm = derivedData, *ret = NULL; DerivedMesh *dm = derivedData;
#if 0
Mesh *ob_m = NULL;
#endif
MDeformVert *dvert = NULL; MDeformVert *dvert = NULL;
MDeformWeight **dw = NULL; MDeformWeight **dw = NULL;
float *org_w; /* Array original weights. */ float *org_w; /* Array original weights. */
@ -188,7 +185,6 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
int numVerts; int numVerts;
int defgrp_idx; int defgrp_idx;
int i; int i;
char rel_ret = 0; /* Boolean, whether we have to release ret dm or not, when not using it! */
/* Flags. */ /* Flags. */
int do_add = (wmd->edit_flags & MOD_WVG_EDIT_ADD2VG) != 0; int do_add = (wmd->edit_flags & MOD_WVG_EDIT_ADD2VG) != 0;
int do_rem = (wmd->edit_flags & MOD_WVG_EDIT_REMFVG) != 0; int do_rem = (wmd->edit_flags & MOD_WVG_EDIT_REMFVG) != 0;
@ -207,49 +203,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
if (defgrp_idx < 0) if (defgrp_idx < 0)
return dm; return dm;
/* XXX All this to avoid copying dm when not needed... However, it nearly doubles compute dvert = CustomData_duplicate_referenced_layer(&dm->vertData, CD_MDEFORMVERT, numVerts);
* time! See scene 5 of the WeighVG test file...
*/
#if 0
/* Get actual dverts (ie vertex group data). */
dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT);
/* If no dverts, return unmodified data... */
if (dvert == NULL)
return dm;
/* Get org mesh, only to test whether affected cdata layer has already been copied
* somewhere up in the modifiers stack.
*/
ob_m = get_mesh(ob);
if (ob_m == NULL)
return dm;
/* Create a copy of our dmesh, only if our affected cdata layer is the same as org mesh. */
if (dvert == CustomData_get_layer(&ob_m->vdata, CD_MDEFORMVERT)) {
/* XXX Seems to create problems with weightpaint mode???
* I'm missing something here, I guess...
*/
// DM_set_only_copy(dm, CD_MASK_MDEFORMVERT); /* Only copy defgroup layer. */
ret = CDDM_copy(dm);
dvert = ret->getVertDataArray(ret, CD_MDEFORMVERT);
if (dvert == NULL) {
ret->release(ret);
return dm;
}
rel_ret = 1;
}
else
ret = dm;
#else
ret = CDDM_copy(dm, 0);
rel_ret = 1;
dvert = ret->getVertDataArray(ret, CD_MDEFORMVERT);
if (dvert == NULL) {
if (rel_ret)
ret->release(ret);
return dm;
}
#endif
/* Get org weights, assuming 0.0 for vertices not in given vgroup. */ /* Get org weights, assuming 0.0 for vertices not in given vgroup. */
org_w = MEM_mallocN(sizeof(float) * numVerts, "WeightVGEdit Modifier, org_w"); org_w = MEM_mallocN(sizeof(float) * numVerts, "WeightVGEdit Modifier, org_w");
@ -271,7 +225,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
} }
/* Do masking. */ /* Do masking. */
weightvg_do_mask(numVerts, NULL, org_w, new_w, ob, ret, wmd->mask_constant, weightvg_do_mask(numVerts, NULL, org_w, new_w, ob, dm, wmd->mask_constant,
wmd->mask_defgrp_name, wmd->mask_texture, wmd->mask_tex_use_channel, wmd->mask_defgrp_name, wmd->mask_texture, wmd->mask_tex_use_channel,
wmd->mask_tex_mapping, wmd->mask_tex_map_obj, wmd->mask_tex_uvlayer_name); wmd->mask_tex_mapping, wmd->mask_tex_map_obj, wmd->mask_tex_uvlayer_name);
@ -285,7 +239,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
MEM_freeN(dw); MEM_freeN(dw);
/* Return the vgroup-modified mesh. */ /* Return the vgroup-modified mesh. */
return ret; return dm;
} }
static DerivedMesh *applyModifierEM(ModifierData *md, Object *ob, static DerivedMesh *applyModifierEM(ModifierData *md, Object *ob,

@ -219,10 +219,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
int UNUSED(useRenderParams), int UNUSED(isFinalCalc)) int UNUSED(useRenderParams), int UNUSED(isFinalCalc))
{ {
WeightVGMixModifierData *wmd = (WeightVGMixModifierData*) md; WeightVGMixModifierData *wmd = (WeightVGMixModifierData*) md;
DerivedMesh *dm = derivedData, *ret = NULL; DerivedMesh *dm = derivedData;
#if 0
Mesh *ob_m = NULL;
#endif
MDeformVert *dvert = NULL; MDeformVert *dvert = NULL;
MDeformWeight **dw1, **tdw1, **dw2, **tdw2; MDeformWeight **dw1, **tdw1, **dw2, **tdw2;
int numVerts; int numVerts;
@ -232,7 +229,6 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
int *tidx, *indices = NULL; int *tidx, *indices = NULL;
int numIdx = 0; int numIdx = 0;
int i; int i;
char rel_ret = 0; /* Boolean, whether we have to release ret dm or not, when not using it! */
/* Get number of verts. */ /* Get number of verts. */
numVerts = dm->getNumVerts(dm); numVerts = dm->getNumVerts(dm);
@ -254,49 +250,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
return dm; return dm;
} }
/* XXX All this to avoid copying dm when not needed... However, it nearly doubles compute dvert = CustomData_duplicate_referenced_layer(&dm->vertData, CD_MDEFORMVERT, numVerts);
* time! See scene 5 of the WeighVG test file...
*/
#if 0
/* Get actual dverts (ie vertex group data). */
dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT);
/* If no dverts, return unmodified data... */
if (dvert == NULL)
return dm;
/* Get org mesh, only to test whether affected cdata layer has already been copied
* somewhere up in the modifiers stack.
*/
ob_m = get_mesh(ob);
if (ob_m == NULL)
return dm;
/* Create a copy of our dmesh, only if our affected cdata layer is the same as org mesh. */
if (dvert == CustomData_get_layer(&ob_m->vdata, CD_MDEFORMVERT)) {
/* XXX Seems to create problems with weightpaint mode???
* I'm missing something here, I guess...
*/
// DM_set_only_copy(dm, CD_MASK_MDEFORMVERT); /* Only copy defgroup layer. */
ret = CDDM_copy(dm);
dvert = ret->getVertDataArray(ret, CD_MDEFORMVERT);
if (dvert == NULL) {
ret->release(ret);
return dm;
}
rel_ret = 1;
}
else
ret = dm;
#else
ret = CDDM_copy(dm, 0);
rel_ret = 1;
dvert = ret->getVertDataArray(ret, CD_MDEFORMVERT);
if (dvert == NULL) {
if (rel_ret)
ret->release(ret);
return dm;
}
#endif
/* Find out which vertices to work on. */ /* Find out which vertices to work on. */
tidx = MEM_mallocN(sizeof(int) * numVerts, "WeightVGMix Modifier, tidx"); tidx = MEM_mallocN(sizeof(int) * numVerts, "WeightVGMix Modifier, tidx");
@ -364,8 +318,6 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
MEM_freeN(tdw1); MEM_freeN(tdw1);
MEM_freeN(tdw2); MEM_freeN(tdw2);
MEM_freeN(tidx); MEM_freeN(tidx);
if (rel_ret)
ret->release(ret);
return dm; return dm;
} }
if (numIdx != -1) { if (numIdx != -1) {
@ -400,7 +352,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
} }
/* Do masking. */ /* Do masking. */
weightvg_do_mask(numIdx, indices, org_w, new_w, ob, ret, wmd->mask_constant, weightvg_do_mask(numIdx, indices, org_w, new_w, ob, dm, wmd->mask_constant,
wmd->mask_defgrp_name, wmd->mask_texture, wmd->mask_tex_use_channel, wmd->mask_defgrp_name, wmd->mask_texture, wmd->mask_tex_use_channel,
wmd->mask_tex_mapping, wmd->mask_tex_map_obj, wmd->mask_tex_uvlayer_name); wmd->mask_tex_mapping, wmd->mask_tex_map_obj, wmd->mask_tex_uvlayer_name);
@ -419,7 +371,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
MEM_freeN(indices); MEM_freeN(indices);
/* Return the vgroup-modified mesh. */ /* Return the vgroup-modified mesh. */
return ret; return dm;
} }
static DerivedMesh *applyModifierEM(ModifierData *md, Object *ob, static DerivedMesh *applyModifierEM(ModifierData *md, Object *ob,

@ -28,11 +28,17 @@
* \ingroup modifiers * \ingroup modifiers
*/ */
#define DO_PROFILE 0
#include "BLI_editVert.h" #include "BLI_editVert.h"
#include "BLI_math.h" #include "BLI_math.h"
#include "BLI_string.h" #include "BLI_string.h"
#include "BLI_utildefines.h" #include "BLI_utildefines.h"
#if DO_PROFILE
#include "PIL_time.h"
#endif
#include "DNA_mesh_types.h" #include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h" #include "DNA_meshdata_types.h"
#include "DNA_modifier_types.h" #include "DNA_modifier_types.h"
@ -334,10 +340,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
int UNUSED(useRenderParams), int UNUSED(isFinalCalc)) int UNUSED(useRenderParams), int UNUSED(isFinalCalc))
{ {
WeightVGProximityModifierData *wmd = (WeightVGProximityModifierData*) md; WeightVGProximityModifierData *wmd = (WeightVGProximityModifierData*) md;
DerivedMesh *dm = derivedData, *ret = NULL; DerivedMesh *dm = derivedData;
#if 0
Mesh *ob_m = NULL;
#endif
MDeformVert *dvert = NULL; MDeformVert *dvert = NULL;
MDeformWeight **dw, **tdw; MDeformWeight **dw, **tdw;
int numVerts; int numVerts;
@ -350,7 +353,10 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
int *tidx, *indices = NULL; int *tidx, *indices = NULL;
int numIdx = 0; int numIdx = 0;
int i; int i;
char rel_ret = 0; /* Boolean, whether we have to release ret dm or not, when not using it! */
#if DO_PROFILE
TIMEIT_START(perf)
#endif
/* Get number of verts. */ /* Get number of verts. */
numVerts = dm->getNumVerts(dm); numVerts = dm->getNumVerts(dm);
@ -371,49 +377,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
if (defgrp_idx < 0) if (defgrp_idx < 0)
return dm; return dm;
/* XXX All this to avoid copying dm when not needed... However, it nearly doubles compute dvert = CustomData_duplicate_referenced_layer(&dm->vertData, CD_MDEFORMVERT, numVerts);
* time! See scene 5 of the WeighVG test file...
*/
#if 0
/* Get actual dverts (ie vertex group data). */
dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT);
/* If no dverts, return unmodified data... */
if (dvert == NULL)
return dm;
/* Get org mesh, only to test whether affected cdata layer has already been copied
* somewhere up in the modifiers stack.
*/
ob_m = get_mesh(ob);
if (ob_m == NULL)
return dm;
/* Create a copy of our dmesh, only if our affected cdata layer is the same as org mesh. */
if (dvert == CustomData_get_layer(&ob_m->vdata, CD_MDEFORMVERT)) {
/* XXX Seems to create problems with weightpaint mode???
* I'm missing something here, I guess...
*/
// DM_set_only_copy(dm, CD_MASK_MDEFORMVERT); /* Only copy defgroup layer. */
ret = CDDM_copy(dm);
dvert = ret->getVertDataArray(ret, CD_MDEFORMVERT);
if (dvert == NULL) {
ret->release(ret);
return dm;
}
rel_ret = 1;
}
else
ret = dm;
#else
ret = CDDM_copy(dm, 0);
rel_ret = 1;
dvert = ret->getVertDataArray(ret, CD_MDEFORMVERT);
if (dvert == NULL) {
if (rel_ret)
ret->release(ret);
return dm;
}
#endif
/* Find out which vertices to work on (all vertices in vgroup), and get their relevant weight. /* Find out which vertices to work on (all vertices in vgroup), and get their relevant weight.
*/ */
@ -433,8 +397,6 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
MEM_freeN(tidx); MEM_freeN(tidx);
MEM_freeN(tw); MEM_freeN(tw);
MEM_freeN(tdw); MEM_freeN(tdw);
if (rel_ret)
ret->release(ret);
return dm; return dm;
} }
indices = MEM_mallocN(sizeof(int) * numIdx, "WeightVGProximity Modifier, indices"); indices = MEM_mallocN(sizeof(int) * numIdx, "WeightVGProximity Modifier, indices");
@ -455,7 +417,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
*/ */
float (*tv_cos)[3] = MEM_mallocN(sizeof(float[3]) * numVerts, "WeightVGProximity Modifier, tv_cos"); float (*tv_cos)[3] = MEM_mallocN(sizeof(float[3]) * numVerts, "WeightVGProximity Modifier, tv_cos");
v_cos = MEM_mallocN(sizeof(float[3]) * numIdx, "WeightVGProximity Modifier, v_cos"); v_cos = MEM_mallocN(sizeof(float[3]) * numIdx, "WeightVGProximity Modifier, v_cos");
ret->getVertCos(ret, tv_cos); dm->getVertCos(dm, tv_cos);
for (i = 0; i < numIdx; i++) for (i = 0; i < numIdx; i++)
copy_v3_v3(v_cos[i], tv_cos[indices[i]]); copy_v3_v3(v_cos[i], tv_cos[indices[i]]);
MEM_freeN(tv_cos); MEM_freeN(tv_cos);
@ -524,7 +486,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
do_map(new_w, numIdx, wmd->min_dist, wmd->max_dist, wmd->falloff_type); do_map(new_w, numIdx, wmd->min_dist, wmd->max_dist, wmd->falloff_type);
/* Do masking. */ /* Do masking. */
weightvg_do_mask(numIdx, indices, org_w, new_w, ob, ret, wmd->mask_constant, weightvg_do_mask(numIdx, indices, org_w, new_w, ob, dm, wmd->mask_constant,
wmd->mask_defgrp_name, wmd->mask_texture, wmd->mask_tex_use_channel, wmd->mask_defgrp_name, wmd->mask_texture, wmd->mask_tex_use_channel,
wmd->mask_tex_mapping, wmd->mask_tex_map_obj, wmd->mask_tex_uvlayer_name); wmd->mask_tex_mapping, wmd->mask_tex_map_obj, wmd->mask_tex_uvlayer_name);
@ -538,8 +500,12 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der
MEM_freeN(indices); MEM_freeN(indices);
MEM_freeN(v_cos); MEM_freeN(v_cos);
#if DO_PROFILE
TIMEIT_END(perf)
#endif
/* Return the vgroup-modified mesh. */ /* Return the vgroup-modified mesh. */
return ret; return dm;
} }
static DerivedMesh *applyModifierEM(ModifierData *md, Object *ob, static DerivedMesh *applyModifierEM(ModifierData *md, Object *ob,

@ -134,8 +134,6 @@ void ntreeShaderGetTexcoMode(bNodeTree *ntree, int r_mode, short *texco, int *mo
bNodeSocket *sock; bNodeSocket *sock;
int a; int a;
ntreeSocketUseFlags(ntree);
for(node= ntree->nodes.first; node; node= node->next) { for(node= ntree->nodes.first; node; node= node->next) {
if(node->type==SH_NODE_TEXTURE) { if(node->type==SH_NODE_TEXTURE) {
if((r_mode & R_OSA) && node->id) { if((r_mode & R_OSA) && node->id) {

@ -3083,6 +3083,12 @@ void do_sky_tex(const float rco[3], float lo[3], const float dxyview[2], float h
continue; continue;
} }
break; break;
case TEXCO_EQUIRECTMAP:
tempvec[0]= atan2f(lo[0], lo[2]) / (float)M_PI;
tempvec[1]= 1.0f - 2.0f*saacos(lo[1]) / (float)M_PI;
tempvec[2]= 0.0f;
co= tempvec;
break;
case TEXCO_OBJECT: case TEXCO_OBJECT:
if(mtex->object) { if(mtex->object) {
copy_v3_v3(tempvec, lo); copy_v3_v3(tempvec, lo);

@ -491,7 +491,6 @@ elseif(WIN32)
else() else()
install( install(
FILES FILES
${LIBDIR}/png/lib/libpng.dll
${LIBDIR}/zlib/lib/zlib.dll ${LIBDIR}/zlib/lib/zlib.dll
DESTINATION ${TARGETDIR} DESTINATION ${TARGETDIR}
) )