Difference between revisions of "Showview"

From EDukeWiki
Jump to navigation Jump to search
m
Line 1: Line 1:
showview <x> <y> <z> <angle> <horiz> <sector> <scrn_x1> <scrn_y1> <scrn_x2> <scrn_y2>
+
'''''showview''''' <x> <y> <z> <angle> <horiz> <sector> <scrn_x1> <scrn_y1> <scrn_x2> <scrn_y2>
  
Displays on-screen the view from in-game coordinates (<x>,<y>,<z>), looking at angle <angle> and with z-angle <horiz>, between screen coordinates (<scrn_x1>,<scrn_y1>) and (<scrn_x2>,<scrn_y2>).
+
Displays on-screen the view from in-game coordinates (<x>,<y>,<z>), looking at angle <angle> and with z-angle (up and down) <horiz>, between screen coordinates (<scrn_x1>,<scrn_y1>) and (<scrn_x2>,<scrn_y2>).
  
 
<sector> is the sector that contains the in-game coordinates.
 
<sector> is the sector that contains the in-game coordinates.
  
The on-screen coordinates can be in any shape; they do not have to be in the same x-y ratio as the screen resolution. However, different ratios can result in warping or graphical glitches in the view. The on-screen coordinates are in 320x200 scale.
+
The on-screen coordinates can be in any shape; they do not have to be in the same x-y ratio as the screen resolution. However, different ratios can result in warping or graphical glitches in the view. The on-screen coordinates are in 320×200 scale.
  
 
Keep in mind when using this command that the game will have to completely redraw everything from the specified perspective, which can produce a sizeable framerate hit.
 
Keep in mind when using this command that the game will have to completely redraw everything from the specified perspective, which can produce a sizeable framerate hit.
Line 11: Line 11:
 
This example will embed a small version of the player's view near the top left corner of the screen:
 
This example will embed a small version of the player's view near the top left corner of the screen:
  
<pre>
+
getplayer[THISACTOR].posx x
getplayer[THISACTOR].posx x
+
getplayer[THISACTOR].posy y
getplayer[THISACTOR].posy y
+
getplayer[THISACTOR].posz z
getplayer[THISACTOR].posz z
+
getplayer[THISACTOR].angle ang
getplayer[THISACTOR].angle ang
+
getplayer[THISACTOR].horiz horiz
getplayer[THISACTOR].horiz horiz
+
getplayer[THISACTOR].horizoff temp
getplayer[THISACTOR].horizoff temp
+
addvarvar horiz temp
addvarvar horiz temp
+
updatesectorz x y z sect
updatesectorz x y z sect
+
showview x y z ang horiz sect 16 8 56 39
showview x y z ang horiz sect 16 8 56 39
 
</pre>
 
  
 
This lengthy example will create a "gun camera" that shows a closeup view of wherever the player is currently aiming. In addition to showview and basic EDuke commands, it also uses [[updatesectorz]], [[myos]], and [[hitscan]], as well as the [[event]] [[EVENT_DISPLAYREST]].
 
This lengthy example will create a "gun camera" that shows a closeup view of wherever the player is currently aiming. In addition to showview and basic EDuke commands, it also uses [[updatesectorz]], [[myos]], and [[hitscan]], as well as the [[event]] [[EVENT_DISPLAYREST]].
  
<pre>
+
gamevar sv_scrnx1 0 0
gamevar sv_scrnx1 0 0
+
gamevar sv_scrny1 0 0
gamevar sv_scrny1 0 0
+
gamevar sv_scrnx2 0 0
gamevar sv_scrnx2 0 0
+
gamevar sv_scrny2 0 0
gamevar sv_scrny2 0 0
+
gamevar sv_sect 0 0
gamevar sv_sect 0 0
+
gamevar sv_temp1 0 0
gamevar sv_temp1 0 0
+
gamevar sv_temp2 0 0
gamevar sv_temp2 0 0
+
gamevar sv_x 0 0
gamevar sv_x 0 0
+
gamevar sv_y 0 0
gamevar sv_y 0 0
+
gamevar sv_z 0 0
gamevar sv_z 0 0
+
gamevar sv_hitx 0 0
gamevar sv_hitx 0 0
+
gamevar sv_hity 0 0
gamevar sv_hity 0 0
+
gamevar sv_hitz 0 0
gamevar sv_hitz 0 0
+
gamevar sv_cos 0 0
gamevar sv_cos 0 0
+
gamevar sv_sin 0 0
gamevar sv_sin 0 0
+
gamevar sv_ang 0 0
gamevar sv_ang 0 0
+
gamevar sv_horiz 0 0
gamevar sv_horiz 0 0
+
state sv_playerview
+
state sv_playerview
  getplayer[THISACTOR].posx sv_x
