| 1064 | } |
| 1065 | |
| 1066 | void Node::getLocalWorld(Matrix& localWorld) { |
| 1067 | if (!_transform) { |
| 1068 | localWorld = Matrix::Indentity; |
| 1069 | return; |
| 1070 | } |
| 1071 | auto& t = *_transform; |
| 1072 | if (t.z || t.angleX || t.angleY || t.scaleZ != 1.0f) { |
| 1073 | if (t.anchorPointX || t.anchorPointY) { |
| 1074 | /* scaleXYZ, rotateXYZ, translateXYZ */ |
| 1075 | Matrix mtxBase; |
| 1076 | bx::mtxSRT(mtxBase.m, |
| 1077 | t.scaleX, t.scaleY, t.scaleZ, |
| 1078 | -bx::toRad(t.angleX), -bx::toRad(t.angleY), -bx::toRad(t.angle), |
| 1079 | t.x, t.y, t.z); |
| 1080 | if (t.skewX || t.skewY) { |
| 1081 | Matrix mtxTemp; |
| 1082 | { |
| 1083 | Matrix mtxSkew; |
| 1084 | /* skewXY */ |
| 1085 | AffineTransform{ |
| 1086 | 1.0f, bx::tan(bx::toRad(t.skewY)), |
| 1087 | bx::tan(bx::toRad(t.skewX)), 1.0f, |
| 1088 | 0.0f, 0.0f} |
| 1089 | .toMatrix(mtxSkew); |
| 1090 | Matrix::mulMtx(mtxTemp, mtxBase, mtxSkew); |
| 1091 | } |
| 1092 | /* translateAnchorXY */ |
| 1093 | Matrix mtxAnchor; |
| 1094 | bx::mtxTranslate(mtxAnchor.m, -t.anchorPointX, -t.anchorPointY, 0.0f); |
| 1095 | Matrix::mulMtx(localWorld, mtxTemp, mtxAnchor); |
| 1096 | } else { |
| 1097 | /* translateAnchorXY */ |
| 1098 | Matrix mtxAnchor; |
| 1099 | bx::mtxTranslate(mtxAnchor.m, -t.anchorPointX, -t.anchorPointY, 0.0f); |
| 1100 | Matrix::mulMtx(localWorld, mtxBase, mtxAnchor); |
| 1101 | } |
| 1102 | } else { |
| 1103 | if (t.skewX || t.skewY) { |
| 1104 | /* scaleXYZ, rotateXYZ, translateXYZ */ |
| 1105 | Matrix mtxBase; |
| 1106 | bx::mtxSRT(mtxBase.m, |
| 1107 | t.scaleX, t.scaleY, t.scaleZ, |
| 1108 | -bx::toRad(t.angleX), -bx::toRad(t.angleY), -bx::toRad(t.angle), |
| 1109 | t.x, t.y, t.z); |
| 1110 | Matrix mtxSkew; |
| 1111 | /* skewXY */ |
| 1112 | AffineTransform{ |
| 1113 | 1.0f, bx::tan(bx::toRad(t.skewY)), |
| 1114 | bx::tan(bx::toRad(t.skewX)), 1.0f, |
| 1115 | 0.0f, 0.0f} |
| 1116 | .toMatrix(mtxSkew); |
| 1117 | Matrix::mulMtx(localWorld, mtxBase, mtxSkew); |
| 1118 | } else { |
| 1119 | /* translateXYZ, rotateXYZ, scaleXYZ */ |
| 1120 | bx::mtxSRT(localWorld.m, |
| 1121 | t.scaleX, t.scaleY, t.scaleZ, |
| 1122 | -bx::toRad(t.angleX), -bx::toRad(t.angleY), -bx::toRad(t.angle), |
| 1123 | t.x, t.y, t.z); |