/*
* Copyright (c) 2024 Ross Cunniff
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
/* Significant portions of this code were adapted from Hoverware, whose
* GPL copyright is: */
/* (c) Copyright Hewlett-Packard Company 2001
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
using namespace oadl;
#include "libo3d.oah"
#include "libstd.oah"
o3d::Display disp(nil,nil) { o3dDefaultOptFlags = o3d::OPT_USE_DL }
var done = false;
var doPause = false;
var pauseLight = false;
var pauseCamera = false;
var pauseObject = false;
var doPerPixel = false;
proc callback(draw, event)
{
switch (event) {
case o3d::INPUT_KEYBOARD :
switch (arg(2)) {
case 27 : done = true;
case ' ' : doPause = !doPause;
case 'b', 'B' : doPerPixel = !doPerPixel;
case 'l', 'L' : pauseLight = !pauseLight;
case 'c', 'C' : pauseCamera = !pauseCamera;
case 'r', 'R' : pauseObject = !pauseObject;
}
case o3d::INPUT_DESTROY :
done = true;
case o3d::INPUT_CONFIG :
disp.viewport(0, 0, arg(4), arg(5));
}
}
proc main(args)
{
var graphN = 133, graphM = 165;
var wireframe = false;
var sampvert = false;
var reliefScale = 4.0;
var n = args.length();
for (var i = 1; i < n; i++) {
switch (args[i]) {
case "-wire" :
wireframe = true;
case "-rows" :
if( i < (n-1) ) {
i++;
graphN = str2var(args[i]);
}
case "-cols" :
if( i < (n-1) ) {
i++;
graphM = str2var(args[i]);
}
case "-rgb" :
sampvert = true;
case "-relief" :
if( i < (n-1) ) {
i++;
reliefScale = str2var(args[i]);
}
}
}
disp.chooseVisual(o3d::VIS_DBUFF|o3d::VIS_DEPTH, 0);
var draw = disp.createWindow( "Test", 100, 100, 512, 512, o3d::WIN_INPUT );
disp.makeCurrent(draw);
disp.inputHandler(callback);
var env = new o3d::Environ() {
AmbientFactor = 0.5
BackgroundColor = {0.0, 0.0, 1.0}
FogColor = {0.0, 0.0, 1.0}
Fog = true
FogPlanes = {1.0, 3.5}
FogType = o3d::FOG_LINEAR
};
var cam = new o3d::Camera() {
Planes = {0.5, 3.5}
Field = 90
Perspective = true
};
var tm = {
new o3d::Texture() {
FileName = "Texture/earthbump1k.jpg"
InternalFormat = o3d::TM_HEIGHT
Apply = o3d::TM_RELIEF
ReliefScale = reliefScale
},
new o3d::Texture() {
FileName = "Texture/earthmap1k.jpg"
InternalFormat = o3d::TM_COLOR
Apply = o3d::TM_MODULATE
CoordMode = o3d::TM_STAGE_0
},
new o3d::Texture() {
FileName = "Texture/earthspec1k.jpg"
InternalFormat = o3d::TM_COLOR
Apply = o3d::TM_GLOSS
CoordMode = o3d::TM_STAGE_0
}
};
var sphere = new o3d::Sphere() {
Texture = tm
Color = [1.0, 1.0, 1.0]
OptFlags = o3d::OPT_DL_ATTRS
HasNormals = true
HasTangent = true
GraphN = graphN
GraphM = graphM
Wireframe = wireframe
SampVert = sampvert
Shininess = 0.5
};
var light = new o3d::Light() {
Dir = {1.0, 1.0, -1.0}
};
var Mat = new PackFloat(16);
var CamAng = 0.0;
var Ang = 0.0;
var LightAng = 0.0;
while( !done ) {
env.draw(disp);
var cx;
var cy = (CamAng * math::PI / 180.0).cos();
var cz = (CamAng * math::PI / 180.0).sin();
with (cam) {
Pos = [0.0, 2.0*cy, 2.0*cz]
Dir = [0.0, -cy, -cz]
Up = [0.0, -cz, cy]
}
cx = (LightAng * math::PI / 180.0).cos();
cy = (LightAng * math::PI / 180.0).sin();
with (light) {
Dir = [cx, cy, 0.0]
}
cam.draw();
light.draw();
o3d::RotateY(Mat, Ang);
disp.pushMatrix(Mat);
sphere.draw();
disp.popMatrix();
disp.update( o3d::UPDATE_ALL );
if (!doPause) {
if (!pauseObject) {
Ang += 0.4;
if (Ang > 360.0) Ang -= 360.0;
}
if (!pauseCamera) {
CamAng += 0.08;
if (CamAng > 360.0) CamAng -= 360.0;
}
if (!pauseLight) {
LightAng += 1.6;
if (LightAng > 360.0) LightAng -= 360.0;
}
}
}
}