+
  getplayer[THISACTOR].posx sv_x
  getplayer[THISACTOR].posy sv_y
+
  getplayer[THISACTOR].posy sv_y
  getplayer[THISACTOR].posz sv_z
+
  getplayer[THISACTOR].posz sv_z
  subvar sv_z 512
+
  subvar sv_z 512
  getplayer[THISACTOR].cursectnum sv_sect
+
  getplayer[THISACTOR].cursectnum sv_sect
ends
+
ends
onevent EVENT_DISPLAYREST {
+
//get coords
+
onevent EVENT_DISPLAYREST {
  setvar sv_scrnx1 23
+
// get coords
  setvar sv_scrny1 16
+
  setvar sv_scrnx1 23
  setvarvar sv_scrnx2 sv_scrnx1 addvar sv_scrnx2 50
+
  setvar sv_scrny1 16
  setvarvar sv_scrny2 sv_scrny1 addvar sv_scrny2 47 // 31 for correct ratio
+
  setvarvar sv_scrnx2 sv_scrnx1 addvar sv_scrnx2 50
//display frame
+
  setvarvar sv_scrny2 sv_scrny1 addvar sv_scrny2 47 // 31 for correct ratio
  setvarvar sv_temp1 sv_scrnx1 subvar sv_temp1 7
+
// display frame
  setvarvar sv_temp2 sv_scrny1 subvar sv_temp2 8
+
  setvarvar sv_temp1 sv_scrnx1 subvar sv_temp1 7
  myos sv_temp1 sv_temp2 SCREENBREAK6 0 16
+
  setvarvar sv_temp2 sv_scrny1 subvar sv_temp2 8
//do the hitscan
+
  myos sv_temp1 sv_temp2 SCREENBREAK6 0 16
  getplayer[THISACTOR].ang sv_ang
+
// do the hitscan
  getplayer[THISACTOR].horiz sv_horiz
+
  getplayer[THISACTOR].ang sv_ang
  getplayer[THISACTOR].posx sv_hitx
+
  getplayer[THISACTOR].horiz sv_horiz
  getplayer[THISACTOR].posy sv_hity
+
  getplayer[THISACTOR].posx sv_hitx
  getplayer[THISACTOR].posz sv_hitz
+
  getplayer[THISACTOR].posy sv_hity
  getplayer[THISACTOR].cursectnum sv_temp2
+
  getplayer[THISACTOR].posz sv_hitz
  subvar sv_hitz 512
+
  getplayer[THISACTOR].cursectnum sv_temp2
  cos sv_cos sv_ang
+
  subvar sv_hitz 512
  sin sv_sin sv_ang
+
  cos sv_cos sv_ang
  setvar sv_temp1 100
+
  sin sv_sin sv_ang
  subvarvar sv_temp1 sv_horiz
+
  setvar sv_temp1 100
  getplayer[THISACTOR].horizoff sv_horiz
+
  subvarvar sv_temp1 sv_horiz
  subvarvar sv_temp1 sv_horiz
+
  getplayer[THISACTOR].horizoff sv_horiz
  shiftvarl sv_temp1 11
+
  subvarvar sv_temp1 sv_horiz
  hitscan sv_hitx sv_hity sv_hitz sv_temp2 sv_cos sv_sin sv_temp1 sv_temp2 sv_temp1 sv_temp1 sv_hitx sv_hity sv_hitz CLIPMASK1
+
  shiftvarl sv_temp1 11
 +
  hitscan sv_hitx sv_hity sv_hitz sv_temp2 sv_cos sv_sin sv_temp1 sv_temp2 sv_temp1 sv_temp1 sv_hitx sv_hity sv_hitz CLIPMASK1
 +
 +
  getplayer[THISACTOR].horiz sv_temp1
 +
  getplayer[THISACTOR].horizoff sv_horiz
 +
  addvarvar sv_horiz sv_temp1
 +
 +
// get distance between player and hitscan location
 +
  getplayer[THISACTOR].posx sv_x
 +
  getplayer[THISACTOR].posy sv_y
 +
  getplayer[THISACTOR].posz sv_z
 +
  subvarvar sv_x sv_hitx
 +
  mulvarvar sv_x sv_x
 +
  subvarvar sv_y sv_hity
 +
  mulvarvar sv_y sv_y
 +
  addvarvar sv_x sv_y
 +
  sqrt sv_x sv_x
 +
 +
  ifvarl sv_x 768 state sv_playerview // if dist < 768, just show the player's view
 +
  else { // otherwise, move camera 768 units back from hitscan location on x-y plane and adjust z accordingly
 +
subvarvar sv_z sv_hitz
 +
mulvar sv_z 768
 +
ifvare sv_x 0 setvar sv_x 1
 +
divvarvar sv_z sv_x
 +
addvarvar sv_z sv_hitz
 +
setvarvar sv_x sv_hitx
 +
setvarvar sv_y sv_hity
 +
mulvar sv_cos -768
 +
mulvar sv_sin -768
 +
divvar sv_cos 16384
 +
divvar sv_sin 16384
 +
addvarvar sv_x sv_cos
 +
addvarvar sv_y sv_sin
 +
subvar sv_z 512
 +
// if the calculated position isn't in a sector (this does happen) then just show the player's view
 +
updatesectorz sv_x sv_y sv_z sv_sect
 +
ifvare sv_sect -1 state sv_playerview
 +
// make sure the camera can still see the hitscan location
 +
cansee sv_x sv_y sv_z sv_sect sv_hitx sv_hity sv_hitz sv_temp2 sv_temp1
 +
ifvare sv_temp1 0 state sv_playerview
 +
  }
 +
// check again to make sure we're in a sector
 +
  ifvarn sv_sect -1 {
 +
// x y z ang horiz sect scrn_x scrn_y scrn_x2 scrn_y2
 +
showview sv_x sv_y sv_z sv_ang sv_horiz sv_sect sv_scrnx1 sv_scrny1 sv_scrnx2 sv_scrny2
 +
  }
 +
// display crosshair
 +
  addvarvar sv_scrnx1 sv_scrnx2 divvar sv_scrnx1 2
 +
  addvarvar sv_scrny1 sv_scrny2 divvar sv_scrny1 2
 +
  myos sv_scrnx1 sv_scrny1 CROSSHAIR 0 0
 +
}
 +
endevent
  
  getplayer[THISACTOR].horiz sv_temp1
 
  getplayer[THISACTOR].horizoff sv_horiz
 
  addvarvar sv_horiz sv_temp1
 
 
//get distance between player and hitscan location
 
  getplayer[THISACTOR].posx sv_x
 
  getplayer[THISACTOR].posy sv_y
 
  getplayer[THISACTOR].posz sv_z
 
  subvarvar sv_x sv_hitx
 
  mulvarvar sv_x sv_x
 
  subvarvar sv_y sv_hity
 
  mulvarvar sv_y sv_y
 
  addvarvar sv_x sv_y
 
  sqrt sv_x sv_x
 
 
  ifvarl sv_x 768 state sv_playerview //if dist < 768, just show the player's view
 
  else { //otherwise, move camera 768 units back from hitscan location on x-y plane and adjust z accordingly
 
subvarvar sv_z sv_hitz
 
mulvar sv_z 768
 
ifvare sv_x 0 setvar sv_x 1
 
divvarvar sv_z sv_x
 
addvarvar sv_z sv_hitz
 
setvarvar sv_x sv_hitx
 
setvarvar sv_y sv_hity
 
mulvar sv_cos -768
 
mulvar sv_sin -768
 
divvar sv_cos 16384
 
divvar sv_sin 16384
 
addvarvar sv_x sv_cos
 
addvarvar sv_y sv_sin
 
subvar sv_z 512
 
//if the calculated position isn't in a sector (this does happen) then just show the player's view
 
updatesectorz sv_x sv_y sv_z sv_sect
 
ifvare sv_sect -1 state sv_playerview
 
//make sure the camera can still see the hitscan location
 
cansee sv_x sv_y sv_z sv_sect sv_hitx sv_hity sv_hitz sv_temp2 sv_temp1
 
ifvare sv_temp1 0 state sv_playerview
 
  }
 
//check again to make sure we're in a sector
 
  ifvarn sv_sect -1 {
 
//x y z ang horiz sect scrn_x scrn_y scrn_x2 scrn_y2
 
showview sv_x sv_y sv_z sv_ang sv_horiz sv_sect sv_scrnx1 sv_scrny1 sv_scrnx2 sv_scrny2
 
  }
 
//display crosshair
 
  addvarvar sv_scrnx1 sv_scrnx2 divvar sv_scrnx1 2
 
  addvarvar sv_scrny1 sv_scrny2 divvar sv_scrny1 2
 
  myos sv_scrnx1 sv_scrny1 CROSSHAIR 0 0
 
}
 
