/rcg_editor/client/render/controlpoints_client.lua
http://mtasa-resources-rcg.googlecode.com/ · Lua · 185 lines · 165 code · 20 blank · 0 comment · 34 complexity · 6adc8919c1e42a7ee09211f8d2c7ef25 MD5 · raw file
- local targetedControlPointAlpha = { controlPoint = false, alpha = controlPointAlphaDefault }
-
- local function unitSizeAtPosition(position)
- local camX, camY, camZ = getCameraMatrix()
- return 120 / vec3.len(position - vec3.new({ camX, camY, camZ }))
- end
-
- local function dxDrawCircle(radius, centerX, centerY, color, width, startAngle, endAngle, postGUI)
- startAngle = startAngle or 0
- endAngle = endAngle or 360
-
- local n = math.ceil(radius * (endAngle - startAngle) / 500)
-
- local anglePiece = math.rad((endAngle - startAngle) / n)
- local angle = math.rad(startAngle)
-
- for i = 1, n do
- dxDrawLine(centerX + math.cos(angle) * radius,
- centerY + math.sin(angle) * radius,
- centerX + math.cos(angle + anglePiece) * radius,
- centerY + math.sin(angle + anglePiece) * radius,
- color,
- width,
- postGUI)
- angle = angle + anglePiece
- end
- end
-
- local function getScreenPosition(position)
- local x, y = getScreenFromWorldPosition(position[1], position[2], position[3], 100000)
- if (x and y) then
- return vec2.new({ x, y })
- end
-
- return false
- end
-
- addEventHandler("onClientRender",
- gRootElement,
- function()
- if (isEditorSuspended()) then
- return
- end
-
- local targetedControlPointAlphaTo = controlPointAlphaDefault
- if (gTargetedControlPoint) then
- if (targetedControlPointAlpha.controlPoint ~= gTargetedControlPoint.controlPoint) then
- targetedControlPointAlpha = { controlPoint = gTargetedControlPoint.controlPoint, alpha = 100 }
- end
- targetedControlPointAlphaTo = controlPointAlphaSelectedOrTargeted
- end
-
- local cX, cY, cZ = getCameraMatrix()
- local cameraPosition = vec3.new({ cX, cY, cZ })
-
- targetedControlPointAlpha.alpha = targetedControlPointAlpha.alpha + (targetedControlPointAlphaTo - targetedControlPointAlpha.alpha) / 10
-
- local controlPoints = getElementsByType("controlPoint")
- for k, controlPoint in pairs(controlPoints) do
- if (isElementInWorkingDimension(controlPoint)) then
- local selectedElement = exports.editor_main:getSelectedElement()
-
- local alpha = controlPointAlphaDefault
- if (targetedControlPointAlpha and targetedControlPointAlpha.controlPoint == controlPoint) then
- alpha = targetedControlPointAlpha.alpha
- end
-
- local images = { controlPointImageDefault, controlPointImageDefault, controlPointImageDefault }
- if (gSelectedControlPoint and gSelectedControlPoint.controlPoint == selectedElement and gSelectedControlPoint.controlPoint == controlPoint) then
- if (gSelectedControlPoint.subControlPoint == subControlPointLeft) then
- images = { controlPointImageSelected, controlPointImageDefault, controlPointImageDefault }
- elseif (gSelectedControlPoint.subControlPoint == subControlPointCenter) then
- images = { controlPointImageDefault, controlPointImageSelected, controlPointImageDefault }
- elseif (gSelectedControlPoint.subControlPoint == subControlPointRight) then
- images = { controlPointImageDefault, controlPointImageDefault, controlPointImageSelected }
- end
- alpha = controlPointAlphaSelectedOrTargeted
- elseif (controlPoint == getControlPointFromRepresentObject(selectedElement)) then
- images = { controlPointImageDefault, controlPointImageSelected, controlPointImageDefault }
- alpha = controlPointAlphaSelectedOrTargeted
- end
-
- local centerPosition = getSubControlPointCenterPosition(controlPoint)
- if (centerPosition and vec3.len(cameraPosition - centerPosition) <= 300) then
- local positions = { getSubControlPointLeftPosition(controlPoint), centerPosition, getSubControlPointRightPosition(controlPoint) }
- if (positions[1] and positions[3]) then
- local screenPositions = { getScreenPosition(positions[1]), getScreenPosition(positions[2]), getScreenPosition(positions[3]) }
- if (screenPositions[1] and screenPositions[2] and screenPositions[3]) then
- local unitSizes = { unitSizeAtPosition(positions[1]), unitSizeAtPosition(positions[2]), unitSizeAtPosition(positions[3]) }
-
- local direction = screenPositions[3] - screenPositions[1]
- local rotation = math.deg(math.atan2(direction[2], direction[1]))
-
- dxDrawImage(screenPositions[1][1] - unitSizes[1] * controlPointInsideRadius,
- screenPositions[1][2] - unitSizes[1] * controlPointInsideRadius,
- unitSizes[1] * controlPointInsideRadius * 2,
- unitSizes[1] * controlPointInsideRadius * 2,
- images[1],
- rotation,
- 0,
- 0,
- tocolor(255, 255, 255, alpha))
- dxDrawImage(screenPositions[2][1] - unitSizes[2] * controlPointInsideRadius,
- screenPositions[2][2] - unitSizes[2] * controlPointInsideRadius,
- unitSizes[2] * controlPointInsideRadius * 2,
- unitSizes[2] * controlPointInsideRadius * 2,
- images[2],
- rotation,
- 0,
- 0,
- tocolor(255, 255, 255, alpha))
- dxDrawImage(screenPositions[3][1] - unitSizes[3] * controlPointInsideRadius,
- screenPositions[3][2] - unitSizes[3] * controlPointInsideRadius,
- unitSizes[3] * controlPointInsideRadius * 2,
- unitSizes[3] * controlPointInsideRadius * 2,
- images[3],
- rotation,
- 0,
- 0,
- tocolor(255, 255, 255, alpha))
-
- local angles = { { rotation + controlPointOutsideOpenedAngle / 2, rotation + 360 - controlPointOutsideOpenedAngle / 2 },
- { rotation + controlPointOutsideOpenedAngle / 2, rotation + 180 - controlPointOutsideOpenedAngle / 2 },
- { rotation - 180 + controlPointOutsideOpenedAngle / 2, rotation - controlPointOutsideOpenedAngle / 2 },
- { rotation - 180 + controlPointOutsideOpenedAngle / 2, rotation + 180 - controlPointOutsideOpenedAngle / 2 } }
-
- dxDrawCircle(unitSizes[1] * controlPointOutsideRadius,
- screenPositions[1][1],
- screenPositions[1][2],
- tocolor(255, 255, 255, alpha),
- controlPointOutsideWidth,
- angles[1][1],
- angles[1][2])
- dxDrawCircle(unitSizes[2] * controlPointOutsideRadius,
- screenPositions[2][1],
- screenPositions[2][2],
- tocolor(255, 255, 255, alpha),
- controlPointOutsideWidth,
- angles[2][1],
- angles[2][2])
- dxDrawCircle(unitSizes[2] * controlPointOutsideRadius,
- screenPositions[2][1],
- screenPositions[2][2],
- tocolor(255, 255, 255, alpha),
- controlPointOutsideWidth,
- angles[3][1],
- angles[3][2])
- dxDrawCircle(unitSizes[3] * controlPointOutsideRadius,
- screenPositions[3][1],
- screenPositions[3][2],
- tocolor(255, 255, 255, alpha),
- controlPointOutsideWidth,
- angles[4][1],
- angles[4][2])
-
- dxDrawLine(screenPositions[1][1] + math.cos(math.rad(angles[1][1])) * unitSizes[1] * controlPointOutsideRadius,
- screenPositions[1][2] + math.sin(math.rad(angles[1][1])) * unitSizes[1] * controlPointOutsideRadius,
- screenPositions[2][1] + math.cos(math.rad(angles[2][2])) * unitSizes[2] * controlPointOutsideRadius,
- screenPositions[2][2] + math.sin(math.rad(angles[2][2])) * unitSizes[2] * controlPointOutsideRadius,
- tocolor(255, 255, 255, alpha),
- controlPointOutsideWidth)
- dxDrawLine(screenPositions[1][1] + math.cos(math.rad(angles[1][2])) * unitSizes[1] * controlPointOutsideRadius,
- screenPositions[1][2] + math.sin(math.rad(angles[1][2])) * unitSizes[1] * controlPointOutsideRadius,
- screenPositions[2][1] + math.cos(math.rad(angles[3][1])) * unitSizes[2] * controlPointOutsideRadius,
- screenPositions[2][2] + math.sin(math.rad(angles[3][1])) * unitSizes[2] * controlPointOutsideRadius,
- tocolor(255, 255, 255, alpha),
- controlPointOutsideWidth)
- dxDrawLine(screenPositions[2][1] + math.cos(math.rad(angles[2][1])) * unitSizes[2] * controlPointOutsideRadius,
- screenPositions[2][2] + math.sin(math.rad(angles[2][1])) * unitSizes[2] * controlPointOutsideRadius,
- screenPositions[3][1] + math.cos(math.rad(angles[4][2])) * unitSizes[3] * controlPointOutsideRadius,
- screenPositions[3][2] + math.sin(math.rad(angles[4][2])) * unitSizes[3] * controlPointOutsideRadius,
- tocolor(255, 255, 255, alpha),
- controlPointOutsideWidth)
- dxDrawLine(screenPositions[2][1] + math.cos(math.rad(angles[3][2])) * unitSizes[2] * controlPointOutsideRadius,
- screenPositions[2][2] + math.sin(math.rad(angles[3][2])) * unitSizes[2] * controlPointOutsideRadius,
- screenPositions[3][1] + math.cos(math.rad(angles[4][1])) * unitSizes[3] * controlPointOutsideRadius,
- screenPositions[3][2] + math.sin(math.rad(angles[4][1])) * unitSizes[3] * controlPointOutsideRadius,
- tocolor(255, 255, 255, alpha),
- controlPointOutsideWidth)
- end
- end
- end
- end
- end
- end)