[Bf-blender-cvs] [3d08be0] alembic_basic_io: Add support to import cameras.
Kévin Dietrich
noreply at git.blender.org
Tue Mar 29 06:30:01 CEST 2016
Commit: 3d08be0e2871d5a81d14a78b74d820aedb742c5e
Author: Kévin Dietrich
Date: Tue Mar 29 04:15:37 2016 +0200
Branches: alembic_basic_io
https://developer.blender.org/rB3d08be0e2871d5a81d14a78b74d820aedb742c5e
Add support to import cameras.
===================================================================
M source/blender/alembic/intern/alembic_capi.cc
===================================================================
diff --git a/source/blender/alembic/intern/alembic_capi.cc b/source/blender/alembic/intern/alembic_capi.cc
index d02d5d8..2ce75df 100644
--- a/source/blender/alembic/intern/alembic_capi.cc
+++ b/source/blender/alembic/intern/alembic_capi.cc
@@ -1375,6 +1375,67 @@ void ABC_set_camera(const char *filename, const char *abc_subobject, float time,
return;
}
+#include "BKE_camera.h"
+
+static Camera *ABC_get_camera(const char *filename, const char *abc_subobject, float time)
+{
+ bool found = false;
+
+ IArchive *archive = abc_manager->getArchive(filename);
+
+ if (!archive || !archive->valid()) {
+ std::cerr << "Warning : Camera Alembic archive doesn't exist " << filename << std::endl;
+ return NULL;
+ }
+
+ ICameraSchema cam_obj;
+ getCamera(archive->getTop(), cam_obj, abc_subobject, found);
+
+ if (!cam_obj.valid() || !found) {
+ std::cerr << "Warning: Corrupted Alembic archive " << filename << std::endl;
+ return NULL;
+ }
+
+ Camera *bcam = static_cast<Camera *>(BKE_camera_add(G.main, "abc_camera"));
+
+ ISampleSelector sample_sel(time);
+ CameraSample cam_sample;
+ cam_obj.get(cam_sample, sample_sel);
+
+ ICompoundProperty customDataContainer = cam_obj.getUserProperties();
+
+ if (customDataContainer.valid() && customDataContainer.getPropertyHeader("stereoDistance") &&
+ customDataContainer.getPropertyHeader("eyeSeparation")) {
+ Alembic::AbcGeom::IFloatProperty convergence_plane(customDataContainer, "stereoDistance");
+ Alembic::AbcGeom::IFloatProperty eye_separation(customDataContainer, "eyeSeparation");
+
+ bcam->stereo.interocular_distance = eye_separation.getValue(sample_sel);
+ bcam->stereo.convergence_distance = convergence_plane.getValue(sample_sel);;
+ }
+
+ float lens = cam_sample.getFocalLength();
+ float apperture_x = cam_sample.getHorizontalAperture();
+ float apperture_y = cam_sample.getVerticalAperture();
+ float h_film_offset = cam_sample.getHorizontalFilmOffset();
+ float v_film_offset = cam_sample.getVerticalFilmOffset();
+ float film_aspect = apperture_x / apperture_y;
+
+ bcam->lens = lens;
+ bcam->sensor_x = apperture_x * 10;
+ bcam->sensor_y = apperture_y * 10;
+ bcam->shiftx = h_film_offset / apperture_x;
+ bcam->shifty = v_film_offset / (apperture_y * film_aspect);
+ bcam->clipsta = cam_sample.getNearClippingPlane();
+ bcam->clipend = cam_sample.getFarClippingPlane();
+ bcam->gpu_dof.focus_distance = cam_sample.getFocusDistance();
+ bcam->gpu_dof.fstop = cam_sample.getFStop();
+ bcam->shifty = v_film_offset / apperture_y / film_aspect;
+ bcam->clipsta = cam_sample.getNearClippingPlane();
+ bcam->clipend = cam_sample.getFarClippingPlane();
+
+ return bcam;
+}
+
int ABC_export(Scene *sce, const char *filename,
double start, double end,
double xformstep, double geomstep,
@@ -1531,7 +1592,19 @@ static void import_object(bContext *C, const std::string &filename, const std::s
}
case OBJECT_TYPE_CAMERA:
{
- /* TODO */
+ ABC_mutex_lock();
+ Camera *camera = ABC_get_camera(filename.c_str(), sub_object.c_str(), 0.0f);
+ ABC_mutex_unlock();
+
+ if (!camera) {
+ return;
+ }
+
+ BLI_strncpy(camera->id.name + 2, data_name.c_str(), data_name.size() + 1);
+
+ ob = BKE_object_add(CTX_data_main(C), CTX_data_scene(C), OB_CAMERA, object_name.c_str());
+ ob->data = camera;
+
break;
}
}
More information about the Bf-blender-cvs
mailing list