| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- // ======================================================================== //
- // Copyright 2009-2017 Intel Corporation //
- // //
- // Licensed under the Apache License, Version 2.0 (the "License"); //
- // you may not use this file except in compliance with the License. //
- // You may obtain a copy of the License at //
- // //
- // http://www.apache.org/licenses/LICENSE-2.0 //
- // //
- // Unless required by applicable law or agreed to in writing, software //
- // distributed under the License is distributed on an "AS IS" BASIS, //
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //
- // See the License for the specific language governing permissions and //
- // limitations under the License. //
- // ======================================================================== //
- #include "scene_geometry_instance.h"
- #include "scene.h"
- namespace embree
- {
- GeometryInstance::GeometryInstance (Scene* parent, Geometry* geom)
- : Geometry(parent,Type(geom->type | INSTANCE), 1, geom->numTimeSteps, geom->flags), local2world(one), world2local(one), geom(geom)
- {
- enabling();
- }
- void GeometryInstance::count(ssize_t f)
- {
- if (geom->numTimeSteps == 1)
- {
- switch (geom->type) {
- case TRIANGLE_MESH: parent->instanced.numTriangles += f*ssize_t(geom->size()); break;
- case USER_GEOMETRY: parent->instanced.numUserGeometries += f*ssize_t(geom->size()); break;
- case BEZIER_CURVES: parent->instanced.numBezierCurves += f*ssize_t(geom->size()); break;
- case SUBDIV_MESH : parent->instanced.numSubdivPatches += f*ssize_t(geom->size()); break;
- default : throw_RTCError(RTC_INVALID_OPERATION,"cannot instantiate this geometry ");
- };
- }
- else
- {
- switch (geom->type) {
- case TRIANGLE_MESH: parent->instancedMB.numTriangles += f*ssize_t(geom->size()); break;
- case USER_GEOMETRY: parent->instancedMB.numUserGeometries += f*ssize_t(geom->size()); break;
- case BEZIER_CURVES: parent->instancedMB.numBezierCurves += f*ssize_t(geom->size()); break;
- case SUBDIV_MESH : parent->instancedMB.numSubdivPatches += f*ssize_t(geom->size()); break;
- default : throw_RTCError(RTC_INVALID_OPERATION,"cannot instantiate this geometry");
- };
- }
- }
- void GeometryInstance::enabling ()
- {
- geom->used++;
- count(+1);
- }
- void GeometryInstance::disabling()
- {
- geom->used--;
- count(-1);
- }
-
- void GeometryInstance::setMask (unsigned mask)
- {
- if (parent->isStatic() && parent->isBuild())
- throw_RTCError(RTC_INVALID_OPERATION,"static scenes cannot get modified");
- this->mask = mask;
- Geometry::update();
- }
- void GeometryInstance::setTransform(const AffineSpace3fa& xfm, size_t timeStep)
- {
- if (parent->isStatic() && parent->isBuild())
- throw_RTCError(RTC_INVALID_OPERATION,"static scenes cannot get modified");
- if (timeStep != 0)
- throw_RTCError(RTC_INVALID_OPERATION,"geometry instances only support a single timestep");
- local2world = xfm;
- world2local = rcp(xfm);
- }
- }
|