svn merge -r40166:40279 ^/trunk/blender
[blender.git] / source / blender / makesrna / intern / rna_scene.c
index 7313a39e5ec3b241ed558801de5d80d5761ed713..c50519479ebec2adf7bfb71076bbf110c0f0270b 100644 (file)
@@ -39,6 +39,9 @@
 #include "DNA_particle_types.h"
 #include "DNA_scene_types.h"
 #include "DNA_userdef_types.h"
+#include "BLI_math.h"
+
+#include "BKE_tessmesh.h"
 
 /* Include for Bake Options */
 #include "RE_pipeline.h"
@@ -46,7 +49,7 @@
 #ifdef WITH_QUICKTIME
 #include "quicktime_export.h"
 #  ifdef WITH_AUDASPACE
-#    include "AUD_C-API.h"
+#    include "AUD_Space.h"
 #  endif
 #endif
 
@@ -155,6 +158,12 @@ EnumPropertyItem image_type_items[] = {
 #endif
        {0, NULL, 0, NULL, NULL}};
 
+EnumPropertyItem image_color_mode_items[] ={
+       {R_PLANESBW, "BW", 0, "BW", "Images get saved in 8 bits grayscale (only PNG, JPEG, TGA, TIF)"},
+       {R_PLANES24, "RGB", 0, "RGB", "Images are saved with RGB (color) data"},
+       {R_PLANES32, "RGBA", 0, "RGBA", "Images are saved with RGB and Alpha data (if supported)"},
+       {0, NULL, 0, NULL, NULL}};
+
 #ifdef RNA_RUNTIME
 
 #include "DNA_anim_types.h"
@@ -433,11 +442,10 @@ static void rna_Scene_preview_range_end_frame_set(PointerRNA *ptr, int value)
        data->r.pefra= value;
 }
 
-static void rna_Scene_frame_update(bContext *C, PointerRNA *UNUSED(ptr))
+static void rna_Scene_frame_update(Main *bmain, Scene *UNUSED(current_scene), PointerRNA *ptr)
 {
-       //Scene *scene= ptr->id.data;
-       //ED_update_for_newframe(C);
-       sound_seek_scene(C);
+       Scene *scene= (Scene*)ptr->id.data;
+       sound_seek_scene(bmain, scene);
 }
 
 static PointerRNA rna_Scene_active_keying_set_get(PointerRNA *ptr)
@@ -721,8 +729,8 @@ static void rna_RenderSettings_active_layer_set(PointerRNA *ptr, PointerRNA valu
 {
        RenderData *rd= (RenderData*)ptr->data;
        SceneRenderLayer *srl= (SceneRenderLayer*)value.data;
-       
-       rd->actlay = BLI_findindex(&rd->layers, srl);
+       const int index= BLI_findindex(&rd->layers, srl);
+       if (index != -1) rd->actlay= index;
 }
 
 static void rna_RenderSettings_engine_set(PointerRNA *ptr, int value)
@@ -731,7 +739,7 @@ static void rna_RenderSettings_engine_set(PointerRNA *ptr, int value)
        RenderEngineType *type= BLI_findlink(&R_engines, value);
 
        if(type)
-               BLI_strncpy(rd->engine, type->idname, sizeof(rd->engine));
+               BLI_strncpy_utf8(rd->engine, type->idname, sizeof(rd->engine));
 }
 
 static EnumPropertyItem *rna_RenderSettings_engine_itemf(bContext *UNUSED(C), PointerRNA *UNUSED(ptr), PropertyRNA *UNUSED(prop), int *free)
@@ -804,7 +812,7 @@ static void rna_SceneRenderLayer_name_set(PointerRNA *ptr, const char *value)
        Scene *scene= (Scene*)ptr->id.data;
        SceneRenderLayer *rl= (SceneRenderLayer*)ptr->data;
 
