[SNIPPET] Convert 3D position to 2D screencords

//0AB1: call_scm_func @getScreenXYFrom3DCoords 3 3D_coords_X 0@ Y 1@ Z 2@ store_screen_X_to 3@ Y_to 4@
:getScreenXYFrom3DCoords
0AC7: 14@ = var 0@ offset
0AC7: 15@ = var 3@ offset
0AC7: 16@ = var 6@ offset
0AC7: 17@ = var 9@ offset
0AA5: call 0x70CE30 num_params 6 pop 6 {18@ 18@} 0 0 17@ 16@ 15@ 14@
0007: 12@ = 640.0
0007: 13@ = 448.0
0A8D: 14@ = read_memory 0xC17044 size 4 virtual_protect 0
0A8D: 15@ = read_memory 0xC17048 size 4 virtual_protect 0
0093: 14@ = integer 14@ to_float
0093: 15@ = integer 15@ to_float
0073: 12@ /= 14@
0073: 13@ /= 15@
006B: 3@ *= 12@
006B: 4@ *= 13@
0AB2: ret 2 3@ 4@
 
Last edited:

ajom

Well-known member
Joined
Apr 14, 2020
Messages
389
Solutions
2
Reaction score
268
Location
Pluto
Permission to Post, I would like to give some update:

Snippet to convert World 3D Coordinates into 2D Screen Relative to the Window:
Code:
{
    pMultY - 6@v - returns the window height multiplier relative to the game screen(feed a dummy variable pointer if not used)
    pMultX - 5@v - returns the window width multiplier relative to the game screen(feed a dummy variable pointer if not used)
    pScreen - 3@v - returns 3@ 4@ - the Converted Window Screen Coordinate
    pCoords - 0@v - gets 0@ 1@ 2@ - feed the world 3D coordinates here

    Example:
        29@ = 1012.5234 // X pos
        30@ = 2942.2132 // Y pos
        31@ = 240.2123 // Z pos
        0AA5: call 0x70CE30 num_params 6 pop 6 bFarClip 0 bNearClip 0 pMultY 27@v pMultX 28@v pScreen 25@v pCoords 29@v // Convert GlobalXYZ To WindowScreenXY
        0AD1: show_formatted_text_highpriority "%f x %f" time 2000 25@ 26@
}
0AA5: call 0x70CE30 num_params 6 pop 6 bFarClip 0 bNearClip 0 pMultY 6@v pMultX 5@v pScreen 3@v pCoords 0@v // Convert GlobalXYZ To WindowScreenXY

Snippet to convert World 3D Coordinates into 2D Screen Relative to the Game:
Code:
:WorldXYZtoGameScreenXY
{
Parameters: 0AB1: @WorldXYZtoGameScreenXY 3 _from3Dcoord_XYZ 0@ 1@ 2@ _toscreencoord_XY 3@ 4@
   Passed:     0@ - position X     1@ - position Y     2@ - position Z
   Result:     3@ - screen X     4@ - screen Y
Example:   0AB1: @WorldXYZtoGameScreenXY 3 _from3Dcoord_XYZ 2488.562 -1666.865 12.8757 _toscreencoord_XY 1@ 2@
}
0AA5: call 0x70CE30 num_params 6 pop 6 bFarClip 0 bNearClip 0 pMultY 6@v pMultX 5@v pScreen 3@v pCoords 0@v // Convert WorldXYZ To WindowScreenXY

0A8D: 11@ = read_memory 0xC17044 size 4 virtual_protect 0 // full screen X
0093: 11@ = integer 11@ to_float
0A8D: 12@ = read_memory 0x859520 size 4 virtual_protect 0 // screen X scale
006B: 11@ *= 12@
0073: 3@ /= 11@

0A8D: 11@ = read_memory 0xC17048 size 4 virtual_protect 0 // full screen Y
0093: 11@ = integer 11@ to_float
0A8D: 12@ = read_memory 0x859524 size 4 virtual_protect 0 // screen Y scale
006B: 11@ *= 12@
0073: 4@ /= 11@

0AB2: ret 2 3@ 4@
 
Top