| 
									
										
										
										
											2020-04-20 10:37:38 +02:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * This program is free software; you can redistribute it and/or | 
					
						
							|  |  |  |  * modify it under the terms of the GNU General Public License | 
					
						
							|  |  |  |  * as published by the Free Software Foundation; either version 2 | 
					
						
							|  |  |  |  * of the License, or (at your option) any later version. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program is distributed in the hope that it will be useful, | 
					
						
							|  |  |  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  |  * GNU General Public License for more details. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * You should have received a copy of the GNU General Public License | 
					
						
							|  |  |  |  * along with this program; if not, write to the Free Software Foundation, | 
					
						
							|  |  |  |  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** \file
 | 
					
						
							|  |  |  |  * \ingroup bke | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-25 12:23:03 +02:00
										 |  |  | #include <iostream>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-20 10:37:38 +02:00
										 |  |  | #include "MEM_guardedalloc.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "DNA_ID.h"
 | 
					
						
							|  |  |  | #include "DNA_defaults.h"
 | 
					
						
							| 
									
										
										
										
											2020-05-13 12:39:17 +02:00
										 |  |  | #include "DNA_scene_types.h"
 | 
					
						
							| 
									
										
										
										
											2020-04-20 10:37:38 +02:00
										 |  |  | #include "DNA_simulation_types.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "BLI_compiler_compat.h"
 | 
					
						
							| 
									
										
										
										
											2020-06-08 15:41:41 +02:00
										 |  |  | #include "BLI_float3.hh"
 | 
					
						
							| 
									
										
										
										
											2020-04-20 10:37:38 +02:00
										 |  |  | #include "BLI_listbase.h"
 | 
					
						
							|  |  |  | #include "BLI_math.h"
 | 
					
						
							| 
									
										
										
										
											2020-07-09 15:40:27 +02:00
										 |  |  | #include "BLI_rand.h"
 | 
					
						
							| 
									
										
										
										
											2020-06-09 11:58:47 +02:00
										 |  |  | #include "BLI_span.hh"
 | 
					
						
							| 
									
										
										
										
											2020-04-20 10:37:38 +02:00
										 |  |  | #include "BLI_string.h"
 | 
					
						
							|  |  |  | #include "BLI_utildefines.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "BKE_anim_data.h"
 | 
					
						
							|  |  |  | #include "BKE_animsys.h"
 | 
					
						
							| 
									
										
										
										
											2020-06-08 15:41:41 +02:00
										 |  |  | #include "BKE_customdata.h"
 | 
					
						
							| 
									
										
										
										
											2020-04-20 10:37:38 +02:00
										 |  |  | #include "BKE_idtype.h"
 | 
					
						
							|  |  |  | #include "BKE_lib_id.h"
 | 
					
						
							|  |  |  | #include "BKE_lib_query.h"
 | 
					
						
							|  |  |  | #include "BKE_lib_remap.h"
 | 
					
						
							|  |  |  | #include "BKE_main.h"
 | 
					
						
							| 
									
										
										
										
											2020-04-20 12:56:16 +02:00
										 |  |  | #include "BKE_node.h"
 | 
					
						
							| 
									
										
										
										
											2020-06-08 15:41:41 +02:00
										 |  |  | #include "BKE_pointcache.h"
 | 
					
						
							| 
									
										
										
										
											2020-04-20 10:37:38 +02:00
										 |  |  | #include "BKE_simulation.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-02 13:25:25 +01:00
										 |  |  | #include "NOD_geometry.h"
 | 
					
						
							| 
									
										
										
										
											2020-07-17 11:36:59 +02:00
										 |  |  | #include "NOD_node_tree_multi_function.hh"
 | 
					
						
							| 
									
										
										
										
											2020-04-20 12:56:16 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-22 14:16:08 +02:00
										 |  |  | #include "BLI_map.hh"
 | 
					
						
							| 
									
										
										
										
											2020-04-20 10:37:38 +02:00
										 |  |  | #include "BLT_translation.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-09 15:40:27 +02:00
										 |  |  | #include "FN_multi_function_network_evaluation.hh"
 | 
					
						
							|  |  |  | #include "FN_multi_function_network_optimization.hh"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-13 12:39:17 +02:00
										 |  |  | #include "DEG_depsgraph.h"
 | 
					
						
							| 
									
										
										
										
											2020-05-25 12:23:03 +02:00
										 |  |  | #include "DEG_depsgraph_query.h"
 | 
					
						
							| 
									
										
										
										
											2020-05-13 12:39:17 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-11 11:46:26 +02:00
										 |  |  | #include "BLO_read_write.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-20 10:37:38 +02:00
										 |  |  | static void simulation_init_data(ID *id) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   Simulation *simulation = (Simulation *)id; | 
					
						
							|  |  |  |   BLI_assert(MEMCMP_STRUCT_AFTER_IS_ZERO(simulation, id)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   MEMCPY_STRUCT_AFTER(simulation, DNA_struct_default_get(Simulation), id); | 
					
						
							| 
									
										
										
										
											2020-04-20 12:56:16 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-02 13:25:25 +01:00
										 |  |  |   bNodeTree *ntree = ntreeAddTree(nullptr, "Geometry Nodetree", ntreeType_Geometry->idname); | 
					
						
							| 
									
										
										
										
											2020-04-20 12:56:16 +02:00
										 |  |  |   simulation->nodetree = ntree; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void simulation_copy_data(Main *bmain, ID *id_dst, const ID *id_src, const int flag) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   Simulation *simulation_dst = (Simulation *)id_dst; | 
					
						
							| 
									
										
										
										
											2020-07-22 14:16:08 +02:00
										 |  |  |   const Simulation *simulation_src = (const Simulation *)id_src; | 
					
						
							| 
									
										
										
										
											2020-04-20 12:56:16 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |   /* We always need allocation of our private ID data. */ | 
					
						
							|  |  |  |   const int flag_private_id_data = flag & ~LIB_ID_CREATE_NO_ALLOCATE; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (simulation_src->nodetree) { | 
					
						
							|  |  |  |     BKE_id_copy_ex(bmain, | 
					
						
							|  |  |  |                    (ID *)simulation_src->nodetree, | 
					
						
							|  |  |  |                    (ID **)&simulation_dst->nodetree, | 
					
						
							|  |  |  |                    flag_private_id_data); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2020-07-09 15:40:27 +02:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2020-06-08 15:41:41 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-20 12:56:16 +02:00
										 |  |  | static void simulation_free_data(ID *id) | 
					
						
							| 
									
										
										
										
											2020-04-20 10:37:38 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2020-04-20 12:56:16 +02:00
										 |  |  |   Simulation *simulation = (Simulation *)id; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   BKE_animdata_free(&simulation->id, false); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (simulation->nodetree) { | 
					
						
							| 
									
										
										
										
											2020-04-20 16:14:45 +02:00
										 |  |  |     ntreeFreeEmbeddedTree(simulation->nodetree); | 
					
						
							| 
									
										
										
										
											2020-04-20 12:56:16 +02:00
										 |  |  |     MEM_freeN(simulation->nodetree); | 
					
						
							|  |  |  |     simulation->nodetree = nullptr; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2020-04-20 10:37:38 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-20 17:07:00 +02:00
										 |  |  | static void simulation_foreach_id(ID *id, LibraryForeachIDData *data) | 
					
						
							| 
									
										
										
										
											2020-04-20 10:37:38 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2020-05-20 17:07:00 +02:00
										 |  |  |   Simulation *simulation = (Simulation *)id; | 
					
						
							|  |  |  |   if (simulation->nodetree) { | 
					
						
							|  |  |  |     /* nodetree **are owned by IDs**, treat them as mere sub-data and not real ID! */ | 
					
						
							|  |  |  |     BKE_library_foreach_ID_embedded(data, (ID **)&simulation->nodetree); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2020-04-20 10:37:38 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-11 11:46:26 +02:00
										 |  |  | static void simulation_blend_write(BlendWriter *writer, ID *id, const void *id_address) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   Simulation *simulation = (Simulation *)id; | 
					
						
							|  |  |  |   if (simulation->id.us > 0 || BLO_write_is_undo(writer)) { | 
					
						
							|  |  |  |     BLO_write_id_struct(writer, Simulation, id_address, &simulation->id); | 
					
						
							|  |  |  |     BKE_id_blend_write(writer, &simulation->id); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (simulation->adt) { | 
					
						
							|  |  |  |       BKE_animdata_blend_write(writer, simulation->adt); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* nodetree is integral part of simulation, no libdata */ | 
					
						
							|  |  |  |     if (simulation->nodetree) { | 
					
						
							|  |  |  |       BLO_write_struct(writer, bNodeTree, simulation->nodetree); | 
					
						
							|  |  |  |       ntreeBlendWrite(writer, simulation->nodetree); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void simulation_blend_read_data(BlendDataReader *reader, ID *id) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   Simulation *simulation = (Simulation *)id; | 
					
						
							|  |  |  |   BLO_read_data_address(reader, &simulation->adt); | 
					
						
							|  |  |  |   BKE_animdata_blend_read_data(reader, simulation->adt); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void simulation_blend_read_lib(BlendLibReader *reader, ID *id) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   Simulation *simulation = (Simulation *)id; | 
					
						
							| 
									
										
										
										
											2020-10-20 12:07:42 +02:00
										 |  |  |   UNUSED_VARS(simulation, reader); | 
					
						
							| 
									
										
										
										
											2020-09-11 11:46:26 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void simulation_blend_read_expand(BlendExpander *expander, ID *id) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   Simulation *simulation = (Simulation *)id; | 
					
						
							| 
									
										
										
										
											2020-10-20 12:07:42 +02:00
										 |  |  |   UNUSED_VARS(simulation, expander); | 
					
						
							| 
									
										
										
										
											2020-09-11 11:46:26 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-20 10:37:38 +02:00
										 |  |  | IDTypeInfo IDType_ID_SIM = { | 
					
						
							|  |  |  |     /* id_code */ ID_SIM, | 
					
						
							|  |  |  |     /* id_filter */ FILTER_ID_SIM, | 
					
						
							|  |  |  |     /* main_listbase_index */ INDEX_ID_SIM, | 
					
						
							|  |  |  |     /* struct_size */ sizeof(Simulation), | 
					
						
							|  |  |  |     /* name */ "Simulation", | 
					
						
							|  |  |  |     /* name_plural */ "simulations", | 
					
						
							|  |  |  |     /* translation_context */ BLT_I18NCONTEXT_ID_SIMULATION, | 
					
						
							|  |  |  |     /* flags */ 0, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* init_data */ simulation_init_data, | 
					
						
							|  |  |  |     /* copy_data */ simulation_copy_data, | 
					
						
							| 
									
										
										
										
											2020-04-20 12:56:16 +02:00
										 |  |  |     /* free_data */ simulation_free_data, | 
					
						
							| 
									
										
										
										
											2020-04-20 11:22:46 +02:00
										 |  |  |     /* make_local */ nullptr, | 
					
						
							| 
									
										
										
										
											2020-05-20 17:07:00 +02:00
										 |  |  |     /* foreach_id */ simulation_foreach_id, | 
					
						
							| 
									
										
										
										
											2020-11-06 17:49:09 +01:00
										 |  |  |     /* foreach_cache */ nullptr, | 
					
						
							| 
									
										
										
										
											2021-02-25 10:17:31 +01:00
										 |  |  |     /* owner_get */ nullptr, | 
					
						
							| 
									
										
										
										
											2020-08-28 13:05:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-11 11:46:26 +02:00
										 |  |  |     /* blend_write */ simulation_blend_write, | 
					
						
							|  |  |  |     /* blend_read_data */ simulation_blend_read_data, | 
					
						
							|  |  |  |     /* blend_read_lib */ simulation_blend_read_lib, | 
					
						
							|  |  |  |     /* blend_read_expand */ simulation_blend_read_expand, | 
					
						
							| 
									
										
										
										
											2020-11-03 11:39:36 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-06 17:49:09 +01:00
										 |  |  |     /* blend_read_undo_preserve */ nullptr, | 
					
						
							| 
									
										
										
										
											2021-01-22 14:52:50 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /* lib_override_apply_post */ nullptr, | 
					
						
							| 
									
										
										
										
											2020-04-20 10:37:38 +02:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2020-05-13 12:39:17 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-20 17:07:00 +02:00
										 |  |  | void *BKE_simulation_add(Main *bmain, const char *name) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2020-10-08 12:50:04 +02:00
										 |  |  |   Simulation *simulation = (Simulation *)BKE_id_new(bmain, ID_SIM, name); | 
					
						
							| 
									
										
										
										
											2020-05-20 17:07:00 +02:00
										 |  |  |   return simulation; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-20 12:07:42 +02:00
										 |  |  | void BKE_simulation_data_update(Depsgraph *UNUSED(depsgraph), | 
					
						
							|  |  |  |                                 Scene *UNUSED(scene), | 
					
						
							|  |  |  |                                 Simulation *UNUSED(simulation)) | 
					
						
							| 
									
										
										
										
											2020-07-22 14:16:08 +02:00
										 |  |  | { | 
					
						
							|  |  |  | } |