forked from wesen/openvdb
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
7697967
commit 750006a
Showing
36 changed files
with
26,291 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,206 @@ | ||
/////////////////////////////////////////////////////////////////////////// | ||
// | ||
// Copyright (c) 2012-2016 DreamWorks Animation LLC | ||
// | ||
// All rights reserved. This software is distributed under the | ||
// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) | ||
// | ||
// Redistributions of source code must retain the above copyright | ||
// and license notice and the following restrictions and disclaimer. | ||
// | ||
// * Neither the name of DreamWorks Animation nor the names of | ||
// its contributors may be used to endorse or promote products derived | ||
// from this software without specific prior written permission. | ||
// | ||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY INDIRECT, INCIDENTAL, | ||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE | ||
// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. | ||
// | ||
/////////////////////////////////////////////////////////////////////////// | ||
|
||
/// @file points/AttributeArray.cc | ||
|
||
#include "AttributeArray.h" | ||
#include <map> | ||
|
||
namespace openvdb { | ||
OPENVDB_USE_VERSION_NAMESPACE | ||
namespace OPENVDB_VERSION_NAME { | ||
namespace points { | ||
|
||
|
||
//////////////////////////////////////// | ||
|
||
|
||
namespace { | ||
|
||
using AttributeFactoryMap = std::map<NamePair, AttributeArray::FactoryMethod>; | ||
|
||
struct LockedAttributeRegistry | ||
{ | ||
tbb::spin_mutex mMutex; | ||
AttributeFactoryMap mMap; | ||
}; | ||
|
||
|
||
// Declare this at file scope to ensure thread-safe initialization. | ||
tbb::spin_mutex sInitAttributeRegistryMutex; | ||
|
||
|
||
// Global function for accessing the registry | ||
LockedAttributeRegistry* | ||
getAttributeRegistry() | ||
{ | ||
tbb::spin_mutex::scoped_lock lock(sInitAttributeRegistryMutex); | ||
|
||
static LockedAttributeRegistry* registry = nullptr; | ||
|
||
if (registry == nullptr) { | ||
|
||
#ifdef __ICC | ||
// Disable ICC "assignment to statically allocated variable" warning. | ||
__pragma(warning(disable:1711)) | ||
#endif | ||
// This assignment is mutex-protected and therefore thread-safe. | ||
registry = new LockedAttributeRegistry(); | ||
|
||
#ifdef __ICC | ||
__pragma(warning(default:1711)) | ||
#endif | ||
|
||
} | ||
|
||
return registry; | ||
} | ||
|
||
} // unnamed namespace | ||
|
||
|
||
//////////////////////////////////////// | ||
|
||
// AttributeArray implementation | ||
|
||
|
||
AttributeArray::Ptr | ||
AttributeArray::create(const NamePair& type, Index length, Index stride, bool constantStride) | ||
{ | ||
LockedAttributeRegistry* registry = getAttributeRegistry(); | ||
tbb::spin_mutex::scoped_lock lock(registry->mMutex); | ||
|
||
auto iter = registry->mMap.find(type); | ||
|
||
if (iter == registry->mMap.end()) { | ||
OPENVDB_THROW(LookupError, "Cannot create attribute of unregistered type " << type.first << "_" << type.second); | ||
} | ||
|
||
return (iter->second)(length, stride, constantStride); | ||
} | ||
|
||
|
||
bool | ||
AttributeArray::isRegistered(const NamePair& type) | ||
{ | ||
LockedAttributeRegistry* registry = getAttributeRegistry(); | ||
tbb::spin_mutex::scoped_lock lock(registry->mMutex); | ||
return (registry->mMap.find(type) != registry->mMap.end()); | ||
} | ||
|
||
|
||
void | ||
AttributeArray::clearRegistry() | ||
{ | ||
LockedAttributeRegistry* registry = getAttributeRegistry(); | ||
tbb::spin_mutex::scoped_lock lock(registry->mMutex); | ||
registry->mMap.clear(); | ||
} | ||
|
||
|
||
void | ||
AttributeArray::registerType(const NamePair& type, FactoryMethod factory) | ||
{ | ||
LockedAttributeRegistry* registry = getAttributeRegistry(); | ||
tbb::spin_mutex::scoped_lock lock(registry->mMutex); | ||
|
||
auto iter = registry->mMap.find(type); | ||
|
||
if (iter == registry->mMap.end()) { | ||
registry->mMap[type] = factory; | ||
|
||
} else if (iter->second != factory) { | ||
OPENVDB_THROW(KeyError, "Attribute type " << type.first << "_" << type.second | ||
<< " is already registered with different factory method."); | ||
} | ||
} | ||
|
||
|
||
void | ||
AttributeArray::unregisterType(const NamePair& type) | ||
{ | ||
LockedAttributeRegistry* registry = getAttributeRegistry(); | ||
tbb::spin_mutex::scoped_lock lock(registry->mMutex); | ||
|
||
registry->mMap.erase(type); | ||
} | ||
|
||
|
||
void | ||
AttributeArray::setTransient(bool state) | ||
{ | ||
if (state) mFlags = static_cast<uint8_t>(mFlags | Int16(TRANSIENT)); | ||
else mFlags = static_cast<uint8_t>(mFlags & ~Int16(TRANSIENT)); | ||
} | ||
|
||
|
||
void | ||
AttributeArray::setHidden(bool state) | ||
{ | ||
if (state) mFlags = static_cast<uint8_t>(mFlags | Int16(HIDDEN)); | ||
else mFlags = static_cast<uint8_t>(mFlags & ~Int16(HIDDEN)); | ||
} | ||
|
||
|
||
void | ||
AttributeArray::setStreaming(bool state) | ||
{ | ||
if (state) mFlags = static_cast<uint8_t>(mFlags | Int16(STREAMING)); | ||
else mFlags = static_cast<uint8_t>(mFlags & ~Int16(STREAMING)); | ||
} | ||
|
||
|
||
void | ||
AttributeArray::setConstantStride(bool state) | ||
{ | ||
if (state) mFlags = static_cast<uint8_t>(mFlags | Int16(CONSTANTSTRIDE)); | ||
else mFlags = static_cast<uint8_t>(mFlags & ~Int16(CONSTANTSTRIDE)); | ||
} | ||
|
||
|
||
bool | ||
AttributeArray::operator==(const AttributeArray& other) const | ||
{ | ||
this->loadData(); | ||
other.loadData(); | ||
|
||
if(this->mCompressedBytes != other.mCompressedBytes || | ||
this->mSerializationFlags != other.mSerializationFlags || | ||
this->mFlags != other.mFlags) return false; | ||
return this->isEqual(other); | ||
} | ||
|
||
} // namespace points | ||
} // namespace OPENVDB_VERSION_NAME | ||
} // namespace openvdb | ||
|
||
// Copyright (c) 2012-2016 DreamWorks Animation LLC | ||
// All rights reserved. This software is distributed under the | ||
// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) |
Oops, something went wrong.