-       BLI_strncpy(rl->name, value, sizeof(rl->name));
+       BLI_strncpy_utf8(rl->name, value, sizeof(rl->name));
 
        if(scene->nodetree) {
                bNode *node;
@@ -879,9 +887,9 @@ static void rna_Scene_editmesh_select_mode_set(PointerRNA *ptr, const int *value
 
                if(scene->basact) {
                        Mesh *me= get_mesh(scene->basact->object);
-                       if(me && me->edit_mesh && me->edit_mesh->selectmode != flag) {
-                               me->edit_mesh->selectmode= flag;
-                               EM_selectmode_set(me->edit_mesh);
+                       if(me && me->edit_btmesh && me->edit_btmesh->selectmode != flag) {
+                               me->edit_btmesh->selectmode= flag;
+                               EDBM_selectmode_set(me->edit_btmesh);
                        }
                }
        }
@@ -893,7 +901,7 @@ static void rna_Scene_editmesh_select_mode_update(Main *UNUSED(bmain), Scene *sc
 
        if(scene->basact) {
                me= get_mesh(scene->basact->object);
-               if(me && me->edit_mesh==NULL)
+               if(me && me->edit_btmesh==NULL)
                        me= NULL;
        }
 
@@ -1005,7 +1013,7 @@ static TimeMarker *rna_TimeLine_add(Scene *scene, const char name[])
        TimeMarker *marker = MEM_callocN(sizeof(TimeMarker), "TimeMarker");
        marker->flag= SELECT;
        marker->frame= 1;
-       BLI_strncpy(marker->name, name, sizeof(marker->name));
+       BLI_strncpy_utf8(marker->name, name, sizeof(marker->name));
        BLI_addtail(&scene->markers, marker);
        return marker;
 }
@@ -1664,6 +1672,96 @@ void rna_def_render_layer_common(StructRNA *srna, int scene)
        else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
 }
 
+static void rna_def_scene_game_recast_data(BlenderRNA *brna)
+{
+       StructRNA *srna;
+       PropertyRNA *prop;
+
+       srna= RNA_def_struct(brna, "SceneGameRecastData", NULL);
+       RNA_def_struct_sdna(srna, "RecastData");
+       RNA_def_struct_nested(brna, srna, "Scene");
+       RNA_def_struct_ui_text(srna, "Recast Data", "Recast data for a Game datablock");
+
+       prop= RNA_def_property(srna, "cell_size", PROP_FLOAT, PROP_NONE);
+       RNA_def_property_float_sdna(prop, NULL, "cellsize");
+       RNA_def_property_ui_range(prop, 0.1, 1, 1, 2);
+       RNA_def_property_ui_text(prop, "Cell Size", "Rasterized cell size");
+       RNA_def_property_update(prop, NC_SCENE, NULL);
+
+       prop= RNA_def_property(srna, "cell_height", PROP_FLOAT, PROP_NONE);
+       RNA_def_property_float_sdna(prop, NULL, "cellheight");
+       RNA_def_property_ui_range(prop, 0.1, 1, 1, 2);
+       RNA_def_property_ui_text(prop, "Cell Height", "Rasterized cell height");
+       RNA_def_property_update(prop, NC_SCENE, NULL);
+
+       prop= RNA_def_property(srna, "agent_height", PROP_FLOAT, PROP_NONE);
+       RNA_def_property_float_sdna(prop, NULL, "agentheight");
+       RNA_def_property_ui_range(prop, 0.1, 5, 1, 2);
+       RNA_def_property_ui_text(prop, "Agent Height", "Minimum height where the agent can still walk");
+       RNA_def_property_update(prop, NC_SCENE, NULL);
+
+       prop= RNA_def_property(srna, "agent_radius", PROP_FLOAT, PROP_NONE);
+       RNA_def_property_float_sdna(prop, NULL, "agentradius");
+       RNA_def_property_ui_range(prop, 0.1, 5, 1, 2);
+       RNA_def_property_ui_text(prop, "Agent Radius", "Radius of the agent");
+       RNA_def_property_update(prop, NC_SCENE, NULL);
+
+       prop= RNA_def_property(srna, "max_climb", PROP_FLOAT, PROP_NONE);
+       RNA_def_property_float_sdna(prop, NULL, "agentmaxclimb");
+       RNA_def_property_ui_range(prop, 0.1, 5, 1, 2);
+       RNA_def_property_ui_text(prop, "Max Climb", "Maximum height between grid cells the agent can climb");
+       RNA_def_property_update(prop, NC_SCENE, NULL);
+
+       prop= RNA_def_property(srna, "max_slope", PROP_FLOAT, PROP_ANGLE);
+       RNA_def_property_float_sdna(prop, NULL, "agentmaxslope");
+       RNA_def_property_range(prop, 0, M_PI/2);
+       RNA_def_property_ui_text(prop, "Max Slope", "Maximum walkable slope angle in degrees");
+       RNA_def_property_update(prop, NC_SCENE, NULL);
+
+
+       prop= RNA_def_property(srna, "region_min_size", PROP_FLOAT, PROP_NONE);
+       RNA_def_property_float_sdna(prop, NULL, "regionminsize");
+       RNA_def_property_ui_range(prop, 0, 150, 1, 2);
+       RNA_def_property_ui_text(prop, "Min Region Size", "Minimum regions size. Smaller regions will be deleted");
+       RNA_def_property_update(prop, NC_SCENE, NULL);
+
+       prop= RNA_def_property(srna, "region_merge_size", PROP_FLOAT, PROP_NONE);
+       RNA_def_property_float_sdna(prop, NULL, "regionmergesize");
+       RNA_def_property_ui_range(prop, 0, 150, 1, 2);
+       RNA_def_property_ui_text(prop, "Merged Region Size", "Minimum regions size. Smaller regions will be merged");
+       RNA_def_property_update(prop, NC_SCENE, NULL);
+
+       prop= RNA_def_property(srna, "edge_max_len", PROP_FLOAT, PROP_NONE);
+       RNA_def_property_float_sdna(prop, NULL, "edgemaxlen");
+       RNA_def_property_ui_range(prop, 0, 50, 1, 2);
+       RNA_def_property_ui_text(prop, "Max Edge Length", "Maximum contour edge length");
+       RNA_def_property_update(prop, NC_SCENE, NULL);
+
+       prop= RNA_def_property(srna, "edge_max_error", PROP_FLOAT, PROP_NONE);
+       RNA_def_property_float_sdna(prop, NULL, "edgemaxerror");
+       RNA_def_property_ui_range(prop, 0.1, 3.0, 1, 2);
+       RNA_def_property_ui_text(prop, "Max Edge Error", "Maximum distance error from contour to cells");
+       RNA_def_property_update(prop, NC_SCENE, NULL);
+
+       prop= RNA_def_property(srna, "verts_per_poly", PROP_INT, PROP_NONE);
+       RNA_def_property_int_sdna(prop, NULL, "vertsperpoly");
+       RNA_def_property_ui_range(prop, 3, 12, 1, 0);
+       RNA_def_property_ui_text(prop, "Verts Per Poly", "Max number of vertices per polygon");
+       RNA_def_property_update(prop, NC_SCENE, NULL);
+
+       prop= RNA_def_property(srna, "sample_dist", PROP_FLOAT, PROP_NONE);
+       RNA_def_property_float_sdna(prop, NULL, "detailsampledist");
+       RNA_def_property_ui_range(prop, 0.0, 16.0, 1, 2);
+       RNA_def_property_ui_text(prop, "Sample Distance", "Detail mesh sample spacing");
+       RNA_def_property_update(prop, NC_SCENE, NULL);
+
+       prop= RNA_def_property(srna, "sample_max_error", PROP_FLOAT, PROP_NONE);
+       RNA_def_property_float_sdna(prop, NULL, "detailsamplemaxerror");
+       RNA_def_property_ui_range(prop, 0.0, 16.0, 1, 2);
+       RNA_def_property_ui_text(prop, "Max Sample Error", "Detail mesh simplification max sample error");
+       RNA_def_property_update(prop, NC_SCENE, NULL);
+}
+
 static void rna_def_scene_game_data(BlenderRNA *brna)
 {
        StructRNA *srna;
@@ -1713,6 +1811,12 @@ static void rna_def_scene_game_data(BlenderRNA *brna)
                {GAME_MAT_GLSL, "GLSL", 0, "GLSL", "OpenGL shading language shaders"},
                {0, NULL, 0, NULL, NULL}};
 
+       static EnumPropertyItem obstacle_simulation_items[] = {
+               {OBSTSIMULATION_NONE, "NONE", 0, "None", ""},
+               {OBSTSIMULATION_TOI_rays, "RVO (rays)", 0, "RVO (rays)", ""},
+               {OBSTSIMULATION_TOI_cells, "RVO (cells)", 0, "RVO (cells)", ""},
+               {0, NULL, 0, NULL, NULL}};
+
        srna= RNA_def_struct(brna, "SceneGameData", NULL);
        RNA_def_struct_sdna(srna, "GameData");
        RNA_def_struct_nested(brna, srna, "Scene");
@@ -1919,6 +2023,10 @@ static void rna_def_scene_game_data(BlenderRNA *brna)
        prop= RNA_def_property(srna, "use_auto_start", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_funcs(prop, "rna_GameSettings_auto_start_get", "rna_GameSettings_auto_start_set");
        RNA_def_property_ui_text(prop, "Auto Start", "Automatically start game at load time");
+
+       prop= RNA_def_property(srna, "restrict_animation_updates", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_sdna(prop, NULL, "flag", GAME_RESTRICT_ANIM_UPDATES);
+       RNA_def_property_ui_text(prop, "Restrict Animation Updates", "Restrict the number of animation updates to the animation FPS. This is better for performance, but can cause issues with smooth playback.");
        
        /* materials */
        prop= RNA_def_property(srna, "material_mode", PROP_ENUM, PROP_NONE);
@@ -1961,6 +2069,33 @@ static void rna_def_scene_game_data(BlenderRNA *brna)
        RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", GAME_GLSL_NO_EXTRA_TEX);
        RNA_def_property_ui_text(prop, "GLSL Extra Textures", "Use extra textures like normal or specular maps for GLSL rendering");
        RNA_def_property_update(prop, NC_SCENE|NA_EDITED, "rna_Scene_glsl_update");
+
+       /* obstacle simulation */
+       prop= RNA_def_property(srna, "obstacle_simulation", PROP_ENUM, PROP_NONE);
+       RNA_def_property_enum_sdna(prop, NULL, "obstacleSimulation");
+       RNA_def_property_enum_items(prop, obstacle_simulation_items);
+       RNA_def_property_ui_text(prop, "Obstacle simulation", "Simulation used for obstacle avoidance in the game engine");
+       RNA_def_property_update(prop, NC_SCENE, NULL);
+
+       prop= RNA_def_property(srna, "level_height", PROP_FLOAT, PROP_ACCELERATION);
+       RNA_def_property_float_sdna(prop, NULL, "levelHeight");
+       RNA_def_property_range(prop, 0.0f, 200.0f);
+       RNA_def_property_ui_text(prop, "Level height", "Max difference in heights of obstacles to enable their interaction");
+       RNA_def_property_update(prop, NC_SCENE, NULL);
+
+       prop= RNA_def_property(srna, "show_obstacle_simulation", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_sdna(prop, NULL, "flag", GAME_SHOW_OBSTACLE_SIMULATION);
+       RNA_def_property_ui_text(prop, "Visualization", "Enable debug visualization for obstacle simulation");
+
+       /* Recast Settings */
+       prop= RNA_def_property(srna, "recast_data", PROP_POINTER, PROP_NONE);
+       RNA_def_property_flag(prop, PROP_NEVER_NULL);
+       RNA_def_property_pointer_sdna(prop, NULL, "recastData");
+       RNA_def_property_struct_type(prop, "SceneGameRecastData");
+       RNA_def_property_ui_text(prop, "Recast Data", "");
+
+       /* Nestled Data  */
+       rna_def_scene_game_recast_data(brna);
 }
 
 static void rna_def_scene_render_layer(BlenderRNA *brna)
@@ -1997,7 +2132,7 @@ static void rna_def_render_layers(BlenderRNA *brna, PropertyRNA *cprop)
        prop= RNA_def_property(srna, "active", PROP_POINTER, PROP_UNSIGNED);
        RNA_def_property_struct_type(prop, "SceneRenderLayer");
        RNA_def_property_pointer_funcs(prop, "rna_RenderSettings_active_layer_get", "rna_RenderSettings_active_layer_set", NULL, NULL);
-       RNA_def_property_flag(prop, PROP_EDITABLE);
+       RNA_def_property_flag(prop, PROP_EDITABLE|PROP_NEVER_NULL);
        RNA_def_property_ui_text(prop, "Active Render Layer", "Active Render Layer");
        RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
 
@@ -2023,13 +2158,7 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
                {R_ALPHAPREMUL, "PREMUL", 0, "Premultiplied", "Transparent RGB pixels are multiplied by the alpha channel"},
                {R_ALPHAKEY, "STRAIGHT", 0, "Straight Alpha", "Transparent RGB and alpha pixels are unmodified"},
                {0, NULL, 0, NULL, NULL}};
-               
-       static EnumPropertyItem color_mode_items[] ={
-               {R_PLANESBW, "BW", 0, "BW", "Images get saved in 8 bits grayscale (only PNG, JPEG, TGA, TIF)"},
-               {R_PLANES24, "RGB", 0, "RGB", "Images are saved with RGB (color) data"},
-               {R_PLANES32, "RGBA", 0, "RGBA", "Images are saved with RGB and Alpha data (if supported)"},
-               {0, NULL, 0, NULL, NULL}};
-       
+
        static EnumPropertyItem display_mode_items[] ={
                {R_OUTPUT_SCREEN, "SCREEN", 0, "Full Screen", "Images are rendered in full Screen"},
                {R_OUTPUT_AREA, "AREA", 0, "Image Editor", "Images are rendered in Image Editor"},
@@ -2165,14 +2294,6 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
 #endif
 
 #ifdef WITH_FFMPEG
-       static EnumPropertyItem audio_channel_items[] = {
-               {1, "MONO", 0, "Mono", "Set audio channels to mono"},
-               {2, "STEREO", 0, "Stereo", "Set audio channels to stereo"},
-               {4, "SURROUND4", 0, "4 Channels", "Set audio channels to 4 channels"},
-               {6, "SURROUND51", 0, "5.1 Surround", "Set audio channels to 5.1 surround sound"},
-               {8, "SURROUND71", 0, "7.1 Surround", "Set audio channels to 7.1 surround sound"},
-               {0, NULL, 0, NULL, NULL}};
-
        static EnumPropertyItem ffmpeg_format_items[] = {
                {FFMPEG_MPEG1, "MPEG1", 0, "MPEG-1", ""},
                {FFMPEG_MPEG2, "MPEG2", 0, "MPEG-2", ""},
@@ -2214,6 +2335,14 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
                {0, NULL, 0, NULL, NULL}};
 #endif
 
+       static EnumPropertyItem audio_channel_items[] = {
+               {1, "MONO", 0, "Mono", "Set audio channels to mono"},
+               {2, "STEREO", 0, "Stereo", "Set audio channels to stereo"},
+               {4, "SURROUND4", 0, "4 Channels", "Set audio channels to 4 channels"},
+               {6, "SURROUND51", 0, "5.1 Surround", "Set audio channels to 5.1 surround sound"},
+               {8, "SURROUND71", 0, "7.1 Surround", "Set audio channels to 7.1 surround sound"},
+               {0, NULL, 0, NULL, NULL}};
+
        static EnumPropertyItem engine_items[] = {
                {0, "BLENDER_RENDER", 0, "Blender Render", "Use the Blender internal rendering engine for rendering"},
                {0, NULL, 0, NULL, NULL}};
@@ -2226,7 +2355,7 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
        
        prop= RNA_def_property(srna, "color_mode", PROP_ENUM, PROP_NONE);
        RNA_def_property_enum_bitflag_sdna(prop, NULL, "planes");
-       RNA_def_property_enum_items(prop, color_mode_items);
+       RNA_def_property_enum_items(prop, image_color_mode_items);
        RNA_def_property_ui_text(prop, "Color Mode", "Choose BW for saving greyscale images, RGB for saving red, green and blue channels, AND RGBA for saving red, green, blue + alpha channels");
        RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
 
@@ -2496,26 +2625,27 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
        RNA_def_property_ui_text(prop, "Bitrate", "Audio bitrate(kb/s)");
        RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
        
-       prop= RNA_def_property(srna, "ffmpeg_audio_mixrate", PROP_INT, PROP_NONE);
-       RNA_def_property_int_sdna(prop, NULL, "ffcodecdata.audio_mixrate");
-       RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
-       RNA_def_property_range(prop, 8000, 192000);
-       RNA_def_property_ui_text(prop, "Samplerate", "Audio samplerate(samples/s)");
-       RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
-
        prop= RNA_def_property(srna, "ffmpeg_audio_volume", PROP_FLOAT, PROP_NONE);
        RNA_def_property_float_sdna(prop, NULL, "ffcodecdata.audio_volume");
        RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
        RNA_def_property_range(prop, 0.0f, 1.0f);
        RNA_def_property_ui_text(prop, "Volume", "Audio volume");
        RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
+#endif
+
+       // the following two "ffmpeg" settings are general audio settings
+       prop= RNA_def_property(srna, "ffmpeg_audio_mixrate", PROP_INT, PROP_NONE);
+       RNA_def_property_int_sdna(prop, NULL, "ffcodecdata.audio_mixrate");
+       RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+       RNA_def_property_range(prop, 8000, 192000);
+       RNA_def_property_ui_text(prop, "Samplerate", "Audio samplerate(samples/s)");
+       RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
 
        prop= RNA_def_property(srna, "ffmpeg_audio_channels", PROP_ENUM, PROP_NONE);
        RNA_def_property_enum_sdna(prop, NULL, "ffcodecdata.audio_channels");
        RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
        RNA_def_property_enum_items(prop, audio_channel_items);
        RNA_def_property_ui_text(prop, "Audio Channels", "Sets the audio channel count");
-#endif
 
        prop= RNA_def_property(srna, "fps", PROP_INT, PROP_NONE);
        RNA_def_property_int_sdna(prop, NULL, "frs_sec");
@@ -3293,7 +3423,6 @@ void RNA_def_scene(BlenderRNA *brna)
        RNA_def_property_range(prop, MINAFRAME, MAXFRAME);
        RNA_def_property_int_funcs(prop, NULL, "rna_Scene_current_frame_set", NULL);
        RNA_def_property_ui_text(prop, "Current Frame", "Current Frame, to update animation data from python frame_set() instead");
-       RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE);
        RNA_def_property_update(prop, NC_SCENE|ND_FRAME, "rna_Scene_frame_update");
        
        prop= RNA_def_property(srna, "frame_subframe", PROP_FLOAT, PROP_TIME);
@@ -3512,6 +3641,7 @@ void RNA_def_scene(BlenderRNA *brna)
        RNA_def_property_flag(prop, PROP_EDITABLE);
        RNA_def_property_struct_type(prop, "GreasePencil");
        RNA_def_property_ui_text(prop, "Grease Pencil Data", "Grease Pencil datablock");
+       RNA_def_property_update(prop, NC_SCENE, NULL);
        
        /* Transform Orientations */
        prop= RNA_def_property(srna, "orientations", PROP_COLLECTION, PROP_NONE);