endevent
 
</pre>
 
  
 
[[Category:EDuke32 specific commands]]
 
[[Category:EDuke32 specific commands]]
 
[[Category:Screen drawing commands]]
 
[[Category:Screen drawing commands]]

Revision as of 21:49, 16 February 2007

showview <x> <y> <z> <angle> <horiz> <sector> <scrn_x1> <scrn_y1> <scrn_x2> <scrn_y2>

Displays on-screen the view from in-game coordinates (<x>,<y>,<z>), looking at angle <angle> and with z-angle (up and down) <horiz>, between screen coordinates (<scrn_x1>,<scrn_y1>) and (<scrn_x2>,<scrn_y2>).

<sector> is the sector that contains the in-game coordinates.

The on-screen coordinates can be in any shape; they do not have to be in the same x-y ratio as the screen resolution. However, different ratios can result in warping or graphical glitches in the view. The on-screen coordinates are in 320×200 scale.

Keep in mind when using this command that the game will have to completely redraw everything from the specified perspective, which can produce a sizeable framerate hit.

This example will embed a small version of the player's view near the top left corner of the screen:

getplayer[THISACTOR].posx x
getplayer[THISACTOR].posy y
getplayer[THISACTOR].posz z
getplayer[THISACTOR].angle ang
getplayer[THISACTOR].horiz horiz
getplayer[THISACTOR].horizoff temp
addvarvar horiz temp
updatesectorz x y z sect
showview x y z ang horiz sect 16 8 56 39

