Previously fluid simulation and Alembic modifiers had a dedicated function to query the velocity for motion blur. Now use a more generic system where those modifiers output a velocity attribute. Advantages: * Geometry and particle nodes can output velocity through the same mechanism, or read the attribute coming from earlier modifiers. * The velocity can be preserved through modifiers like subdivision surface or auto smooth. * USD and Alembic previously only output velocity from fluid simulation, now they work with velocity from other sources too. * Simplifies the code for renderers like Cycles and exporters like Alembic and USD. This breaks compatibility: * External renderers and exporters accessing these velocities through the Python API now need to use the attribute instead. * Existing modifier node setups that create an attribute named "velocity" will render differently with motion blur. Differential Revision: https://developer.blender.org/D12305
141 lines
4.3 KiB
C++
141 lines
4.3 KiB
C++
/*
|
|
* 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.
|
|
*/
|
|
#pragma once
|
|
|
|
/** \file
|
|
* \ingroup balembic
|
|
*/
|
|
|
|
#include "DEG_depsgraph.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
struct CacheArchiveHandle;
|
|
struct CacheReader;
|
|
struct ListBase;
|
|
struct Main;
|
|
struct Mesh;
|
|
struct Object;
|
|
struct Scene;
|
|
struct bContext;
|
|
|
|
int ABC_get_version(void);
|
|
|
|
struct AlembicExportParams {
|
|
double frame_start;
|
|
double frame_end;
|
|
|
|
unsigned int frame_samples_xform;
|
|
unsigned int frame_samples_shape;
|
|
|
|
double shutter_open;
|
|
double shutter_close;
|
|
|
|
bool selected_only;
|
|
bool uvs;
|
|
bool normals;
|
|
bool vcolors;
|
|
bool orcos;
|
|
bool apply_subdiv;
|
|
bool curves_as_mesh;
|
|
bool flatten_hierarchy;
|
|
bool visible_objects_only;
|
|
bool face_sets;
|
|
bool use_subdiv_schema;
|
|
bool packuv;
|
|
bool triangulate;
|
|
bool export_hair;
|
|
bool export_particles;
|
|
bool export_custom_properties;
|
|
bool use_instancing;
|
|
enum eEvaluationMode evaluation_mode;
|
|
|
|
/* See MOD_TRIANGULATE_NGON_xxx and MOD_TRIANGULATE_QUAD_xxx
|
|
* in DNA_modifier_types.h */
|
|
int quad_method;
|
|
int ngon_method;
|
|
|
|
float global_scale;
|
|
};
|
|
|
|
/* The ABC_export and ABC_import functions both take a as_background_job
|
|
* parameter, and return a boolean.
|
|
*
|
|
* When as_background_job=true, returns false immediately after scheduling
|
|
* a background job.
|
|
*
|
|
* When as_background_job=false, performs the export synchronously, and returns
|
|
* true when the export was ok, and false if there were any errors.
|
|
*/
|
|
|
|
bool ABC_export(struct Scene *scene,
|
|
struct bContext *C,
|
|
const char *filepath,
|
|
const struct AlembicExportParams *params,
|
|
bool as_background_job);
|
|
|
|
bool ABC_import(struct bContext *C,
|
|
const char *filepath,
|
|
float scale,
|
|
bool is_sequence,
|
|
bool set_frame_range,
|
|
int sequence_len,
|
|
int offset,
|
|
bool validate_meshes,
|
|
bool always_add_cache_reader,
|
|
bool as_background_job);
|
|
|
|
struct CacheArchiveHandle *ABC_create_handle(struct Main *bmain,
|
|
const char *filename,
|
|
struct ListBase *object_paths);
|
|
|
|
void ABC_free_handle(struct CacheArchiveHandle *handle);
|
|
|
|
void ABC_get_transform(struct CacheReader *reader,
|
|
float r_mat_world[4][4],
|
|
float time,
|
|
float scale);
|
|
|
|
/* Either modifies existing_mesh in-place or constructs a new mesh. */
|
|
struct Mesh *ABC_read_mesh(struct CacheReader *reader,
|
|
struct Object *ob,
|
|
struct Mesh *existing_mesh,
|
|
const float time,
|
|
const char **err_str,
|
|
const int read_flags,
|
|
const char *velocity_name,
|
|
const float velocity_scale);
|
|
|
|
bool ABC_mesh_topology_changed(struct CacheReader *reader,
|
|
struct Object *ob,
|
|
struct Mesh *existing_mesh,
|
|
const float time,
|
|
const char **err_str);
|
|
|
|
void ABC_CacheReader_incref(struct CacheReader *reader);
|
|
void ABC_CacheReader_free(struct CacheReader *reader);
|
|
|
|
struct CacheReader *CacheReader_open_alembic_object(struct CacheArchiveHandle *handle,
|
|
struct CacheReader *reader,
|
|
struct Object *object,
|
|
const char *object_path);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|