This repository has been archived on 2023-10-09. You can view files and clone it, but cannot push or open issues or pull requests.
Files
blender-archive/source/blender/io/collada/BCSampleData.cpp
Campbell Barton c434782e3a File headers: SPDX License migration
Use a shorter/simpler license convention, stops the header taking so
much space.

Follow the SPDX license specification: https://spdx.org/licenses

- C/C++/objc/objc++
- Python
- Shell Scripts
- CMake, GNUmakefile

While most of the source tree has been included

- `./extern/` was left out.
- `./intern/cycles` & `./intern/atomic` are also excluded because they
  use different header conventions.

doc/license/SPDX-license-identifiers.txt has been added to list SPDX all
used identifiers.

See P2788 for the script that automated these edits.

Reviewed By: brecht, mont29, sergey

Ref D14069
2022-02-11 09:14:36 +11:00

81 lines
1.9 KiB
C++

/* SPDX-License-Identifier: GPL-2.0-or-later
* Copyright 2008 Blender Foundation. All rights reserved. */
#include "BCSampleData.h"
#include "collada_utils.h"
BCSample::~BCSample()
{
BCBoneMatrixMap::iterator it;
for (it = bonemats.begin(); it != bonemats.end(); ++it) {
delete it->second;
}
}
void BCSample::add_bone_matrix(Bone *bone, Matrix &mat)
{
BCMatrix *matrix;
BCBoneMatrixMap::const_iterator it = bonemats.find(bone);
if (it != bonemats.end()) {
throw std::invalid_argument("bone " + std::string(bone->name) + " already defined before");
}
matrix = new BCMatrix(mat);
bonemats[bone] = matrix;
}
bool BCSample::get_value(std::string channel_target, const int array_index, float *val) const
{
std::string bname = bc_string_before(channel_target, ".");
std::string channel_type = bc_string_after(channel_target, ".");
const BCMatrix *matrix = &obmat;
if (bname != channel_target) {
bname = bname.substr(2);
bname = bc_string_before(bname, "\"");
BCBoneMatrixMap::const_iterator it;
for (it = bonemats.begin(); it != bonemats.end(); ++it) {
Bone *bone = it->first;
if (bname == bone->name) {
matrix = it->second;
break;
}
}
}
else {
matrix = &obmat;
}
if (channel_type == "location") {
*val = matrix->location()[array_index];
}
else if (channel_type == "scale") {
*val = matrix->scale()[array_index];
}
else if (channel_type == "rotation" || channel_type == "rotation_euler") {
*val = matrix->rotation()[array_index];
}
else if (channel_type == "rotation_quaternion") {
*val = matrix->quat()[array_index];
}
else {
*val = 0;
return false;
}
return true;
}
const BCMatrix *BCSample::get_matrix(Bone *bone) const
{
BCBoneMatrixMap::const_iterator it = bonemats.find(bone);
if (it == bonemats.end()) {
return nullptr;
}
return it->second;
}
const BCMatrix &BCSample::get_matrix() const
{
return obmat;
}