DxSetShaderTransform: Difference between revisions

From Multi Theft Auto: Wiki
Jump to navigation Jump to search
mNo edit summary
Line 38: Line 38:
==Example==  
==Example==  
<syntaxhighlight lang="lua">
<syntaxhighlight lang="lua">
myShader = dxCreateShader( "shader.fx" )
local shader
myTexture = dxCreateTexture( "picture.png" )
local texture
dxSetShaderValue( myShader, "texture0", myTexture ) -- Set a texture
local angle = 0 -- Initialize angle for rotation
local radius = 50 -- Reduced radius for the circular motion
local centerX, centerY -- Center of the screen


transform = 0
function startShaderExample()
    -- Create a shader
    shader = dxCreateShader("texture.fx")
   
    -- Load a texture
    texture = dxCreateTexture("myTexture.png")
   
    -- Apply the texture to the shader
    dxSetShaderValue(shader, "gTexture", texture)
   
    -- Get the center of the screen
    local screenWidth, screenHeight = guiGetScreenSize()
    centerX = screenWidth / 2
    centerY = screenHeight / 2
   
    -- Start rendering the shader
    addEventHandler("onClientRender", root, renderShader)
end
addEventHandler("onClientResourceStart", resourceRoot, startShaderExample)


addEventHandler( "onClientRender", root, function()
function renderShader()
     transform = transform + 1
    -- Increment the angle to create rotation over time
     dxSetShaderTransform( myShader, transform )
    angle = angle + 0.02
     dxDrawImage( 400, 300, 100, 100, myShader )
    if angle > 2 * math.pi then
end)
        angle = 0
    end
 
    -- Calculate the position based on a smaller circular path
    local positionX = centerX + math.cos(angle) * radius
     local positionY = centerY + math.sin(angle) * radius
 
    -- Apply transformation: translation along a smaller circular path and rotation
     dxSetShaderTransform(shader, positionX, positionY, 0, 0, 0, angle)
   
    -- Draw a rectangle with the shader applied, following the circular path
     dxDrawImage(positionX - 128, positionY - 128, 256, 256, shader)
end
 
function stopShaderExample()
    if shader then
        destroyElement(shader)
        shader = nil
    end
    if texture then
        destroyElement(texture)
        texture = nil
    end
    removeEventHandler("onClientRender", root, renderShader)
end
addEventHandler("onClientResourceStop", resourceRoot, stopShaderExample)
</syntaxhighlight>
</syntaxhighlight>



Revision as of 14:25, 29 August 2024

Accessories-text-editor.png Script Example Missing Function DxSetShaderTransform needs a script example, help out by writing one.

Before submitting check out Editing Guidelines Script Examples.


This function applies a 3D transformation to a shader element when it is drawn with dxDrawImage.

Syntax

bool dxSetShaderTransform ( element theShader,
                            float rotationX, float rotationY, float rotationZ,
                          [ float rotationCenterOffsetX = 0, float rotationCenterOffsetY = 0, float rotationCenterOffsetZ = 0,
                            bool bRotationCenterOffsetOriginIsScreen = false,
                            float perspectiveCenterOffsetX = 0, float perspectiveCenterOffsetY = 0,
                            bool bPerspectiveCenterOffsetOriginIsScreen = false ] )

OOP Syntax Help! I don't understand this!

Method: shader:setTransform(...)


Required Arguments

  • theShader: The shader element whose transformation is to be changed
  • rotationX: Rotation angle in degrees around the X axis (Left,right). This will make the shader rotate along its width.
  • rotationY: Rotation angle in degrees around the Y axis (Up,down). This will make the shader rotate along its height.
  • rotationZ: Rotation angle in degrees around the Z axis (In,out). This will make the shader rotate in a similar way to the rotation argument in dxDrawImage.

Optional Arguments

NOTE: When using optional arguments, you might need to supply all arguments before the one you wish to use. For more information on optional arguments, see optional arguments.

  • rotationCenterOffsetX : The center of rotation offset X position in screen relative units.
  • rotationCenterOffsetY : The center of rotation offset Y position in screen relative units.
  • rotationCenterOffsetZ : The center of rotation offset Z position in screen relative units.
  • bRotationCenterOffsetOriginIsScreen : Set to true if the center of rotation origin should be the center of the screen rather than the center of the image.
  • perspectiveCenterOffsetX : The center of perspective offset X position in screen relative units.
  • perspectiveCenterOffsetY : The center of perspective offset Y position in screen relative units.
  • bPerspectiveCenterOffsetOriginIsScreen : Set to true if the center of perspective origin should be the center of the screen rather than the center of the image.

To convert screen relative units into screen pixel coordinates, multiply by the screen size. Conversely, to convert screen pixel coordinates to screen relative units, divide by the screen size.

Returns

Returns true if the shader element's transform was successfully changed, false otherwise.

Example

local shader
local texture
local angle = 0 -- Initialize angle for rotation
local radius = 50 -- Reduced radius for the circular motion
local centerX, centerY -- Center of the screen

function startShaderExample()
    -- Create a shader
    shader = dxCreateShader("texture.fx")
    
    -- Load a texture
    texture = dxCreateTexture("myTexture.png")
    
    -- Apply the texture to the shader
    dxSetShaderValue(shader, "gTexture", texture)
    
    -- Get the center of the screen
    local screenWidth, screenHeight = guiGetScreenSize()
    centerX = screenWidth / 2
    centerY = screenHeight / 2
    
    -- Start rendering the shader
    addEventHandler("onClientRender", root, renderShader)
end
addEventHandler("onClientResourceStart", resourceRoot, startShaderExample)

function renderShader()
    -- Increment the angle to create rotation over time
    angle = angle + 0.02
    if angle > 2 * math.pi then
        angle = 0
    end

    -- Calculate the position based on a smaller circular path
    local positionX = centerX + math.cos(angle) * radius
    local positionY = centerY + math.sin(angle) * radius

    -- Apply transformation: translation along a smaller circular path and rotation
    dxSetShaderTransform(shader, positionX, positionY, 0, 0, 0, angle)
    
    -- Draw a rectangle with the shader applied, following the circular path
    dxDrawImage(positionX - 128, positionY - 128, 256, 256, shader)
end

function stopShaderExample()
    if shader then
        destroyElement(shader)
        shader = nil
    end
    if texture then
        destroyElement(texture)
        texture = nil
    end
    removeEventHandler("onClientRender", root, renderShader)
end
addEventHandler("onClientResourceStop", resourceRoot, stopShaderExample)

Requirements

Minimum server version n/a
Minimum client version 1.2.0-9.03618

Note: Using this feature requires the resource to have the above minimum version declared in the meta.xml <min_mta_version> section. e.g. <min_mta_version client="1.2.0-9.03618" />

See Also