mirror of
https://github.com/scp-fs2open/fs2open.github.com.git
synced 2026-11-08 17:48:46 -10:00
307 lines
9.7 KiB
C++
307 lines
9.7 KiB
C++
//
|
|
//
|
|
|
|
#include <camera/camera.h>
|
|
#include "camera.h"
|
|
#include "vecmath.h"
|
|
#include "object.h"
|
|
#include "subsystem.h"
|
|
|
|
namespace scripting {
|
|
namespace api {
|
|
|
|
//**********HANDLE: Camera
|
|
ADE_OBJ(l_Camera, camid, "camera", "Camera handle");
|
|
|
|
ADE_FUNC(__tostring, l_Camera, NULL, "Camera name", "string", "Camera name, or an empty string if handle is invalid")
|
|
{
|
|
camid cid;
|
|
if(!ade_get_args(L, "o", l_Camera.Get(&cid)))
|
|
return ade_set_error(L, "s", "");
|
|
|
|
if(!cid.isValid())
|
|
return ade_set_error(L, "s", "");
|
|
|
|
return ade_set_args(L, "s", cid.getCamera()->get_name());
|
|
}
|
|
|
|
ADE_FUNC(isValid, l_Camera, NULL, "True if valid, false or nil if not", "boolean", "true if valid, false if handle is invalid, nil if a syntax/type error occurs")
|
|
{
|
|
camid cid;
|
|
if(!ade_get_args(L, "o", l_Camera.Get(&cid)))
|
|
return ADE_RETURN_NIL;
|
|
|
|
if(!cid.isValid())
|
|
return ADE_RETURN_FALSE;
|
|
|
|
return ADE_RETURN_TRUE;
|
|
}
|
|
|
|
ADE_VIRTVAR(Name, l_Camera, "string", "New camera name", "string", "Camera name")
|
|
{
|
|
camid cid;
|
|
char *s = NULL;
|
|
if(!ade_get_args(L, "o|s", l_Camera.Get(&cid), &s))
|
|
return ade_set_error(L, "s", "");
|
|
|
|
if(!cid.isValid())
|
|
return ade_set_error(L, "s", "");
|
|
|
|
if(ADE_SETTING_VAR && s != NULL) {
|
|
cid.getCamera()->set_name(s);
|
|
}
|
|
|
|
return ade_set_args(L, "s", cid.getCamera()->get_name());
|
|
}
|
|
|
|
ADE_VIRTVAR(FOV, l_Camera, "number", "New camera FOV (in radians)", "number", "Camera FOV (in radians)")
|
|
{
|
|
camid cid;
|
|
float f = VIEWER_ZOOM_DEFAULT;
|
|
if(!ade_get_args(L, "o|f", l_Camera.Get(&cid), &f))
|
|
return ade_set_error(L, "f", 0.0f);
|
|
|
|
if(!cid.isValid())
|
|
return ade_set_error(L, "f", 0.0f);
|
|
|
|
if(ADE_SETTING_VAR) {
|
|
cid.getCamera()->set_fov(f);
|
|
}
|
|
|
|
return ade_set_args(L, "f", cid.getCamera()->get_fov());
|
|
}
|
|
|
|
ADE_VIRTVAR(Orientation, l_Camera, "orientation", "New camera orientation", "orientation", "Camera orientation")
|
|
{
|
|
camid cid;
|
|
matrix_h *mh = NULL;
|
|
if(!ade_get_args(L, "o|o", l_Camera.Get(&cid), l_Matrix.GetPtr(&mh)))
|
|
return ade_set_error(L, "f", 0.0f);
|
|
|
|
if(!cid.isValid())
|
|
return ade_set_error(L, "f", 0.0f);
|
|
|
|
if(ADE_SETTING_VAR && mh != NULL) {
|
|
cid.getCamera()->set_rotation(mh->GetMatrix());
|
|
}
|
|
|
|
matrix mtx;
|
|
cid.getCamera()->get_info(NULL, &mtx);
|
|
return ade_set_args(L, "o", l_Matrix.Set(matrix_h(&mtx)));
|
|
}
|
|
|
|
ADE_VIRTVAR(Position, l_Camera, "vector", "New camera position", "vector", "Camera position")
|
|
{
|
|
camid cid;
|
|
vec3d *pos = NULL;
|
|
if(!ade_get_args(L, "o|o", l_Camera.Get(&cid), l_Vector.GetPtr(&pos)))
|
|
return ade_set_error(L, "o", l_Vector.Set(vmd_zero_vector));
|
|
|
|
if(!cid.isValid())
|
|
return ade_set_error(L, "o", l_Vector.Set(vmd_zero_vector));
|
|
|
|
if(ADE_SETTING_VAR && pos) {
|
|
cid.getCamera()->set_position(pos);
|
|
}
|
|
|
|
vec3d v = vmd_zero_vector;
|
|
cid.getCamera()->get_info(&v, NULL);
|
|
return ade_set_args(L, "o", l_Vector.Set(v));
|
|
}
|
|
|
|
ADE_VIRTVAR(Self, l_Camera, "object", "New mount object", "object", "Camera object")
|
|
{
|
|
camid cid;
|
|
object_h *oh = NULL;
|
|
if(!ade_get_args(L, "o|o", l_Camera.Get(&cid), l_Object.GetPtr(&oh)))
|
|
return ade_set_error(L, "o", l_Object.Set(object_h()));
|
|
|
|
if(!cid.isValid())
|
|
return ade_set_error(L, "o", l_Object.Set(object_h()));
|
|
|
|
if(ADE_SETTING_VAR && oh && oh->IsValid()) {
|
|
cid.getCamera()->set_object_host(oh->objp);
|
|
}
|
|
|
|
return ade_set_args(L, "o", l_Object.Set(object_h(cid.getCamera()->get_object_host())));
|
|
}
|
|
|
|
ADE_VIRTVAR(SelfSubsystem, l_Camera, "subsystem", "New mount object subsystem", "subsystem", "Subsystem that the camera is mounted on")
|
|
{
|
|
camid cid;
|
|
ship_subsys_h *sso = NULL;
|
|
if(!ade_get_args(L, "o|o", l_Camera.Get(&cid), l_Subsystem.GetPtr(&sso)))
|
|
return ade_set_error(L, "o", l_Subsystem.Set(ship_subsys_h()));
|
|
|
|
if(!cid.isValid())
|
|
return ade_set_error(L, "o", l_Subsystem.Set(ship_subsys_h()));
|
|
|
|
if(ADE_SETTING_VAR && sso && sso->IsValid()) {
|
|
cid.getCamera()->set_object_host(sso->objp, sso->ss->system_info->subobj_num);
|
|
}
|
|
|
|
object *objp = cid.getCamera()->get_object_host();
|
|
if(objp == NULL || objp->type != OBJ_SHIP)
|
|
return ade_set_error(L, "o", l_Subsystem.Set(ship_subsys_h()));
|
|
|
|
int submodel = cid.getCamera()->get_object_host_submodel();
|
|
if(submodel < 0)
|
|
return ade_set_error(L, "o", l_Subsystem.Set(ship_subsys_h()));
|
|
|
|
ship *shipp = &Ships[objp->instance];
|
|
polymodel *pm = model_get(Ship_info[shipp->ship_info_index].model_num);
|
|
|
|
if(pm == NULL)
|
|
return ade_set_error(L, "o", l_Subsystem.Set(ship_subsys_h()));
|
|
|
|
bsp_info *sm = &pm->submodel[submodel];
|
|
|
|
ship_subsys *ss = ship_get_subsys(shipp, sm->name);
|
|
|
|
if(ss == NULL)
|
|
return ade_set_error(L, "o", l_Subsystem.Set(ship_subsys_h()));
|
|
|
|
return ade_set_args(L, "o", l_Subsystem.Set(ship_subsys_h(objp, ss)));
|
|
}
|
|
|
|
ADE_VIRTVAR(Target, l_Camera, "object", "New target object", "object", "Camera target object")
|
|
{
|
|
camid cid;
|
|
object_h *oh = NULL;
|
|
if(!ade_get_args(L, "o|o", l_Camera.Get(&cid), l_Object.GetPtr(&oh)))
|
|
return ade_set_error(L, "o", l_Object.Set(object_h()));
|
|
|
|
if(!cid.isValid())
|
|
return ade_set_error(L, "o", l_Object.Set(object_h()));
|
|
|
|
if(ADE_SETTING_VAR && oh && oh->IsValid()) {
|
|
cid.getCamera()->set_object_target(oh->objp);
|
|
}
|
|
|
|
return ade_set_args(L, "o", l_Object.Set(object_h(cid.getCamera()->get_object_target())));
|
|
}
|
|
|
|
ADE_VIRTVAR(TargetSubsystem, l_Camera, "subsystem", "New target subsystem", "subsystem", "Subsystem that the camera is pointed at")
|
|
{
|
|
camid cid;
|
|
ship_subsys_h *sso = NULL;
|
|
if(!ade_get_args(L, "o|o", l_Camera.Get(&cid), l_Subsystem.GetPtr(&sso)))
|
|
return ade_set_error(L, "o", l_Subsystem.Set(ship_subsys_h()));
|
|
|
|
if(!cid.isValid())
|
|
return ade_set_error(L, "o", l_Subsystem.Set(ship_subsys_h()));
|
|
|
|
if(ADE_SETTING_VAR && sso && sso->IsValid()) {
|
|
cid.getCamera()->set_object_target(sso->objp, sso->ss->system_info->subobj_num);
|
|
}
|
|
|
|
object *objp = cid.getCamera()->get_object_target();
|
|
if(objp == NULL || objp->type != OBJ_SHIP)
|
|
return ade_set_error(L, "o", l_Subsystem.Set(ship_subsys_h()));
|
|
|
|
int submodel = cid.getCamera()->get_object_target_submodel();
|
|
if(submodel < 0)
|
|
return ade_set_error(L, "o", l_Subsystem.Set(ship_subsys_h()));
|
|
|
|
ship *shipp = &Ships[objp->instance];
|
|
polymodel *pm = model_get(Ship_info[shipp->ship_info_index].model_num);
|
|
|
|
if(pm == NULL)
|
|
return ade_set_error(L, "o", l_Subsystem.Set(ship_subsys_h()));
|
|
|
|
bsp_info *sm = &pm->submodel[submodel];
|
|
|
|
ship_subsys *ss = ship_get_subsys(shipp, sm->name);
|
|
|
|
if(ss == NULL)
|
|
return ade_set_error(L, "o", l_Subsystem.Set(ship_subsys_h()));
|
|
|
|
return ade_set_args(L, "o", l_Subsystem.Set(ship_subsys_h(objp, ss)));
|
|
}
|
|
|
|
ADE_FUNC(setFOV, l_Camera, "[number FOV, number Zoom Time, number Zoom Acceleration Time, number Zoom deceleration Time]",
|
|
"Sets camera FOV"
|
|
"<br>FOV is the final field of view, in radians, of the camera."
|
|
"<br>Zoom Time is the total time to take zooming in or out."
|
|
"<br>Acceleration Time is the total time it should take the camera to get up to full zoom speed."
|
|
"<br>Deceleration Time is the total time it should take the camera to slow down from full zoom speed.",
|
|
"boolean", "true if successful, false or nil otherwise")
|
|
{
|
|
camid cid;
|
|
float n_fov = VIEWER_ZOOM_DEFAULT;
|
|
float time=0.0f;
|
|
float acc_time=0.0f;
|
|
float dec_time=0.0f;
|
|
if(!ade_get_args(L, "o|ffff", l_Camera.Get(&cid), &n_fov, &time, &acc_time, &dec_time))
|
|
return ADE_RETURN_NIL;
|
|
|
|
if(!cid.isValid())
|
|
return ADE_RETURN_NIL;
|
|
|
|
cid.getCamera()->set_fov(n_fov, time, acc_time, dec_time);
|
|
|
|
return ADE_RETURN_TRUE;
|
|
}
|
|
|
|
ADE_FUNC(setOrientation, l_Camera, "[world orientation Orientation, number Rotation Time, number Acceleration Time, number Deceleration time]",
|
|
"Sets camera orientation and velocity data."
|
|
"<br>Orientation is the final orientation for the camera, after it has finished moving. If not specified, the camera will simply stop at its current orientation."
|
|
"<br>Rotation time (seconds) is how long total, including acceleration, the camera should take to rotate. If it is not specified, the camera will jump to the specified orientation."
|
|
"<br>Acceleration time (seconds) is how long it should take the camera to get 'up to speed'. If not specified, the camera will instantly start moving."
|
|
"<br>Deceleration time (seconds) is how long it should take the camera to slow down. If not specified, the camera will instantly stop moving.",
|
|
"boolean", "true if successful, false or nil otherwise")
|
|
{
|
|
camid cid;
|
|
matrix_h *mh=NULL;
|
|
float time=0.0f;
|
|
float acc_time=0.0f;
|
|
float dec_time=0.0f;
|
|
if(!ade_get_args(L, "o|offf", l_Camera.Get(&cid), l_Matrix.GetPtr(&mh), &time, &acc_time, &dec_time))
|
|
return ADE_RETURN_NIL;
|
|
|
|
if(!cid.isValid())
|
|
return ADE_RETURN_NIL;
|
|
|
|
camera *cam = cid.getCamera();
|
|
|
|
if(mh != NULL)
|
|
{
|
|
cam->set_rotation(mh->GetMatrix(), time, acc_time, dec_time);
|
|
}
|
|
else
|
|
{
|
|
cam->set_rotation();
|
|
}
|
|
|
|
return ADE_RETURN_TRUE;
|
|
}
|
|
|
|
ADE_FUNC(setPosition, l_Camera, "[wvector Position, number Translation Time, number Acceleration Time, number Deceleration Time]",
|
|
"Sets camera position and velocity data."
|
|
"<br>Position is the final position for the camera. If not specified, the camera will simply stop at its current position."
|
|
"<br>Translation time (seconds) is how long total, including acceleration, the camera should take to move. If it is not specified, the camera will jump to the specified position."
|
|
"<br>Acceleration time (seconds) is how long it should take the camera to get 'up to speed'. If not specified, the camera will instantly start moving."
|
|
"<br>Deceleration time (seconds) is how long it should take the camera to slow down. If not specified, the camera will instantly stop moving.",
|
|
"boolean", "true if successful, false or nil otherwise")
|
|
{
|
|
camid cid;
|
|
vec3d *pos=NULL;
|
|
float time=0.0f;
|
|
float acc_time=0.0f;
|
|
float dec_time=0.0f;
|
|
if(!ade_get_args(L, "o|offf", l_Camera.Get(&cid), l_Vector.GetPtr(&pos), &time, &acc_time, &dec_time))
|
|
return ADE_RETURN_NIL;
|
|
|
|
if(!cid.isValid())
|
|
return ADE_RETURN_NIL;
|
|
|
|
cid.getCamera()->set_position(pos, time, acc_time, dec_time);
|
|
|
|
return ADE_RETURN_TRUE;
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
|