diff options
author | Joerg Mueller <nexyon@gmail.com> | 2011-08-01 15:44:20 +0400 |
---|---|---|
committer | Joerg Mueller <nexyon@gmail.com> | 2011-08-01 15:44:20 +0400 |
commit | 3e85ec432ef050563d75488eca3049b77497153d (patch) | |
tree | 147c765f8b099b0d525c5e55ccc6a70995632509 /source/blender/blenkernel | |
parent | f3c867c3dbde6919653e7cc712099e48b7508715 (diff) |
3D Audio GSoC:
Adds new speaker object type.
Notes:
* Needs some nice icons
* Quickily review by Joshua Leung (5 mins)
* Properties UI updated (with help of Thomans Dinges)
* Speakers have their own theme color
* No real audio functionality yet.
* Minor bug regarding lamps/lattices fixed in interface_templates.c
I personality tested:
* Creation, Deletion, Duplication
* Saving, Loading
* Library linking (incl. make local)
* Tracking
* Dope Sheet, Outliner
* Animation
* Drawing (incl. Theme)
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r-- | source/blender/blenkernel/BKE_main.h | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_object.h | 5 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/anim_sys.c | 14 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/depsgraph.c | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/idcode.c | 3 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/library.c | 18 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/object.c | 99 |
7 files changed, 136 insertions, 6 deletions
diff --git a/source/blender/blenkernel/BKE_main.h b/source/blender/blenkernel/BKE_main.h index df6a304f0b3..c25882d1dd6 100644 --- a/source/blender/blenkernel/BKE_main.h +++ b/source/blender/blenkernel/BKE_main.h @@ -77,6 +77,7 @@ typedef struct Main { ListBase script; ListBase vfont; ListBase text; + ListBase speaker; ListBase sound; ListBase group; ListBase armature; diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h index a6b5c04b5c3..f9e01a524ab 100644 --- a/source/blender/blenkernel/BKE_object.h +++ b/source/blender/blenkernel/BKE_object.h @@ -88,6 +88,11 @@ void make_local_lamp(struct Lamp *la); void free_camera(struct Camera *ca); void free_lamp(struct Lamp *la); +void *add_speaker(const char *name); +struct Speaker *copy_speaker(struct Speaker *spk); +void make_local_speaker(struct Speaker *spk); +void free_speaker(struct Speaker *spk); + struct Object *add_only_object(int type, const char *name); struct Object *add_object(struct Scene *scene, int type); diff --git a/source/blender/blenkernel/intern/anim_sys.c b/source/blender/blenkernel/intern/anim_sys.c index a3d0377b196..a43cdc8143e 100644 --- a/source/blender/blenkernel/intern/anim_sys.c +++ b/source/blender/blenkernel/intern/anim_sys.c @@ -85,6 +85,7 @@ short id_type_can_have_animdata (ID *id) case ID_PA: case ID_MA: case ID_TE: case ID_NT: case ID_LA: case ID_CA: case ID_WO: + case ID_SPK: case ID_SCE: { return 1; @@ -787,7 +788,10 @@ void BKE_animdata_main_cb (Main *mainptr, ID_AnimData_Edit_Callback func, void * /* particles */ ANIMDATA_IDS_CB(mainptr->particle.first); - + + /* speakers */ + ANIMDATA_IDS_CB(mainptr->speaker.first); + /* objects */ ANIMDATA_IDS_CB(mainptr->object.first); @@ -865,7 +869,10 @@ void BKE_all_animdata_fix_paths_rename (char *prefix, char *oldName, char *newNa /* particles */ RENAMEFIX_ANIM_IDS(mainptr->particle.first); - + + /* speakers */ + RENAMEFIX_ANIM_IDS(mainptr->speaker.first); + /* objects */ RENAMEFIX_ANIM_IDS(mainptr->object.first); @@ -2309,6 +2316,9 @@ void BKE_animsys_evaluate_all_animation (Main *main, Scene *scene, float ctime) /* particles */ EVAL_ANIM_IDS(main->particle.first, ADT_RECALC_ANIM); + /* lamps */ + EVAL_ANIM_IDS(main->speaker.first, ADT_RECALC_ANIM); + /* objects */ /* ADT_RECALC_ANIM doesn't need to be supplied here, since object AnimData gets * this tagged by Depsgraph on framechange. This optimisation means that objects diff --git a/source/blender/blenkernel/intern/depsgraph.c b/source/blender/blenkernel/intern/depsgraph.c index e14983a91a5..6083151f23f 100644 --- a/source/blender/blenkernel/intern/depsgraph.c +++ b/source/blender/blenkernel/intern/depsgraph.c @@ -2383,7 +2383,7 @@ static void dag_id_flush_update(Scene *sce, ID *id) if(id) { idtype= GS(id->name); - if(ELEM7(idtype, ID_ME, ID_CU, ID_MB, ID_LA, ID_LT, ID_CA, ID_AR)) { + if(ELEM8(idtype, ID_ME, ID_CU, ID_MB, ID_LA, ID_LT, ID_CA, ID_AR, ID_SPK)) { for(obt=bmain->object.first; obt; obt= obt->id.next) { if(!(ob && obt == ob) && obt->data == id) { obt->recalc |= OB_RECALC_DATA; diff --git a/source/blender/blenkernel/intern/idcode.c b/source/blender/blenkernel/intern/idcode.c index 8c8a693e6e7..e84a2a04ded 100644 --- a/source/blender/blenkernel/intern/idcode.c +++ b/source/blender/blenkernel/intern/idcode.c @@ -73,7 +73,8 @@ static IDType idtypes[]= { { ID_SCE, "Scene", "scenes", IDTYPE_FLAGS_ISLINKABLE}, { ID_SCR, "Screen", "screens", 0}, { ID_SEQ, "Sequence", "sequences", 0}, /* not actually ID data */ - { ID_SO, "Sound", "sounds", IDTYPE_FLAGS_ISLINKABLE}, + { ID_SPK, "Speaker", "speakers", IDTYPE_FLAGS_ISLINKABLE}, + { ID_SO, "Sound", "sounds", IDTYPE_FLAGS_ISLINKABLE}, { ID_TE, "Texture", "textures", IDTYPE_FLAGS_ISLINKABLE}, { ID_TXT, "Text", "texts", IDTYPE_FLAGS_ISLINKABLE}, { ID_VF, "VFont", "fonts", IDTYPE_FLAGS_ISLINKABLE}, diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c index a5da248a0eb..85f87992c28 100644 --- a/source/blender/blenkernel/intern/library.c +++ b/source/blender/blenkernel/intern/library.c @@ -65,6 +65,7 @@ #include "DNA_node_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" +#include "DNA_speaker_types.h" #include "DNA_sound_types.h" #include "DNA_text_types.h" #include "DNA_vfont_types.h" @@ -207,6 +208,9 @@ int id_make_local(ID *id, int test) case ID_CA: if(!test) make_local_camera((Camera*)id); return 1; + case ID_SPK: + if(!test) make_local_speaker((Speaker*)id); + return 1; case ID_IP: return 0; /* deprecated */ case ID_KE: @@ -289,6 +293,9 @@ int id_copy(ID *id, ID **newid, int test) case ID_LA: if(!test) *newid= (ID*)copy_lamp((Lamp*)id); return 1; + case ID_SPK: + if(!test) *newid= (ID*)copy_speaker((Speaker*)id); + return 1; case ID_CA: if(!test) *newid= (ID*)copy_camera((Camera*)id); return 1; @@ -439,6 +446,8 @@ ListBase *which_libbase(Main *mainlib, short type) return &(mainlib->text); case ID_SCRIPT: return &(mainlib->script); + case ID_SPK: + return &(mainlib->speaker); case ID_SO: return &(mainlib->sound); case ID_GR: @@ -523,7 +532,8 @@ int set_listbasepointers(Main *main, ListBase **lb) lb[a++]= &(main->latt); lb[a++]= &(main->lamp); lb[a++]= &(main->camera); - + lb[a++]= &(main->speaker); + lb[a++]= &(main->text); lb[a++]= &(main->sound); lb[a++]= &(main->group); @@ -615,6 +625,9 @@ static ID *alloc_libblock_notest(short type) case ID_SCRIPT: //XXX id= MEM_callocN(sizeof(Script), "script"); break; + case ID_SPK: + id= MEM_callocN(sizeof(Speaker), "speaker"); + break; case ID_SO: id= MEM_callocN(sizeof(bSound), "sound"); break; @@ -818,6 +831,9 @@ void free_libblock(ListBase *lb, void *idv) case ID_SCRIPT: //XXX free_script((Script *)id); break; + case ID_SPK: + free_speaker((Speaker *)id); + break; case ID_SO: sound_free((bSound*)id); break; diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index 862d583bd34..66bf4ea208b 100644 --- a/source/blender/blenkernel/intern/object.c +++ b/source/blender/blenkernel/intern/object.c @@ -54,7 +54,9 @@ #include "DNA_scene_types.h" #include "DNA_screen_types.h" #include "DNA_sequence_types.h" +#include "DNA_sound_types.h" #include "DNA_space_types.h" +#include "DNA_speaker_types.h" #include "DNA_view3d_types.h" #include "DNA_world_types.h" @@ -975,6 +977,99 @@ void free_lamp(Lamp *la) la->id.icon_id = 0; } +void *add_speaker(const char *name) +{ + Speaker *spk; + + spk= alloc_libblock(&G.main->speaker, ID_SPK, name); + + spk->attenuation = 1.0f; + spk->cone_angle_inner = 360.0f; + spk->cone_angle_outer = 360.0f; + spk->cone_volume_outer = 1.0f; + spk->distance_max = FLT_MAX; + spk->distance_reference = 1.0f; + spk->flag = 0; + spk->pitch = 1.0f; + spk->sound = NULL; + spk->volume = 1.0f; + spk->volume_max = 1.0f; + spk->volume_min = 0.0f; + + return spk; +} + +Speaker *copy_speaker(Speaker *spk) +{ + Speaker *spkn; + + spkn= copy_libblock(spk); + if(spkn->sound) + spkn->sound->id.us++; + + return spkn; +} + +void make_local_speaker(Speaker *spk) +{ + Main *bmain= G.main; + Object *ob; + int local=0, lib=0; + + /* - only lib users: do nothing + * - only local users: set flag + * - mixed: make copy + */ + + if(spk->id.lib==NULL) return; + if(spk->id.us==1) { + spk->id.lib= NULL; + spk->id.flag= LIB_LOCAL; + new_id(&bmain->speaker, (ID *)spk, NULL); + return; + } + + ob= bmain->object.first; + while(ob) { + if(ob->data==spk) { + if(ob->id.lib) lib= 1; + else local= 1; + } + ob= ob->id.next; + } + + if(local && lib==0) { + spk->id.lib= NULL; + spk->id.flag= LIB_LOCAL; + new_id(&bmain->speaker, (ID *)spk, NULL); + } + else if(local && lib) { + Speaker *spkn= copy_speaker(spk); + spkn->id.us= 0; + + ob= bmain->object.first; + while(ob) { + if(ob->data==spk) { + + if(ob->id.lib==NULL) { + ob->data= spkn; + spkn->id.us++; + spk->id.us--; + } + } + ob= ob->id.next; + } + } +} + +void free_speaker(Speaker *spk) +{ + if(spk->sound) + spk->sound->id.us--; + + BKE_free_animdata((ID *)spk); +} + /* *************************************************** */ static void *add_obdata_from_type(int type) @@ -989,6 +1084,7 @@ static void *add_obdata_from_type(int type) case OB_LAMP: return add_lamp("Lamp"); case OB_LATTICE: return add_lattice("Lattice"); case OB_ARMATURE: return add_armature("Armature"); + case OB_SPEAKER: return add_speaker("Speaker"); case OB_EMPTY: return NULL; default: printf("add_obdata_from_type: Internal error, bad type: %d\n", type); @@ -1008,6 +1104,7 @@ static const char *get_obdata_defname(int type) case OB_LAMP: return "Lamp"; case OB_LATTICE: return "Lattice"; case OB_ARMATURE: return "Armature"; + case OB_SPEAKER: return "Speaker"; case OB_EMPTY: return "Empty"; default: printf("get_obdata_defname: Internal error, bad type: %d\n", type); @@ -1051,7 +1148,7 @@ Object *add_only_object(int type, const char *name) ob->empty_drawtype= OB_PLAINAXES; ob->empty_drawsize= 1.0; - if(type==OB_CAMERA || type==OB_LAMP) { + if(type==OB_CAMERA || type==OB_LAMP || type==OB_SPEAKER) { ob->trackflag= OB_NEGZ; ob->upflag= OB_POSY; } |