This lengthy example will create a "gun camera" that shows a closeup view of wherever the player is currently aiming. In addition to showview and basic EDuke commands, it also uses updatesectorz, myos, and hitscan, as well as the event EVENT_DISPLAYREST.

gamevar sv_scrnx1 0 0
gamevar sv_scrny1 0 0
gamevar sv_scrnx2 0 0
gamevar sv_scrny2 0 0
gamevar sv_sect 0 0
gamevar sv_temp1 0 0
gamevar sv_temp2 0 0
gamevar sv_x 0 0
gamevar sv_y 0 0
gamevar sv_z 0 0
gamevar sv_hitx 0 0
gamevar sv_hity 0 0
gamevar sv_hitz 0 0
gamevar sv_cos 0 0
gamevar sv_sin 0 0
gamevar sv_ang 0 0
gamevar sv_horiz 0 0

state sv_playerview
  getplayer[THISACTOR].posx sv_x
  getplayer[THISACTOR].posy sv_y
  getplayer[THISACTOR].posz sv_z
  subvar sv_z 512
  getplayer[THISACTOR].cursectnum sv_sect
ends

onevent EVENT_DISPLAYREST {
// get coords
  setvar sv_scrnx1 23
  setvar sv_scrny1 16
  setvarvar sv_scrnx2 sv_scrnx1 addvar sv_scrnx2 50
  setvarvar sv_scrny2 sv_scrny1 addvar sv_scrny2 47 //  31 for correct ratio
// display frame
  setvarvar sv_temp1 sv_scrnx1 subvar sv_temp1 7
  setvarvar sv_temp2 sv_scrny1 subvar sv_temp2 8
  myos sv_temp1 sv_temp2 SCREENBREAK6 0 16
// do the hitscan
  getplayer[THISACTOR].ang sv_ang
  getplayer[THISACTOR].horiz sv_horiz
  getplayer[THISACTOR].posx sv_hitx
  getplayer[THISACTOR].posy sv_hity
  getplayer[THISACTOR].posz sv_hitz
  getplayer[THISACTOR].cursectnum sv_temp2
  subvar sv_hitz 512
  cos sv_cos sv_ang
  sin sv_sin sv_ang
  setvar sv_temp1 100
  subvarvar sv_temp1 sv_horiz
  getplayer[THISACTOR].horizoff sv_horiz
  subvarvar sv_temp1 sv_horiz
  shiftvarl sv_temp1 11
  hitscan sv_hitx sv_hity sv_hitz sv_temp2 sv_cos sv_sin sv_temp1 sv_temp2 sv_temp1 sv_temp1 sv_hitx sv_hity sv_hitz CLIPMASK1

  getplayer[THISACTOR].horiz sv_temp1
  getplayer[THISACTOR].horizoff sv_horiz
  addvarvar sv_horiz sv_temp1

// get distance between player and hitscan location
  getplayer[THISACTOR].posx sv_x
  getplayer[THISACTOR].posy sv_y
  getplayer[THISACTOR].posz sv_z
  subvarvar sv_x sv_hitx
  mulvarvar sv_x sv_x
  subvarvar sv_y sv_hity
  mulvarvar sv_y sv_y
  addvarvar sv_x sv_y
  sqrt sv_x sv_x

  ifvarl sv_x 768 state sv_playerview // if dist < 768, just show the player's view
  else { // otherwise, move camera 768 units back from hitscan location on x-y plane and adjust z accordingly
	subvarvar sv_z sv_hitz
	mulvar sv_z 768
	ifvare sv_x 0 setvar sv_x 1
	divvarvar sv_z sv_x
	addvarvar sv_z sv_hitz
	setvarvar sv_x sv_hitx
	setvarvar sv_y sv_hity
	mulvar sv_cos -768
	mulvar sv_sin -768
	divvar sv_cos 16384
	divvar sv_sin 16384
	addvarvar sv_x sv_cos
	addvarvar sv_y sv_sin
	subvar sv_z 512
// if the calculated position isn't in a sector (this does happen) then just show the player's view
	updatesectorz sv_x sv_y sv_z sv_sect
	ifvare sv_sect -1 state sv_playerview
// make sure the camera can still see the hitscan location
	cansee sv_x sv_y sv_z sv_sect sv_hitx sv_hity sv_hitz sv_temp2 sv_temp1
	ifvare sv_temp1 0 state sv_playerview
  }
// check again to make sure we're in a sector
  ifvarn sv_sect -1 {
	// x y z ang horiz sect scrn_x scrn_y scrn_x2 scrn_y2
	showview sv_x sv_y sv_z sv_ang sv_horiz sv_sect sv_scrnx1 sv_scrny1 sv_scrnx2 sv_scrny2
  }
// display crosshair
  addvarvar sv_scrnx1 sv_scrnx2 divvar sv_scrnx1 2
  addvarvar sv_scrny1 sv_scrny2 divvar sv_scrny1 2
  myos sv_scrnx1 sv_scrny1 CROSSHAIR 0 0
}
endevent