00001 #include "OSGSlicer.h"
00002
00003 #include <OSGConfig.h>
00004
00005 #include <OSGQuaternion.h>
00006 #include <OSGMatrix.h>
00007 #include <OSGDrawAction.h>
00008 #include <OSGCamera.h>
00009
00010 OSG_USING_NAMESPACE
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 Int32 Slicer::getAASlicingDirection(DrawActionBase *da, Vec3f *pViewDir)
00027 {
00028 Int32 dir = getSlicingDirection(da, NULL);
00029 Vec3f finalSliceDir;
00030
00031 switch (dir)
00032 {
00033 case SD_Z_FRONT_TO_BACK:
00034 finalSliceDir = Vec3f(0, 0, 1);
00035 break;
00036
00037 case SD_Z_BACK_TO_FRONT:
00038 finalSliceDir = Vec3f(0, 0, -1);
00039 break;
00040
00041 case SD_Y_BACK_TO_FRONT:
00042 finalSliceDir = Vec3f(0, -1, 0);
00043 break;
00044
00045 case SD_Y_FRONT_TO_BACK:
00046 finalSliceDir = Vec3f(0, 1, 0);
00047 break;
00048
00049 case SD_X_BACK_TO_FRONT:
00050 finalSliceDir = Vec3f(-1, 0, 0);
00051 break;
00052
00053 case SD_X_FRONT_TO_BACK:
00054 finalSliceDir = Vec3f(1, 0, 0);
00055 break;
00056
00057 default:
00058 finalSliceDir = Vec3f(0, 0, 1);
00059 break;
00060 }
00061
00062 if (pViewDir != NULL)
00063 *pViewDir = finalSliceDir;
00064
00065 return dir;
00066 }
00067
00068
00069 Int32 Slicer::getSlicingDirection(DrawActionBase *da, Vec3f *pViewDir)
00070 {
00071 static const Vec3f zAxis(0.0, 0.0, 1.0);
00072 static Quaternion dummyRot;
00073 static Vec3f vecToCam;
00074 static Vec3f volTranslation;
00075 static Vec3f volScale;
00076 static Vec3f dummyVec;
00077 static Quaternion volRotationInv;
00078 static Quaternion camRotationInv;
00079 Vec3f finalSliceDir;
00080
00081
00082 Matrix viewMat = da->getCameraToWorld();
00083
00084 viewMat.invert();
00085 viewMat.getTransform(vecToCam, camRotationInv, dummyVec, dummyRot);
00086 camRotationInv.invert();
00087
00088
00089 Matrix modelMat = da->getActNode()->getToWorld();
00090
00091 modelMat.getTransform(volTranslation, volRotationInv, volScale, dummyRot);
00092 volRotationInv.invert();
00093
00094
00095 camRotationInv.multVec(zAxis, vecToCam);
00096 volRotationInv.multVec(vecToCam, finalSliceDir);
00097
00098 Real64 x = finalSliceDir[0];
00099 Real64 y = finalSliceDir[1];
00100 Real64 z = finalSliceDir[2];
00101 Real64 X = (x > 0) ? x: -x;
00102 Real64 Y = (y > 0) ? y: -y;
00103 Real64 Z = (z > 0) ? z: -z;
00104
00105 Int32 nfinalSliceDir;
00106
00107 if((Z > Y) && (Z > X))
00108 {
00109 if (z > 0)
00110 {
00111 nfinalSliceDir = SD_Z_FRONT_TO_BACK;
00112 }
00113 else
00114 {
00115 nfinalSliceDir = SD_Z_BACK_TO_FRONT;
00116 }
00117 }
00118 else
00119 {
00120 if(Y > X)
00121 {
00122 if(y < 0)
00123 {
00124 nfinalSliceDir = SD_Y_BACK_TO_FRONT;
00125 }
00126 else
00127 {
00128 nfinalSliceDir = SD_Y_FRONT_TO_BACK;
00129 }
00130 }
00131 else
00132 {
00133 if(x < 0)
00134 {
00135 nfinalSliceDir = SD_X_BACK_TO_FRONT;
00136 }
00137 else
00138 {
00139 nfinalSliceDir = SD_X_FRONT_TO_BACK;
00140 }
00141 }
00142 }
00143
00144 if(pViewDir != NULL)
00145 {
00146 *pViewDir = finalSliceDir;
00147 }
00148
00149 return nfinalSliceDir;
00150 }
00151
00152
00153 void Slicer::rotateToLocal(DrawActionBase *da, Vec3f &in, Vec3f &out)
00154 {
00155 static Quaternion dummyRot;
00156 static Vec3f tempVec;
00157 static Vec3f volTranslation;
00158 static Vec3f camTranslation;
00159 static Vec3f volScale;
00160 static Vec3f camScale;
00161 static Quaternion volRotationInv;
00162 static Quaternion camRotationInv;
00163
00164
00165 Matrix viewMat = da->getCameraToWorld();
00166
00167 viewMat.invert();
00168 viewMat.getTransform(camTranslation, camRotationInv, camScale, dummyRot);
00169 camRotationInv.invert();
00170
00171
00172 Matrix modelMat = da->getActNode()->getToWorld();
00173
00174 modelMat.getTransform(volTranslation, volRotationInv, volScale, dummyRot);
00175 volRotationInv.invert();
00176
00177
00178 camRotationInv.multVec(in, tempVec);
00179 volRotationInv.multVec(tempVec, out );
00180 }
00181
00182
00183 bool Slicer::isBackToFront(int sliceDir)
00184 {
00185 switch(sliceDir)
00186 {
00187 case SD_Z_FRONT_TO_BACK:
00188 case SD_Y_FRONT_TO_BACK:
00189 case SD_X_FRONT_TO_BACK:
00190 return false;
00191
00192 case SD_Z_BACK_TO_FRONT:
00193 case SD_Y_BACK_TO_FRONT:
00194 case SD_X_BACK_TO_FRONT:
00195 return true;
00196
00197 default:
00198
00199 return false;
00200 }
00201 }
00202