2011-02-23 10:52:22 +00:00
/*
2009-10-22 23:22:05 +00:00
* * * * * * BEGIN GPL LICENSE BLOCK * * * * *
*
* 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
* of the License , or ( at your option ) any later version .
*
* 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 .
2009-10-22 23:22:05 +00:00
*
* The Original Code is Copyright ( C ) 2009 Blender Foundation .
* All rights reserved .
*
* Contributor ( s ) : Blender Foundation
*
* * * * * * END GPL LICENSE BLOCK * * * * *
*/
2011-02-27 20:29:51 +00:00
/** \file blender/editors/render/render_shading.c
* \ ingroup edrend
*/
2009-10-22 23:22:05 +00:00
# include <stdlib.h>
# include <string.h>
# include "MEM_guardedalloc.h"
2012-02-19 22:17:30 +00:00
# include "DNA_mesh_types.h"
2009-10-22 23:22:05 +00:00
# include "DNA_curve_types.h"
# include "DNA_lamp_types.h"
# include "DNA_material_types.h"
# include "DNA_node_types.h"
# include "DNA_object_types.h"
2011-02-13 12:35:26 +00:00
# include "DNA_particle_types.h"
2009-10-22 23:22:05 +00:00
# include "DNA_scene_types.h"
2010-03-11 07:43:49 +00:00
# include "DNA_space_types.h"
2009-10-22 23:22:05 +00:00
# include "DNA_world_types.h"
2011-01-07 18:36:47 +00:00
# include "BLI_blenlib.h"
# include "BLI_math.h"
# include "BLI_utildefines.h"
merge own commits into render branch into trunk since 27560
27562, 27570, 27571, 27574, 27576, 27577, 27579, 27590, 27591, 27594, 27595, 27596, 27599, 27605, 27611, 27612, 27613, 27614, 27623
2010-03-20 16:41:01 +00:00
# include "BKE_animsys.h"
2009-10-22 23:22:05 +00:00
# include "BKE_context.h"
2011-09-14 00:37:27 +00:00
# include "BKE_curve.h"
2009-10-22 23:22:05 +00:00
# include "BKE_depsgraph.h"
# include "BKE_font.h"
2010-03-11 07:43:49 +00:00
# include "BKE_global.h"
2009-10-22 23:22:05 +00:00
# include "BKE_icons.h"
2010-03-11 07:43:49 +00:00
# include "BKE_image.h"
2009-10-22 23:22:05 +00:00
# include "BKE_library.h"
# include "BKE_main.h"
# include "BKE_material.h"
# include "BKE_node.h"
2010-03-11 07:43:49 +00:00
# include "BKE_report.h"
2009-10-22 23:22:05 +00:00
# include "BKE_scene.h"
# include "BKE_texture.h"
# include "BKE_world.h"
# include "BKE_tessmesh.h"
2010-03-11 07:43:49 +00:00
# include "IMB_imbuf.h"
# include "IMB_imbuf_types.h"
2009-10-22 23:22:05 +00:00
# include "GPU_material.h"
# include "RNA_access.h"
# include "WM_api.h"
# include "WM_types.h"
2012-01-02 17:15:24 +00:00
# include "ED_object.h"
2009-10-22 23:22:05 +00:00
# include "ED_curve.h"
# include "ED_mesh.h"
2011-11-02 19:24:30 +00:00
# include "ED_node.h"
2011-04-08 16:56:44 +00:00
# include "ED_render.h"
# include "ED_screen.h"
2009-10-22 23:22:05 +00:00
# include "RNA_define.h"
# include "UI_interface.h"
2011-08-28 23:24:34 +00:00
# include "RE_pipeline.h"
2009-10-22 23:22:05 +00:00
# include "render_intern.h" // own include
/********************** material slot operators *********************/
2010-10-15 01:36:14 +00:00
static int material_slot_add_exec ( bContext * C , wmOperator * UNUSED ( op ) )
2009-10-22 23:22:05 +00:00
{
2012-01-02 17:15:24 +00:00
Object * ob = ED_object_context ( C ) ;
2009-10-22 23:22:05 +00:00
2012-03-24 06:38:07 +00:00
if ( ! ob )
2009-10-22 23:22:05 +00:00
return OPERATOR_CANCELLED ;
object_add_material_slot ( ob ) ;
WM_event_add_notifier ( C , NC_OBJECT | ND_DRAW , ob ) ;
2010-10-05 11:55:54 +00:00
WM_event_add_notifier ( C , NC_OBJECT | ND_OB_SHADING , ob ) ;
2009-10-22 23:22:05 +00:00
return OPERATOR_FINISHED ;
}
void OBJECT_OT_material_slot_add ( wmOperatorType * ot )
{
/* identifiers */
2012-03-22 07:26:09 +00:00
ot - > name = " Add Material Slot " ;
ot - > idname = " OBJECT_OT_material_slot_add " ;
ot - > description = " Add a new material slot " ;
2009-10-22 23:22:05 +00:00
/* api callbacks */
2012-03-22 07:26:09 +00:00
ot - > exec = material_slot_add_exec ;
ot - > poll = ED_operator_object_active_editable ;
2009-10-22 23:22:05 +00:00
/* flags */
2012-03-22 07:26:09 +00:00
ot - > flag = OPTYPE_REGISTER | OPTYPE_UNDO ;
2009-10-22 23:22:05 +00:00
}
static int material_slot_remove_exec ( bContext * C , wmOperator * op )
{
2012-01-02 17:15:24 +00:00
Object * ob = ED_object_context ( C ) ;
2009-10-22 23:22:05 +00:00
2012-03-24 06:38:07 +00:00
if ( ! ob )
2009-10-22 23:22:05 +00:00
return OPERATOR_CANCELLED ;
2010-10-15 08:11:26 +00:00
/* Removing material slots in edit mode screws things up, see bug #21822.*/
2012-03-24 06:38:07 +00:00
if ( ob = = CTX_data_edit_object ( C ) ) {
2011-09-19 12:26:20 +00:00
BKE_report ( op - > reports , RPT_ERROR , " Unable to remove material slot in edit mode " ) ;
2010-10-15 08:11:26 +00:00
return OPERATOR_CANCELLED ;
}
2009-10-22 23:22:05 +00:00
object_remove_material_slot ( ob ) ;
2010-12-22 17:38:08 +00:00
DAG_id_tag_update ( & ob - > id , OB_RECALC_DATA ) ;
2009-10-22 23:22:05 +00:00
WM_event_add_notifier ( C , NC_OBJECT | ND_DRAW , ob ) ;
2010-10-05 11:55:54 +00:00
WM_event_add_notifier ( C , NC_OBJECT | ND_OB_SHADING , ob ) ;
2009-10-22 23:22:05 +00:00
return OPERATOR_FINISHED ;
}
void OBJECT_OT_material_slot_remove ( wmOperatorType * ot )
{
/* identifiers */
2012-03-22 07:26:09 +00:00
ot - > name = " Remove Material Slot " ;
ot - > idname = " OBJECT_OT_material_slot_remove " ;
ot - > description = " Remove the selected material slot " ;
2009-10-22 23:22:05 +00:00
/* api callbacks */
2012-03-22 07:26:09 +00:00
ot - > exec = material_slot_remove_exec ;
ot - > poll = ED_operator_object_active_editable ;
2009-10-22 23:22:05 +00:00
/* flags */
2012-03-22 07:26:09 +00:00
ot - > flag = OPTYPE_REGISTER | OPTYPE_UNDO ;
2009-10-22 23:22:05 +00:00
}
2010-10-15 01:36:14 +00:00
static int material_slot_assign_exec ( bContext * C , wmOperator * UNUSED ( op ) )
2009-10-22 23:22:05 +00:00
{
2012-01-02 17:15:24 +00:00
Object * ob = ED_object_context ( C ) ;
2009-10-22 23:22:05 +00:00
2012-03-24 06:38:07 +00:00
if ( ! ob )
2009-10-22 23:22:05 +00:00
return OPERATOR_CANCELLED ;
2012-03-24 06:38:07 +00:00
if ( ob & & ob - > actcol > 0 ) {
if ( ob - > type = = OB_MESH ) {
2012-03-02 12:09:49 +00:00
BMEditMesh * em = BMEdit_FromObject ( ob ) ;
2009-10-22 23:22:05 +00:00
BMFace * efa ;
BMIter iter ;
2012-03-24 06:38:07 +00:00
if ( em ) {
2009-10-22 23:22:05 +00:00
BM_ITER ( efa , & iter , em - > bm , BM_FACES_OF_MESH , NULL ) {
2012-03-24 06:38:07 +00:00
if ( BM_elem_flag_test ( efa , BM_ELEM_SELECT ) )
2009-10-22 23:22:05 +00:00
efa - > mat_nr = ob - > actcol - 1 ;
}
}
}
2012-03-24 06:38:07 +00:00
else if ( ELEM ( ob - > type , OB_CURVE , OB_SURF ) ) {
2009-10-22 23:22:05 +00:00
Nurb * nu ;
2011-09-14 00:37:27 +00:00
ListBase * nurbs = curve_editnurbs ( ( Curve * ) ob - > data ) ;
2009-10-22 23:22:05 +00:00
2012-03-24 06:38:07 +00:00
if ( nurbs ) {
for ( nu = nurbs - > first ; nu ; nu = nu - > next )
if ( isNurbsel ( nu ) )
2009-10-22 23:22:05 +00:00
nu - > mat_nr = nu - > charidx = ob - > actcol - 1 ;
}
}
2012-03-24 06:38:07 +00:00
else if ( ob - > type = = OB_FONT ) {
2009-10-22 23:22:05 +00:00
EditFont * ef = ( ( Curve * ) ob - > data ) - > editfont ;
2010-03-22 09:30:00 +00:00
int i , selstart , selend ;
2009-10-22 23:22:05 +00:00
2012-03-24 06:38:07 +00:00
if ( ef & & BKE_font_getselection ( ob , & selstart , & selend ) ) {
for ( i = selstart ; i < = selend ; i + + )
2011-04-04 16:19:18 +00:00
ef - > textbufinfo [ i ] . mat_nr = ob - > actcol ;
2009-10-22 23:22:05 +00:00
}
}
}
2010-12-05 18:59:23 +00:00
DAG_id_tag_update ( & ob - > id , OB_RECALC_DATA ) ;
2010-03-22 09:30:00 +00:00
WM_event_add_notifier ( C , NC_GEOM | ND_DATA , ob - > data ) ;
2009-10-22 23:22:05 +00:00
return OPERATOR_FINISHED ;
}
void OBJECT_OT_material_slot_assign ( wmOperatorType * ot )
{
/* identifiers */
2012-03-22 07:26:09 +00:00
ot - > name = " Assign Material Slot " ;
ot - > idname = " OBJECT_OT_material_slot_assign " ;
ot - > description = " Assign the material in the selected material slot to the selected vertices " ;
2009-10-22 23:22:05 +00:00
/* api callbacks */
2012-03-22 07:26:09 +00:00
ot - > exec = material_slot_assign_exec ;
ot - > poll = ED_operator_object_active_editable ;
2009-10-22 23:22:05 +00:00
/* flags */
2012-03-22 07:26:09 +00:00
ot - > flag = OPTYPE_REGISTER | OPTYPE_UNDO ;
2009-10-22 23:22:05 +00:00
}
static int material_slot_de_select ( bContext * C , int select )
{
2012-03-02 12:09:49 +00:00
Object * ob = ED_object_context ( C ) ;
2009-10-22 23:22:05 +00:00
2012-03-24 06:38:07 +00:00
if ( ! ob )
2009-10-22 23:22:05 +00:00
return OPERATOR_CANCELLED ;
2012-03-24 06:38:07 +00:00
if ( ob - > type = = OB_MESH ) {
2012-03-02 12:09:49 +00:00
BMEditMesh * em = BMEdit_FromObject ( ob ) ;
2011-08-16 18:45:03 +00:00
2012-03-24 06:38:07 +00:00
if ( em ) {
2011-08-16 18:45:03 +00:00
EDBM_deselect_by_material ( em , ob - > actcol - 1 , select ) ;
2009-10-22 23:22:05 +00:00
}
}
else if ELEM ( ob - > type , OB_CURVE , OB_SURF ) {
2011-09-14 00:37:27 +00:00
ListBase * nurbs = curve_editnurbs ( ( Curve * ) ob - > data ) ;
2009-10-22 23:22:05 +00:00
Nurb * nu ;
BPoint * bp ;
BezTriple * bezt ;
int a ;
2012-03-24 06:38:07 +00:00
if ( nurbs ) {
for ( nu = nurbs - > first ; nu ; nu = nu - > next ) {
if ( nu - > mat_nr = = ob - > actcol - 1 ) {
if ( nu - > bezt ) {
2010-11-04 15:59:09 +00:00
a = nu - > pntsu ;
bezt = nu - > bezt ;
2012-03-24 06:38:07 +00:00
while ( a - - ) {
if ( bezt - > hide = = 0 ) {
if ( select ) {
2010-11-04 15:59:09 +00:00
bezt - > f1 | = SELECT ;
bezt - > f2 | = SELECT ;
bezt - > f3 | = SELECT ;
}
else {
bezt - > f1 & = ~ SELECT ;
bezt - > f2 & = ~ SELECT ;
bezt - > f3 & = ~ SELECT ;
}
2009-10-22 23:22:05 +00:00
}
2010-11-04 15:59:09 +00:00
bezt + + ;
2009-10-22 23:22:05 +00:00
}
}
2012-03-24 06:38:07 +00:00
else if ( nu - > bp ) {
2010-11-04 15:59:09 +00:00
a = nu - > pntsu * nu - > pntsv ;
bp = nu - > bp ;
2012-03-24 06:38:07 +00:00
while ( a - - ) {
if ( bp - > hide = = 0 ) {
if ( select ) bp - > f1 | = SELECT ;
2010-11-04 15:59:09 +00:00
else bp - > f1 & = ~ SELECT ;
}
bp + + ;
2009-10-22 23:22:05 +00:00
}
}
}
}
}
}
2010-03-22 09:30:00 +00:00
WM_event_add_notifier ( C , NC_GEOM | ND_SELECT , ob - > data ) ;
2009-10-22 23:22:05 +00:00
return OPERATOR_FINISHED ;
}
2010-10-15 01:36:14 +00:00
static int material_slot_select_exec ( bContext * C , wmOperator * UNUSED ( op ) )
2009-10-22 23:22:05 +00:00
{
return material_slot_de_select ( C , 1 ) ;
}
void OBJECT_OT_material_slot_select ( wmOperatorType * ot )
{
/* identifiers */
2012-03-22 07:26:09 +00:00
ot - > name = " Select Material Slot " ;
ot - > idname = " OBJECT_OT_material_slot_select " ;
ot - > description = " Select vertices assigned to the selected material slot " ;
2009-10-22 23:22:05 +00:00
/* api callbacks */
2012-03-22 07:26:09 +00:00
ot - > exec = material_slot_select_exec ;
2009-10-22 23:22:05 +00:00
/* flags */
2012-03-22 07:26:09 +00:00
ot - > flag = OPTYPE_REGISTER | OPTYPE_UNDO ;
2009-10-22 23:22:05 +00:00
}
2010-10-15 01:36:14 +00:00
static int material_slot_deselect_exec ( bContext * C , wmOperator * UNUSED ( op ) )
2009-10-22 23:22:05 +00:00
{
return material_slot_de_select ( C , 0 ) ;
}
void OBJECT_OT_material_slot_deselect ( wmOperatorType * ot )
{
/* identifiers */
2012-03-22 07:26:09 +00:00
ot - > name = " Deselect Material Slot " ;
ot - > idname = " OBJECT_OT_material_slot_deselect " ;
ot - > description = " Deselect vertices assigned to the selected material slot " ;
2009-10-22 23:22:05 +00:00
/* api callbacks */
2012-03-22 07:26:09 +00:00
ot - > exec = material_slot_deselect_exec ;
2009-10-22 23:22:05 +00:00
/* flags */
2012-03-22 07:26:09 +00:00
ot - > flag = OPTYPE_REGISTER | OPTYPE_UNDO ;
2009-10-22 23:22:05 +00:00
}
2010-10-15 01:36:14 +00:00
static int material_slot_copy_exec ( bContext * C , wmOperator * UNUSED ( op ) )
2009-10-22 23:22:05 +00:00
{
2012-01-02 17:15:24 +00:00
Object * ob = ED_object_context ( C ) ;
2009-10-22 23:22:05 +00:00
Material * * * matar ;
2012-03-24 06:38:07 +00:00
if ( ! ob | | ! ( matar = give_matarar ( ob ) ) )
2009-10-22 23:22:05 +00:00
return OPERATOR_CANCELLED ;
CTX_DATA_BEGIN ( C , Object * , ob_iter , selected_editable_objects ) {
2012-03-24 06:38:07 +00:00
if ( ob ! = ob_iter & & give_matarar ( ob_iter ) ) {
2009-12-10 01:30:47 +00:00
if ( ob - > data ! = ob_iter - > data )
assign_matarar ( ob_iter , matar , ob - > totcol ) ;
2012-03-24 06:38:07 +00:00
if ( ob_iter - > totcol = = ob - > totcol ) {
2009-10-22 23:22:05 +00:00
ob_iter - > actcol = ob - > actcol ;
WM_event_add_notifier ( C , NC_OBJECT | ND_DRAW , ob_iter ) ;
}
}
}
CTX_DATA_END ;
return OPERATOR_FINISHED ;
}
void OBJECT_OT_material_slot_copy ( wmOperatorType * ot )
{
/* identifiers */
2012-03-22 07:26:09 +00:00
ot - > name = " Copy Material to Others " ;
ot - > idname = " OBJECT_OT_material_slot_copy " ;
ot - > description = " Copies materials to other selected objects " ;
2009-10-22 23:22:05 +00:00
/* api callbacks */
2012-03-22 07:26:09 +00:00
ot - > exec = material_slot_copy_exec ;
2009-10-22 23:22:05 +00:00
/* flags */
2012-03-22 07:26:09 +00:00
ot - > flag = OPTYPE_REGISTER | OPTYPE_UNDO ;
2009-10-22 23:22:05 +00:00
}
/********************** new material operator *********************/
2010-10-15 01:36:14 +00:00
static int new_material_exec ( bContext * C , wmOperator * UNUSED ( op ) )
2009-10-22 23:22:05 +00:00
{
2011-11-02 19:24:30 +00:00
Scene * scene = CTX_data_scene ( C ) ;
2009-10-22 23:22:05 +00:00
Material * ma = CTX_data_pointer_get_type ( C , " material " , & RNA_Material ) . data ;
PointerRNA ptr , idptr ;
PropertyRNA * prop ;
/* add or copy material */
2012-03-24 06:38:07 +00:00
if ( ma ) {
2009-10-22 23:22:05 +00:00
ma = copy_material ( ma ) ;
2011-11-02 19:24:30 +00:00
}
else {
2009-10-22 23:22:05 +00:00
ma = add_material ( " Material " ) ;
2012-03-24 06:38:07 +00:00
if ( scene_use_new_shading_nodes ( scene ) ) {
2011-11-02 19:24:30 +00:00
ED_node_shader_default ( scene , & ma - > id ) ;
ma - > use_nodes = 1 ;
}
}
2009-10-22 23:22:05 +00:00
/* hook into UI */
uiIDContextProperty ( C , & ptr , & prop ) ;
2012-03-24 06:38:07 +00:00
if ( prop ) {
2009-10-22 23:22:05 +00:00
/* when creating new ID blocks, use is already 1, but RNA
* pointer se also increases user , so this compensates it */
ma - > id . us - - ;
RNA_id_pointer_create ( & ma - > id , & idptr ) ;
RNA_property_pointer_set ( & ptr , prop , idptr ) ;
RNA_property_update ( C , & ptr , prop ) ;
}
WM_event_add_notifier ( C , NC_MATERIAL | NA_ADDED , ma ) ;
return OPERATOR_FINISHED ;
}
void MATERIAL_OT_new ( wmOperatorType * ot )
{
/* identifiers */
2012-03-22 07:26:09 +00:00
ot - > name = " New Material " ;
ot - > idname = " MATERIAL_OT_new " ;
ot - > description = " Add a new material " ;
2009-10-22 23:22:05 +00:00
/* api callbacks */
2012-03-22 07:26:09 +00:00
ot - > exec = new_material_exec ;
2009-10-22 23:22:05 +00:00
/* flags */
2012-03-22 07:26:09 +00:00
ot - > flag = OPTYPE_REGISTER | OPTYPE_UNDO ;
2009-10-22 23:22:05 +00:00
}
/********************** new texture operator *********************/
2010-10-15 01:36:14 +00:00
static int new_texture_exec ( bContext * C , wmOperator * UNUSED ( op ) )
2009-10-22 23:22:05 +00:00
{
Tex * tex = CTX_data_pointer_get_type ( C , " texture " , & RNA_Texture ) . data ;
PointerRNA ptr , idptr ;
PropertyRNA * prop ;
/* add or copy texture */
2012-03-24 06:38:07 +00:00
if ( tex )
2009-10-22 23:22:05 +00:00
tex = copy_texture ( tex ) ;
else
tex = add_texture ( " Texture " ) ;
/* hook into UI */
uiIDContextProperty ( C , & ptr , & prop ) ;
2012-03-24 06:38:07 +00:00
if ( prop ) {
2009-10-22 23:22:05 +00:00
/* when creating new ID blocks, use is already 1, but RNA
* pointer se also increases user , so this compensates it */
tex - > id . us - - ;
RNA_id_pointer_create ( & tex - > id , & idptr ) ;
RNA_property_pointer_set ( & ptr , prop , idptr ) ;
RNA_property_update ( C , & ptr , prop ) ;
}
WM_event_add_notifier ( C , NC_TEXTURE | NA_ADDED , tex ) ;
return OPERATOR_FINISHED ;
}
void TEXTURE_OT_new ( wmOperatorType * ot )
{
/* identifiers */
2012-03-22 07:26:09 +00:00
ot - > name = " New Texture " ;
ot - > idname = " TEXTURE_OT_new " ;
ot - > description = " Add a new texture " ;
2009-10-22 23:22:05 +00:00
/* api callbacks */
2012-03-22 07:26:09 +00:00
ot - > exec = new_texture_exec ;
2009-10-22 23:22:05 +00:00
/* flags */
2012-03-22 07:26:09 +00:00
ot - > flag = OPTYPE_REGISTER | OPTYPE_UNDO ;
2009-10-22 23:22:05 +00:00
}
/********************** new world operator *********************/
2010-10-15 01:36:14 +00:00
static int new_world_exec ( bContext * C , wmOperator * UNUSED ( op ) )
2009-10-22 23:22:05 +00:00
{
2011-11-02 19:24:30 +00:00
Scene * scene = CTX_data_scene ( C ) ;
2009-10-22 23:22:05 +00:00
World * wo = CTX_data_pointer_get_type ( C , " world " , & RNA_World ) . data ;
PointerRNA ptr , idptr ;
PropertyRNA * prop ;
/* add or copy world */
2012-03-24 06:38:07 +00:00
if ( wo ) {
2009-10-22 23:22:05 +00:00
wo = copy_world ( wo ) ;
2011-11-02 19:24:30 +00:00
}
else {
2009-10-22 23:22:05 +00:00
wo = add_world ( " World " ) ;
2012-03-24 06:38:07 +00:00
if ( scene_use_new_shading_nodes ( scene ) ) {
2011-11-02 19:24:30 +00:00
ED_node_shader_default ( scene , & wo - > id ) ;
wo - > use_nodes = 1 ;
}
}
2009-10-22 23:22:05 +00:00
/* hook into UI */
uiIDContextProperty ( C , & ptr , & prop ) ;
2012-03-24 06:38:07 +00:00
if ( prop ) {
2009-10-22 23:22:05 +00:00
/* when creating new ID blocks, use is already 1, but RNA
* pointer se also increases user , so this compensates it */
wo - > id . us - - ;
RNA_id_pointer_create ( & wo - > id , & idptr ) ;
RNA_property_pointer_set ( & ptr , prop , idptr ) ;
RNA_property_update ( C , & ptr , prop ) ;
}
WM_event_add_notifier ( C , NC_WORLD | NA_ADDED , wo ) ;
return OPERATOR_FINISHED ;
}
void WORLD_OT_new ( wmOperatorType * ot )
{
/* identifiers */
2012-03-22 07:26:09 +00:00
ot - > name = " New World " ;
ot - > idname = " WORLD_OT_new " ;
ot - > description = " Add a new world " ;
2009-10-22 23:22:05 +00:00
/* api callbacks */
2012-03-22 07:26:09 +00:00
ot - > exec = new_world_exec ;
2009-10-22 23:22:05 +00:00
/* flags */
2012-03-22 07:26:09 +00:00
ot - > flag = OPTYPE_REGISTER | OPTYPE_UNDO ;
2009-10-22 23:22:05 +00:00
}
/********************** render layer operators *********************/
2010-10-15 01:36:14 +00:00
static int render_layer_add_exec ( bContext * C , wmOperator * UNUSED ( op ) )
2009-10-22 23:22:05 +00:00
{
Scene * scene = CTX_data_scene ( C ) ;
2011-11-18 07:11:54 +00:00
scene_add_render_layer ( scene , NULL ) ;
2009-10-22 23:22:05 +00:00
scene - > r . actlay = BLI_countlist ( & scene - > r . layers ) - 1 ;
WM_event_add_notifier ( C , NC_SCENE | ND_RENDER_OPTIONS , scene ) ;
return OPERATOR_FINISHED ;
}
void SCENE_OT_render_layer_add ( wmOperatorType * ot )
{
/* identifiers */
2012-03-22 07:26:09 +00:00
ot - > name = " Add Render Layer " ;
ot - > idname = " SCENE_OT_render_layer_add " ;
ot - > description = " Add a render layer " ;
2009-10-22 23:22:05 +00:00
/* api callbacks */
2012-03-22 07:26:09 +00:00
ot - > exec = render_layer_add_exec ;
2009-10-22 23:22:05 +00:00
/* flags */
2012-03-22 07:26:09 +00:00
ot - > flag = OPTYPE_REGISTER | OPTYPE_UNDO ;
2009-10-22 23:22:05 +00:00
}
2010-10-15 01:36:14 +00:00
static int render_layer_remove_exec ( bContext * C , wmOperator * UNUSED ( op ) )
2009-10-22 23:22:05 +00:00
{
2011-11-18 07:11:54 +00:00
Scene * scene = CTX_data_scene ( C ) ;
SceneRenderLayer * rl = BLI_findlink ( & scene - > r . layers , scene - > r . actlay ) ;
2009-10-22 23:22:05 +00:00
2012-03-24 06:38:07 +00:00
if ( ! scene_remove_render_layer ( CTX_data_main ( C ) , scene , rl ) )
2009-10-22 23:22:05 +00:00
return OPERATOR_CANCELLED ;
WM_event_add_notifier ( C , NC_SCENE | ND_RENDER_OPTIONS , scene ) ;
return OPERATOR_FINISHED ;
}
void SCENE_OT_render_layer_remove ( wmOperatorType * ot )
{
/* identifiers */
2012-03-22 07:26:09 +00:00
ot - > name = " Remove Render Layer " ;
ot - > idname = " SCENE_OT_render_layer_remove " ;
ot - > description = " Remove the selected render layer " ;
2009-10-22 23:22:05 +00:00
/* api callbacks */
2012-03-22 07:26:09 +00:00
ot - > exec = render_layer_remove_exec ;
2009-10-22 23:22:05 +00:00
/* flags */
2012-03-22 07:26:09 +00:00
ot - > flag = OPTYPE_REGISTER | OPTYPE_UNDO ;
2009-10-22 23:22:05 +00:00
}
static int texture_slot_move ( bContext * C , wmOperator * op )
{
ID * id = CTX_data_pointer_get_type ( C , " texture_slot " , & RNA_TextureSlot ) . id . data ;
2012-03-24 06:38:07 +00:00
if ( id ) {
2009-10-22 23:22:05 +00:00
MTex * * mtex_ar , * mtexswap ;
short act ;
int type = RNA_enum_get ( op - > ptr , " type " ) ;
2010-12-03 12:30:59 +00:00
struct AnimData * adt = BKE_animdata_from_id ( id ) ;
2009-10-22 23:22:05 +00:00
give_active_mtex ( id , & mtex_ar , & act ) ;
2012-03-24 06:38:07 +00:00
if ( type = = - 1 ) { /* Up */
if ( act > 0 ) {
2009-10-22 23:22:05 +00:00
mtexswap = mtex_ar [ act ] ;
mtex_ar [ act ] = mtex_ar [ act - 1 ] ;
mtex_ar [ act - 1 ] = mtexswap ;
2010-03-16 07:44:57 +00:00
2010-12-03 12:30:59 +00:00
BKE_animdata_fix_paths_rename ( id , adt , " texture_slots " , NULL , NULL , act - 1 , - 1 , 0 ) ;
BKE_animdata_fix_paths_rename ( id , adt , " texture_slots " , NULL , NULL , act , act - 1 , 0 ) ;
BKE_animdata_fix_paths_rename ( id , adt , " texture_slots " , NULL , NULL , - 1 , act , 0 ) ;
2009-10-22 23:22:05 +00:00
2012-03-24 06:38:07 +00:00
if ( GS ( id - > name ) = = ID_MA ) {
2009-10-22 23:22:05 +00:00
Material * ma = ( Material * ) id ;
int mtexuse = ma - > septex & ( 1 < < act ) ;
ma - > septex & = ~ ( 1 < < act ) ;
ma - > septex | = ( ma - > septex & ( 1 < < ( act - 1 ) ) ) < < 1 ;
ma - > septex & = ~ ( 1 < < ( act - 1 ) ) ;
ma - > septex | = mtexuse > > 1 ;
}
2010-03-16 07:44:57 +00:00
2009-10-22 23:22:05 +00:00
set_active_mtex ( id , act - 1 ) ;
}
}
else { /* Down */
2012-03-24 06:38:07 +00:00
if ( act < MAX_MTEX - 1 ) {
2009-10-22 23:22:05 +00:00
mtexswap = mtex_ar [ act ] ;
mtex_ar [ act ] = mtex_ar [ act + 1 ] ;
mtex_ar [ act + 1 ] = mtexswap ;
2010-03-16 07:44:57 +00:00
2010-12-03 12:30:59 +00:00
BKE_animdata_fix_paths_rename ( id , adt , " texture_slots " , NULL , NULL , act + 1 , - 1 , 0 ) ;
BKE_animdata_fix_paths_rename ( id , adt , " texture_slots " , NULL , NULL , act , act + 1 , 0 ) ;
BKE_animdata_fix_paths_rename ( id , adt , " texture_slots " , NULL , NULL , - 1 , act , 0 ) ;
2009-10-22 23:22:05 +00:00
2012-03-24 06:38:07 +00:00
if ( GS ( id - > name ) = = ID_MA ) {
2009-10-22 23:22:05 +00:00
Material * ma = ( Material * ) id ;
int mtexuse = ma - > septex & ( 1 < < act ) ;
ma - > septex & = ~ ( 1 < < act ) ;
ma - > septex | = ( ma - > septex & ( 1 < < ( act + 1 ) ) ) > > 1 ;
ma - > septex & = ~ ( 1 < < ( act + 1 ) ) ;
ma - > septex | = mtexuse < < 1 ;
}
2010-03-16 07:44:57 +00:00
2009-10-22 23:22:05 +00:00
set_active_mtex ( id , act + 1 ) ;
}
}
2011-02-08 14:33:08 +00:00
DAG_id_tag_update ( id , 0 ) ;
2009-10-22 23:22:05 +00:00
WM_event_add_notifier ( C , NC_TEXTURE , CTX_data_scene ( C ) ) ;
}
return OPERATOR_FINISHED ;
}
void TEXTURE_OT_slot_move ( wmOperatorType * ot )
{
static EnumPropertyItem slot_move [ ] = {
{ - 1 , " UP " , 0 , " Up " , " " } ,
{ 1 , " DOWN " , 0 , " Down " , " " } ,
{ 0 , NULL , 0 , NULL , NULL }
} ;
/* identifiers */
2012-03-22 07:26:09 +00:00
ot - > name = " Move Texture Slot " ;
ot - > idname = " TEXTURE_OT_slot_move " ;
ot - > description = " Move texture slots up and down " ;
2009-10-22 23:22:05 +00:00
/* api callbacks */
2012-03-22 07:26:09 +00:00
ot - > exec = texture_slot_move ;
2009-10-22 23:22:05 +00:00
/* flags */
2012-03-22 07:26:09 +00:00
ot - > flag = OPTYPE_REGISTER | OPTYPE_UNDO ;
2009-10-22 23:22:05 +00:00
RNA_def_enum ( ot - > srna , " type " , slot_move , 0 , " Type " , " " ) ;
}
2010-01-28 17:31:11 +00:00
2010-03-11 07:43:49 +00:00
/********************** environment map operators *********************/
2011-11-21 23:56:32 +00:00
static int save_envmap ( wmOperator * op , Scene * scene , EnvMap * env , char * path , const char imtype )
2010-03-11 07:43:49 +00:00
{
2011-08-28 23:24:34 +00:00
float layout [ 12 ] ;
if ( RNA_struct_find_property ( op - > ptr , " layout " ) )
RNA_float_get_array ( op - > ptr , " layout " , layout ) ;
else
memcpy ( layout , default_envmap_layout , sizeof ( layout ) ) ;
2010-03-12 02:44:18 +00:00
2011-08-28 23:24:34 +00:00
if ( RE_WriteEnvmapResult ( op - > reports , scene , env , path , imtype , layout ) ) {
return OPERATOR_FINISHED ;
2010-03-12 02:44:18 +00:00
}
2011-01-13 04:53:55 +00:00
else {
return OPERATOR_CANCELLED ;
}
2011-08-28 23:24:34 +00:00
2010-03-11 07:43:49 +00:00
}
static int envmap_save_exec ( bContext * C , wmOperator * op )
{
Tex * tex = CTX_data_pointer_get_type ( C , " texture " , & RNA_Texture ) . data ;
Scene * scene = CTX_data_scene ( C ) ;
//int imtype = RNA_enum_get(op->ptr, "file_type");
2011-11-21 23:56:32 +00:00
char imtype = scene - > r . im_format . imtype ;
2010-03-11 07:43:49 +00:00
char path [ FILE_MAX ] ;
2010-06-14 03:52:10 +00:00
RNA_string_get ( op - > ptr , " filepath " , path ) ;
2010-03-11 07:43:49 +00:00
2012-03-24 06:38:07 +00:00
if ( scene - > r . scemode & R_EXTENSION ) {
2010-03-11 07:43:49 +00:00
BKE_add_image_extension ( path , imtype ) ;
}
WM_cursor_wait ( 1 ) ;
save_envmap ( op , scene , tex - > env , path , imtype ) ;
WM_cursor_wait ( 0 ) ;
WM_event_add_notifier ( C , NC_TEXTURE , tex ) ;
return OPERATOR_FINISHED ;
}
2010-10-15 01:36:14 +00:00
static int envmap_save_invoke ( bContext * C , wmOperator * op , wmEvent * UNUSED ( event ) )
2010-03-11 07:43:49 +00:00
{
//Scene *scene= CTX_data_scene(C);
2012-03-24 06:38:07 +00:00
if ( RNA_struct_property_is_set ( op - > ptr , " filepath " ) )
2010-03-11 07:43:49 +00:00
return envmap_save_exec ( C , op ) ;
2011-11-21 20:19:58 +00:00
//RNA_enum_set(op->ptr, "file_type", scene->r.im_format.imtype);
2010-10-18 06:41:16 +00:00
RNA_string_set ( op - > ptr , " filepath " , G . main - > name ) ;
2010-03-11 07:43:49 +00:00
WM_event_add_fileselect ( C , op ) ;
return OPERATOR_RUNNING_MODAL ;
}
static int envmap_save_poll ( bContext * C )
{
Tex * tex = CTX_data_pointer_get_type ( C , " texture " , & RNA_Texture ) . data ;
if ( ! tex )
return 0 ;
if ( ! tex - > env | | ! tex - > env - > ok )
return 0 ;
if ( tex - > env - > cube [ 1 ] = = NULL )
return 0 ;
return 1 ;
}
void TEXTURE_OT_envmap_save ( wmOperatorType * ot )
{
2011-08-28 23:24:34 +00:00
PropertyRNA * prop ;
2010-03-11 07:43:49 +00:00
/* identifiers */
2012-03-22 07:26:09 +00:00
ot - > name = " Save Environment Map " ;
ot - > idname = " TEXTURE_OT_envmap_save " ;
ot - > description = " Save the current generated Environment map to an image file " ;
2010-03-11 07:43:49 +00:00
/* api callbacks */
2012-03-22 07:26:09 +00:00
ot - > exec = envmap_save_exec ;
ot - > invoke = envmap_save_invoke ;
ot - > poll = envmap_save_poll ;
2010-03-11 07:43:49 +00:00
/* flags */
2012-03-22 07:26:09 +00:00
ot - > flag = OPTYPE_REGISTER ; /* no undo since this doesnt modify the env-map */
2010-03-11 07:43:49 +00:00
/* properties */
2011-09-19 12:26:20 +00:00
prop = RNA_def_float_array ( ot - > srna , " layout " , 12 , default_envmap_layout , 0.0f , 0.0f , " File layout " , " Flat array describing the X,Y position of each cube face in the output image, where 1 is the size of a face - order is [+Z -Z +Y -X -Y +X] (use -1 to skip a face) " , 0.0f , 0.0f ) ;
2011-08-28 23:24:34 +00:00
RNA_def_property_flag ( prop , PROP_HIDDEN ) ;
2012-01-24 18:18:51 +00:00
WM_operator_properties_filesel ( ot , FOLDERFILE | IMAGEFILE | MOVIEFILE , FILE_SPECIAL , FILE_SAVE , WM_FILESEL_FILEPATH , FILE_DEFAULTDISPLAY ) ;
2010-03-11 07:43:49 +00:00
}
2010-10-15 01:36:14 +00:00
static int envmap_clear_exec ( bContext * C , wmOperator * UNUSED ( op ) )
2010-03-11 07:43:49 +00:00
{
Tex * tex = CTX_data_pointer_get_type ( C , " texture " , & RNA_Texture ) . data ;
BKE_free_envmapdata ( tex - > env ) ;
WM_event_add_notifier ( C , NC_TEXTURE | NA_EDITED , tex ) ;
return OPERATOR_FINISHED ;
}
static int envmap_clear_poll ( bContext * C )
{
Tex * tex = CTX_data_pointer_get_type ( C , " texture " , & RNA_Texture ) . data ;
if ( ! tex )
return 0 ;
if ( ! tex - > env | | ! tex - > env - > ok )
return 0 ;
if ( tex - > env - > cube [ 1 ] = = NULL )
return 0 ;
return 1 ;
}
void TEXTURE_OT_envmap_clear ( wmOperatorType * ot )
{
/* identifiers */
2012-03-22 07:26:09 +00:00
ot - > name = " Clear Environment Map " ;
ot - > idname = " TEXTURE_OT_envmap_clear " ;
ot - > description = " Discard the environment map and free it from memory " ;
2010-03-11 07:43:49 +00:00
/* api callbacks */
2012-03-22 07:26:09 +00:00
ot - > exec = envmap_clear_exec ;
ot - > poll = envmap_clear_poll ;
2010-03-11 07:43:49 +00:00
/* flags */
2012-03-22 07:26:09 +00:00
ot - > flag = OPTYPE_REGISTER | OPTYPE_UNDO ;
2010-03-11 07:43:49 +00:00
}
2010-10-15 01:36:14 +00:00
static int envmap_clear_all_exec ( bContext * C , wmOperator * UNUSED ( op ) )
2010-03-11 07:43:49 +00:00
{
Main * bmain = CTX_data_main ( C ) ;
Tex * tex ;
for ( tex = bmain - > tex . first ; tex ; tex = tex - > id . next )
2010-03-12 02:44:18 +00:00
if ( tex - > env )
BKE_free_envmapdata ( tex - > env ) ;
2010-03-11 07:43:49 +00:00
WM_event_add_notifier ( C , NC_TEXTURE | NA_EDITED , tex ) ;
return OPERATOR_FINISHED ;
}
void TEXTURE_OT_envmap_clear_all ( wmOperatorType * ot )
{
/* identifiers */
2012-03-22 07:26:09 +00:00
ot - > name = " Clear All Environment Maps " ;
ot - > idname = " TEXTURE_OT_envmap_clear_all " ;
ot - > description = " Discard all environment maps in the .blend file and free them from memory " ;
2010-03-11 07:43:49 +00:00
/* api callbacks */
2012-03-22 07:26:09 +00:00
ot - > exec = envmap_clear_all_exec ;
ot - > poll = envmap_clear_poll ;
2010-03-11 07:43:49 +00:00
/* flags */
2012-03-22 07:26:09 +00:00
ot - > flag = OPTYPE_REGISTER | OPTYPE_UNDO ;
2010-03-11 07:43:49 +00:00
}
/********************** material operators *********************/
2010-01-28 17:31:11 +00:00
/* material copy/paste */
2010-10-15 01:36:14 +00:00
static int copy_material_exec ( bContext * C , wmOperator * UNUSED ( op ) )
2010-01-28 17:31:11 +00:00
{
Material * ma = CTX_data_pointer_get_type ( C , " material " , & RNA_Material ) . data ;
2012-03-24 06:38:07 +00:00
if ( ma = = NULL )
2010-01-28 19:18:35 +00:00
return OPERATOR_CANCELLED ;
2010-01-28 17:31:11 +00:00
copy_matcopybuf ( ma ) ;
return OPERATOR_FINISHED ;
}
void MATERIAL_OT_copy ( wmOperatorType * ot )
{
/* identifiers */
2012-03-22 07:26:09 +00:00
ot - > name = " Copy Material " ;
ot - > idname = " MATERIAL_OT_copy " ;
ot - > description = " Copy the material settings and nodes " ;
2010-01-28 17:31:11 +00:00
/* api callbacks */
2012-03-22 07:26:09 +00:00
ot - > exec = copy_material_exec ;
2010-01-28 17:31:11 +00:00
/* flags */
2012-03-22 07:26:09 +00:00
ot - > flag = OPTYPE_REGISTER ; /* no undo needed since no changes are made to the material */
2010-01-28 17:31:11 +00:00
}
2010-10-15 01:36:14 +00:00
static int paste_material_exec ( bContext * C , wmOperator * UNUSED ( op ) )
2010-01-28 17:31:11 +00:00
{
Material * ma = CTX_data_pointer_get_type ( C , " material " , & RNA_Material ) . data ;
2012-03-24 06:38:07 +00:00
if ( ma = = NULL )
2010-01-28 17:50:50 +00:00
return OPERATOR_CANCELLED ;
2010-01-28 17:31:11 +00:00
paste_matcopybuf ( ma ) ;
WM_event_add_notifier ( C , NC_MATERIAL | ND_SHADING_DRAW , ma ) ;
return OPERATOR_FINISHED ;
}
void MATERIAL_OT_paste ( wmOperatorType * ot )
{
/* identifiers */
2012-03-22 07:26:09 +00:00
ot - > name = " Paste Material " ;
ot - > idname = " MATERIAL_OT_paste " ;
ot - > description = " Paste the material settings and nodes " ;
2010-01-28 17:31:11 +00:00
/* api callbacks */
2012-03-22 07:26:09 +00:00
ot - > exec = paste_material_exec ;
2010-01-28 17:31:11 +00:00
/* flags */
2012-03-22 07:26:09 +00:00
ot - > flag = OPTYPE_REGISTER | OPTYPE_UNDO ;
2010-01-28 17:31:11 +00:00
}
2010-03-09 09:17:45 +00:00
2010-03-29 05:37:34 +00:00
static short mtexcopied = 0 ; /* must be reset on file load */
static MTex mtexcopybuf ;
void ED_render_clear_mtex_copybuf ( void )
{ /* use for file reload */
mtexcopied = 0 ;
}
2011-02-14 17:55:27 +00:00
static void copy_mtex_copybuf ( ID * id )
2010-03-09 09:17:45 +00:00
{
2010-03-29 05:37:34 +00:00
MTex * * mtex = NULL ;
switch ( GS ( id - > name ) ) {
case ID_MA :
mtex = & ( ( ( Material * ) id ) - > mtex [ ( int ) ( ( Material * ) id ) - > texact ] ) ;
break ;
case ID_LA :
mtex = & ( ( ( Lamp * ) id ) - > mtex [ ( int ) ( ( Lamp * ) id ) - > texact ] ) ;
// la->mtex[(int)la->texact] // TODO
break ;
case ID_WO :
mtex = & ( ( ( World * ) id ) - > mtex [ ( int ) ( ( World * ) id ) - > texact ] ) ;
// mtex= wrld->mtex[(int)wrld->texact]; // TODO
break ;
2011-02-13 12:35:26 +00:00
case ID_PA :
mtex = & ( ( ( ParticleSettings * ) id ) - > mtex [ ( int ) ( ( ParticleSettings * ) id ) - > texact ] ) ;
break ;
2010-03-29 05:37:34 +00:00
}
2012-03-24 06:38:07 +00:00
if ( mtex & & * mtex ) {
2010-03-29 05:37:34 +00:00
memcpy ( & mtexcopybuf , * mtex , sizeof ( MTex ) ) ;
mtexcopied = 1 ;
}
else {
mtexcopied = 0 ;
}
}
2010-03-09 09:17:45 +00:00
2011-02-14 17:55:27 +00:00
static void paste_mtex_copybuf ( ID * id )
2010-03-29 05:37:34 +00:00
{
MTex * * mtex = NULL ;
2012-03-24 06:38:07 +00:00
if ( mtexcopied = = 0 | | mtexcopybuf . tex = = NULL )
2010-03-29 05:37:34 +00:00
return ;
switch ( GS ( id - > name ) ) {
case ID_MA :
mtex = & ( ( ( Material * ) id ) - > mtex [ ( int ) ( ( Material * ) id ) - > texact ] ) ;
break ;
case ID_LA :
mtex = & ( ( ( Lamp * ) id ) - > mtex [ ( int ) ( ( Lamp * ) id ) - > texact ] ) ;
// la->mtex[(int)la->texact] // TODO
break ;
case ID_WO :
mtex = & ( ( ( World * ) id ) - > mtex [ ( int ) ( ( World * ) id ) - > texact ] ) ;
// mtex= wrld->mtex[(int)wrld->texact]; // TODO
break ;
2011-02-13 12:35:26 +00:00
case ID_PA :
mtex = & ( ( ( ParticleSettings * ) id ) - > mtex [ ( int ) ( ( ParticleSettings * ) id ) - > texact ] ) ;
break ;
2011-03-19 05:06:06 +00:00
default :
BLI_assert ( " invalid id type " ) ;
return ;
2010-03-29 05:37:34 +00:00
}
2012-03-24 06:38:07 +00:00
if ( mtex ) {
if ( * mtex = = NULL ) {
2010-03-29 05:37:34 +00:00
* mtex = MEM_mallocN ( sizeof ( MTex ) , " mtex copy " ) ;
}
2012-03-24 06:38:07 +00:00
else if ( ( * mtex ) - > tex ) {
2010-03-29 05:37:34 +00:00
( * mtex ) - > tex - > id . us - - ;
}
memcpy ( * mtex , & mtexcopybuf , sizeof ( MTex ) ) ;
id_us_plus ( ( ID * ) mtexcopybuf . tex ) ;
}
}
2010-10-15 01:36:14 +00:00
static int copy_mtex_exec ( bContext * C , wmOperator * UNUSED ( op ) )
2010-03-29 05:37:34 +00:00
{
ID * id = CTX_data_pointer_get_type ( C , " texture_slot " , & RNA_TextureSlot ) . id . data ;
2012-03-24 06:38:07 +00:00
if ( id = = NULL ) {
2010-03-29 05:37:34 +00:00
/* copying empty slot */
ED_render_clear_mtex_copybuf ( ) ;
2010-03-09 09:17:45 +00:00
return OPERATOR_CANCELLED ;
2010-03-29 05:37:34 +00:00
}
2010-03-09 09:17:45 +00:00
2010-03-29 05:37:34 +00:00
copy_mtex_copybuf ( id ) ;
2010-03-09 09:17:45 +00:00
return OPERATOR_FINISHED ;
}
2010-03-29 05:37:34 +00:00
static int copy_mtex_poll ( bContext * C )
{
ID * id = CTX_data_pointer_get_type ( C , " texture_slot " , & RNA_TextureSlot ) . id . data ;
return ( id ! = NULL ) ;
}
void TEXTURE_OT_slot_copy ( wmOperatorType * ot )
2010-03-09 09:17:45 +00:00
{
/* identifiers */
2012-03-22 07:26:09 +00:00
ot - > name = " Copy Texture Slot Settings " ;
ot - > idname = " TEXTURE_OT_slot_copy " ;
ot - > description = " Copy the material texture settings and nodes " ;
2010-03-09 09:17:45 +00:00
/* api callbacks */
2012-03-22 07:26:09 +00:00
ot - > exec = copy_mtex_exec ;
ot - > poll = copy_mtex_poll ;
2010-03-29 05:37:34 +00:00
2010-03-09 09:17:45 +00:00
/* flags */
2012-03-22 07:26:09 +00:00
ot - > flag = OPTYPE_REGISTER ; /* no undo needed since no changes are made to the mtex */
2010-03-09 09:17:45 +00:00
}
2010-10-15 01:36:14 +00:00
static int paste_mtex_exec ( bContext * C , wmOperator * UNUSED ( op ) )
2010-03-09 09:17:45 +00:00
{
2010-03-29 05:37:34 +00:00
ID * id = CTX_data_pointer_get_type ( C , " texture_slot " , & RNA_TextureSlot ) . id . data ;
2010-03-09 09:17:45 +00:00
2012-03-24 06:38:07 +00:00
if ( id = = NULL ) {
2010-03-29 05:37:34 +00:00
Material * ma = CTX_data_pointer_get_type ( C , " material " , & RNA_Material ) . data ;
Lamp * la = CTX_data_pointer_get_type ( C , " lamp " , & RNA_Lamp ) . data ;
World * wo = CTX_data_pointer_get_type ( C , " world " , & RNA_World ) . data ;
2011-02-13 12:35:26 +00:00
ParticleSystem * psys = CTX_data_pointer_get_type ( C , " particle_system " , & RNA_ParticleSystem ) . data ;
2010-03-29 05:37:34 +00:00
if ( ma )
id = & ma - > id ;
else if ( la )
id = & la - > id ;
else if ( wo )
id = & wo - > id ;
2011-02-13 12:35:26 +00:00
else if ( psys )
id = & psys - > part - > id ;
2010-03-29 05:37:34 +00:00
if ( id = = NULL )
return OPERATOR_CANCELLED ;
}
2010-03-09 09:17:45 +00:00
2010-03-29 05:37:34 +00:00
paste_mtex_copybuf ( id ) ;
2010-03-09 09:17:45 +00:00
2010-03-29 05:37:34 +00:00
WM_event_add_notifier ( C , NC_TEXTURE | ND_SHADING_DRAW , NULL ) ;
2010-03-09 09:17:45 +00:00
return OPERATOR_FINISHED ;
}
2010-03-29 05:37:34 +00:00
void TEXTURE_OT_slot_paste ( wmOperatorType * ot )
2010-03-09 09:17:45 +00:00
{
/* identifiers */
2012-03-22 07:26:09 +00:00
ot - > name = " Paste Texture Slot Settings " ;
ot - > idname = " TEXTURE_OT_slot_paste " ;
ot - > description = " Copy the texture settings and nodes " ;
2010-03-09 09:17:45 +00:00
/* api callbacks */
2012-03-22 07:26:09 +00:00
ot - > exec = paste_mtex_exec ;
2010-03-09 09:17:45 +00:00
/* flags */
2012-03-22 07:26:09 +00:00
ot - > flag = OPTYPE_REGISTER | OPTYPE_UNDO ;
2010-03-09 09:17:45 +00:00
}
2011-05-19 11:34:11 +00:00