94 lines
2.8 KiB
Lua
94 lines
2.8 KiB
Lua
|
|
--
|
|
-- Anaglym std library
|
|
--
|
|
-- History:
|
|
-- 2009-11-02 Josh Holtrop Initial Revision
|
|
--
|
|
|
|
std = {}
|
|
|
|
-- Compute the cross product of two vectors
|
|
-- Input:
|
|
-- vec1: the first vector (table; indices 1..3)
|
|
-- vec2: the second vector (table; indices 1..3)
|
|
-- Output:
|
|
-- The cross product vector (table; indices 1..3)
|
|
std.crossProduct = function(vec1, vec2)
|
|
local vec_result = {}
|
|
vec_result[1] = vec1[2] * vec2[3] - vec1[3] * vec2[2]
|
|
vec_result[2] = vec1[3] * vec2[1] - vec1[1] * vec2[3]
|
|
vec_result[3] = vec1[1] * vec2[2] - vec1[2] * vec2[1]
|
|
return vec_result
|
|
end
|
|
|
|
-- Compute the dot product of two vectors
|
|
-- Input:
|
|
-- vec1: the first vector (table; indices 1..3)
|
|
-- vec2: the second vector (table; indices 1..3)
|
|
-- Output:
|
|
-- The dot product scalar
|
|
std.dotProduct = function(vec1, vec2)
|
|
return vec1[1] * vec2[1] + vec1[2] * vec2[2] + vec1[3] * vec2[3]
|
|
end
|
|
|
|
-- Create a plane
|
|
-- Input:
|
|
-- x, y, z: coordinates of a point on the plane
|
|
-- nx, ny, nz: normal vector of the plane
|
|
-- Output:
|
|
-- Plane object (returned from ag.createPlane())
|
|
std.createPlanePointNormal = function(x, y, z, nx, ny, nz)
|
|
-- calculate the d plane parameter based on the point coordinates
|
|
-- invoke the ag routine to create a plane based on a, b, c, d parameters
|
|
return ag.createPlane(nx, ny, nz, nx * x, ny * y, nz * z)
|
|
end
|
|
|
|
-- Convert screen percent to pixel count along X axis
|
|
-- Input:
|
|
-- percent: percent (0.0 - 1.0) of the screen's X axis
|
|
-- Output:
|
|
-- Number of pixels corresponding to 'percent' percent of the X axis
|
|
std.pctx = function(percent)
|
|
local width = ag.getScreenSize()
|
|
return width * percent
|
|
end
|
|
|
|
-- Convert screen percent to pixel count along Y axis
|
|
-- Input:
|
|
-- percent: percent (0.0 - 1.0) of the screen's Y axis
|
|
-- Output:
|
|
-- Number of pixels corresponding to 'percent' percent of the Y axis
|
|
std.pcty = function(percent)
|
|
local width, height = ag.getScreenSize()
|
|
return height * percent
|
|
end
|
|
|
|
-- Load an object from a model file and figure out what scale
|
|
-- to use based on a maximum specified bounding box the model must fit in.
|
|
-- Input:
|
|
-- model_name: the string containing the name of the model to load
|
|
-- max_x, max_y, max_z:
|
|
std.loadModelBounds = function(model_name, max_x, max_y, max_z)
|
|
local tmp_model = ag.loadModel(model_name)
|
|
local sx, sy, sz = tmp_model:getSize()
|
|
tmp_model:destroy()
|
|
local scale = 1.0
|
|
if (max_x > 0 and sx > 0) then
|
|
scale = max_x / sx
|
|
end
|
|
if (max_y > 0 and sy > 0) then
|
|
local s = max_y / sy
|
|
if (s < scale) then
|
|
scale = s
|
|
end
|
|
end
|
|
if (max_z > 0 and sz > 0) then
|
|
local s = max_z / sz
|
|
if (s < scale) then
|
|
scale = s
|
|
end
|
|
end
|
|
return ag.loadModel(model_name, scale)
|
|
end
|