void RotationManipulator::ProcessMouseRay(const Vect &cameraDir, float scale, const Vect &rayOrig, const Vect &rayDir) { traceIn(RotationManipulator::ProcessMouseRay); activeAxis = -1; curCameraDir = cameraDir; Matrix mat; mat.SetIdentity(); mat.Translate(GetWorldPos()); mat.Scale(scale, scale, scale); bManipulating = false; DWORD i,j; for(i=0; i<3; i++) { for(j=0; j<30; j++) { DWORD jp1 = (j == 29) ? 0 : j+1; Vect norm = axisNorms[i][j]; if(norm.Dot(cameraDir) > 0.01f) continue; Vect v1 = axisLines[i][j]; Vect v2 = axisLines[i][jp1]; v1.TransformPoint(mat); v2.TransformPoint(mat); Vect lineVec = (v2-v1); float lineLen = lineVec.Len(); Vect lineDir = lineVec*(1.0f/lineLen); float fT1, fT2; if(ClosestLinePoints(rayOrig, rayDir, v1, lineDir, fT1, fT2)) { if((fT2 < 0.0f) || (fT2 > lineLen)) continue; Vect closestPoint1 = rayOrig+(rayDir*fT1); Vect closestPoint2 = v1+(lineDir*fT2); if(closestPoint1.Dist(closestPoint2) < (0.4f*scale)) { Vect axis(0.0f, 0.0f, 0.0f); axis.ptr[i] = 1.0f; activeAxis = i; clickDir = cameraDir.Cross(axis.Cross(norm)).Cross(cameraDir).Norm(); clickOrig = closestPoint1; bManipulating = true; return; } } } } mat.SetIdentity(); mat.Translate(GetWorldPos()); mat.Rotate(Quat().SetLookDirection(cameraDir)); mat.Scale(scale*1.25f, scale*1.25f, scale*1.25f); for(j=0; j<30; j++) { DWORD jp1 = (j == 29) ? 0 : j+1; Vect norm = axisNorms[2][j]; Vect v1 = axisLines[2][j]; Vect v2 = axisLines[2][jp1]; v1.TransformPoint(mat); v2.TransformPoint(mat); norm.TransformVector(mat); Vect lineVec = (v2-v1); float lineLen = lineVec.Len(); Vect lineDir = lineVec*(1.0f/lineLen); float fT1, fT2; if(ClosestLinePoints(rayOrig, rayDir, v1, lineDir, fT1, fT2)) { if((fT2 < 0.0f) || (fT2 > lineLen)) continue; Vect closestPoint1 = rayOrig+(rayDir*fT1); Vect closestPoint2 = v1+(lineDir*fT2); if(closestPoint1.Dist(closestPoint2) < (0.6f*scale)) { activeAxis = 4; clickDir = cameraDir.Cross(norm); clickOrig = closestPoint1; curCameraDir = cameraDir; bManipulating = true; return; } } } traceOut; }
void D3D10System::DrawSpriteExRotate(Texture *texture, DWORD color, float x, float y, float x2, float y2, float degrees, float u, float v, float u2, float v2, float texDegrees) { if(!curPixelShader) return; if(!texture) { AppWarning(TEXT("Trying to draw a sprite with a NULL texture")); return; } HANDLE hColor = curPixelShader->GetParameterByName(TEXT("outputColor")); if(hColor) curPixelShader->SetColor(hColor, color); //------------------------------ // crop positional values Vect2 totalSize = Vect2(x2-x, y2-y); Vect2 invMult = Vect2(totalSize.x < 0.0f ? -1.0f : 1.0f, totalSize.y < 0.0f ? -1.0f : 1.0f); totalSize.Abs(); if(y2-y < 0) { float tempFloat = curCropping[1]; curCropping[1] = curCropping[3]; curCropping[3] = tempFloat; } if(x2-x < 0) { float tempFloat = curCropping[0]; curCropping[0] = curCropping[2]; curCropping[2] = tempFloat; } x += curCropping[0] * invMult.x; y += curCropping[1] * invMult.y; x2 -= curCropping[2] * invMult.x; y2 -= curCropping[3] * invMult.y; //------------------------------ // crop texture coordinate values float cropMult[4]; cropMult[0] = curCropping[0]/totalSize.x; cropMult[1] = curCropping[1]/totalSize.y; cropMult[2] = curCropping[2]/totalSize.x; cropMult[3] = curCropping[3]/totalSize.y; Vect2 totalUVSize = Vect2(u2-u, v2-v); u += cropMult[0] * totalUVSize.x; v += cropMult[1] * totalUVSize.y; u2 -= cropMult[2] * totalUVSize.x; v2 -= cropMult[3] * totalUVSize.y; //------------------------------ // draw VBData *data = spriteVertexBuffer->GetData(); data->VertList[0].Set(x, y, 0.0f); data->VertList[1].Set(x, y2, 0.0f); data->VertList[2].Set(x2, y, 0.0f); data->VertList[3].Set(x2, y2, 0.0f); if (!CloseFloat(degrees, 0.0f)) { List<Vect> &coords = data->VertList; Vect2 center(x+totalSize.x/2, y+totalSize.y/2); Matrix rotMatrix; rotMatrix.SetIdentity(); rotMatrix.Rotate(AxisAngle(0.0f, 0.0f, 1.0f, RAD(degrees))); for (int i = 0; i < 4; i++) { Vect val = coords[i]-Vect(center); val.TransformVector(rotMatrix); coords[i] = val; coords[i] += Vect(center); } } List<UVCoord> &coords = data->UVList[0]; coords[0].Set(u, v); coords[1].Set(u, v2); coords[2].Set(u2, v); coords[3].Set(u2, v2); if (!CloseFloat(texDegrees, 0.0f)) { Matrix rotMatrix; rotMatrix.SetIdentity(); rotMatrix.Rotate(AxisAngle(0.0f, 0.0f, 1.0f, -RAD(texDegrees))); Vect2 minVal = Vect2(0.0f, 0.0f); for (int i = 0; i < 4; i++) { Vect val = Vect(coords[i]); val.TransformVector(rotMatrix); coords[i] = val; minVal.ClampMax(coords[i]); } for (int i = 0; i < 4; i++) coords[i] -= minVal; } spriteVertexBuffer->FlushBuffers(); LoadVertexBuffer(spriteVertexBuffer); LoadTexture(texture); Draw(GS_TRIANGLESTRIP); }