00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "System/stdafx.h"
00026 #include "Translator/Instance/TranslationSceneNodeInstance.h"
00027 #include "Graphics/SceneNode/SceneNodeManager.h"
00028
00029 namespace LampForMaya{
00030
00031
00032
00033 TranslationSceneNodeInstance::TranslationSceneNodeInstance(
00034 const MDagPath& initializePath, const String& initializeName) :
00035 TranslationInstance(initializePath, initializeName),
00036 source_(NULL), destination_(NULL){
00037 }
00038
00039
00040 TranslationSceneNodeInstance::~TranslationSceneNodeInstance(){
00041 }
00042
00043
00044 bool TranslationSceneNodeInstance::analyze(){
00045 if(!analyzeInstance()){ return false; }
00046
00047 MStatus result;
00048 String errorString;
00049
00050 MFnTransform transform(dagPath_, &result);
00051 MayaStatusCheck(result);
00052
00053
00054 MPoint scalePivotTrans =
00055 transform.scalePivotTranslation(MSpace::kTransform, &result);
00056 MayaStatusCheck(result);
00057 if(!zeroCheck(scalePivotTrans)){
00058 errorString.format("TranslationSceneNodeInstance::analyze() "
00059 "scalePivotTranslationが0でない ( %8f, %8f, %8f ) %s",
00060 scalePivotTrans.x, scalePivotTrans.y, scalePivotTrans.z,
00061 name_.getBytes());
00062 MayaErrorOut(errorString);
00063 return false;
00064 }
00065
00066
00067 MPoint rotationPivotTrans =
00068 transform.rotatePivotTranslation(MSpace::kTransform, &result);
00069 MayaStatusCheck(result);
00070 if(!zeroCheck(rotationPivotTrans)){
00071 errorString.format("TranslationSceneNodeInstance::analyze() "
00072 "rotationPivotTransが0でない ( %8f, %8f, %8f ) %s",
00073 rotationPivotTrans.x, rotationPivotTrans.y,
00074 rotationPivotTrans.z, name_.getBytes());
00075 MayaErrorOut(errorString);
00076 return false;
00077 }
00078
00079
00080 double shearArray[3];
00081 result = transform.getShear(shearArray);
00082 MPoint shear(shearArray);
00083 if(!zeroCheck(shear)){
00084 errorString.format("TranslationSceneNodeInstance::analyze() "
00085 "shearが0でない ( %8f, %8f, %8f ) %s",
00086 shear.x, shear.y, shear.z, name_.getBytes());
00087 MayaErrorOut(errorString);
00088 return false;
00089 }
00090
00091
00092 MPoint scalePivot = transform.scalePivot(MSpace::kTransform, &result);
00093 MayaStatusCheck(result);
00094 MPoint rotationPivot =
00095 transform.rotatePivot(MSpace::kTransform, &result);
00096 MayaStatusCheck(result);
00097 MPoint pivotDifference = scalePivot - rotationPivot;
00098 if(!zeroCheck(pivotDifference)){
00099 errorString.format("TranslationSceneNodeInstance::analyze() "
00100 "scalePivotとrotationPivotが同じでない "
00101 "scale ( %8f, %8f, %8f ) rotation ( %8f, %8f, %8f ) %s",
00102 scalePivot.x, scalePivot.y, scalePivot.z,
00103 rotationPivot.x, rotationPivot.y, rotationPivot.z,
00104 name_.getBytes());
00105 MayaErrorOut(errorString);
00106 return false;
00107 }
00108 pivot_.set((float)rotationPivot.x,
00109 (float)rotationPivot.y, (float)rotationPivot.z);
00110
00111
00112 double scale[3];
00113 result = transform.getScale(scale);
00114 MayaStatusCheck(result);
00115 scale_.set((float)scale[0], (float)scale[1], (float)scale[2]);
00116
00117
00118 MEulerRotation rotation;
00119 result = transform.getRotation(rotation);
00120 MayaStatusCheck(result);
00121 if(rotation.order != MEulerRotation::kXYZ){
00122 errorString.format("TranslationSceneNodeInstance::analyze() "
00123 "回転順序はXYZしかサポートしていません %s", name_.getBytes());
00124 MayaErrorOut(errorString);
00125 return false;
00126 }
00127 rotation_.set((float)rotation.x, (float)rotation.y, (float)rotation.z);
00128
00129
00130 MVector translation =
00131 transform.translation(MSpace::kTransform, &result);
00132 MayaStatusCheck(result);
00133 translation_.set(
00134 (float)translation.x, (float)translation.y, (float)translation.z);
00135
00136
00137 translation_ += pivot_;
00138 pivot_.set(0.f, 0.f, 0.f);
00139 return true;
00140 }
00141
00142
00143 bool TranslationSceneNodeInstance::convertToLamp(Scene* scene){
00144
00145 SceneNodeManager* sceneNodeManager = scene->getSceneNodeManager();
00146 SceneNode* target = sceneNodeManager->search(parentSceneNodeName_);
00147 if(target == NULL){
00148 MayaErrorOut(String("TranslationSceneNodeInstance::convertToLamp() "
00149 "インスタンス先のシーンノードが見つかりません ") +
00150 parentSceneNodeName_);
00151 return false;
00152 }
00153
00154
00155 SceneNode* sceneNode = sceneNodeManager->search(name_);
00156 if(sceneNode == NULL){
00157 MayaErrorOut(String("TranslationSceneNodeInstance::convertToLamp() "
00158 "インスタンス元のシーンノード" + name_ + "が見つかりません ") +
00159 parentSceneNodeName_);
00160 return false;
00161 }
00162 source_ = sceneNode;
00163 SceneNode* copySceneNode = sceneNode->copy(0);
00164 destination_ = copySceneNode;
00165
00166
00167 copySceneNode->setScale(scale_);
00168 copySceneNode->setRotationXYZ(rotation_);
00169 copySceneNode->setTranslation(translation_);
00170 copySceneNode->setEnabled(visibility_);
00171 target->addSceneNode(copySceneNode);
00172 return true;
00173 }
00174
00175 }
00176