/*
* 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 = 0;
proc callback(draw, event)
{
switch( event ) {
case o3d::INPUT_KEYBOARD :
if( arg(2) == 27 ) {
done = 1;
}
case o3d::INPUT_DESTROY :
done = 1;
case o3d::INPUT_CONFIG :
disp.viewport(0, 0, arg(4), arg(5));
}
}
proc main(args)
{
var
n,
draw,
env, sphere, light, cam, tm,
CamAng = 0.0,
cy, cz,
Mat,
Ang = 0.0,
graphN = 133, graphM = 165, i, wireframe = false, sampvert = false;
n = args.length();
for( 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;
}
}
disp.chooseVisual(o3d::VIS_DBUFF|o3d::VIS_DEPTH, 0);
draw = disp.createWindow( "Test", 100, 100, 512, 512, o3d::WIN_INPUT );
disp.makeCurrent(draw);
disp.inputHandler(callback);
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
};
cam = new o3d::Camera() {
Planes = [0.5, 3.5]
Field = 90
Perspective = true
};
tm = new o3d::Texture() {
FileName = "Texture/Earth.jpg"
Scale = [1.0, 0.75, 1.0]
Pos = [0.0, 0.25, 0.0]
};
sphere = new o3d::Sphere() {
Texture = tm
Color = [1.0, 0.8, 0.4]
OptFlags = o3d::OPT_DL_ATTRS
HasNormals = true
TwoSided = true
GraphN = graphN
GraphM = graphM
Wireframe = wireframe
SampVert = sampvert
LatRange = [-45, 90]
Shininess = 0.1
};
light = new o3d::Light() {
Dir = [1.0, 1.0, -1.0]
};
Mat = new PackFloat(16);
while( !done ) {
env.draw(disp);
cy = math::cos(CamAng * math::PI / 180.0);
cz = math::sin(CamAng * math::PI / 180.0);
with (cam) {
Pos = [0.0, 2.0*cy, 2.0*cz]
Dir = [0.0, -cy, -cz]
Up = [0.0, -cz, cy]
}
cam.draw();
light.draw();
o3d::RotateY( Mat, Ang );
disp.pushMatrix(Mat);
sphere.draw();
disp.popMatrix();
disp.update( o3d::UPDATE_ALL );
Ang += 5.0;
if( Ang > 360.0 ) Ang -= 360.0;
CamAng += 4.0;
if( CamAng > 360.0 ) CamAng -= 360.0;
}
}