/* * 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" extern _intReadJPG, _intTextAttrs, _intTextHeight, _intTextAlign, _intTextOrient, _intTextExtrude, _intText3d; o3d::Display disp(nil,nil) { o3dDefaultOptFlags = o3d::OPT_USE_DL } proc main() { var intDisp, draw, lightColor = [1.,1.,1.], lightDir = [1.,1.,0.], ambColor = [1.,1.,1.], front = { 1.,0.,0., /* Color */ 0., /* Transp */ 1.,1.,1., /* SpecColor */ 0.1, /* Shininess */ 1.0, /* PrimSize */ 0xFFFFFFFFu, /* Visibility */ o3d::SURF_TWOSIDED, /* Flags */ 0, /* NumTex */ nil, nil, nil, nil, nil, nil, nil, nil }, back = { 0.,0.,1., /* Color */ 0., /* Transp */ 1.,1.,1., /* SpecColor */ 0.1, /* Shininess, */ 1.0, /* PrimSize */ 0xFFFFFFFFu, /* Visibility */ o3d::SURF_TWOSIDED, /* Flags */ 0, /* Num Textures */ nil, nil, nil, nil, nil, nil, nil, nil }, side = { 1.,0.,1., /* Color */ 0., /* Transp */ 1.,1.,1., /* SpecColor */ 0.1, /* Shininess, */ 4.0, /* PrimSize */ 0xFFFFFFFFu, /* Visibility */ o3d::SURF_WIREFRAME, /* Flags */ 0, /* Num Textures */ nil, nil, nil, nil, nil, nil, nil, nil }, cam = { true, /* Perspective */ true, /* Mirror */ 0.,0.,-5., /* Pos */ 0.,0.,1., /* Dir */ 0.,1.,0., /* Up */ 0.,0., /* Jitter */ 0.,0., /* Skew */ 30.0, 1.0, /* Field, aspect */ 1.,10., /* Planes */ nil }, Mat, ang = 0.0, texID, img, /* For the texture */ texOrient = { 1.,1.,1., /* Scale */ 0.,0.,0., /* Rotate */ 0.,0.,0. /* Pos */ }, i, wireframe = 0; // Copy attrib arrays since we need to modify them front = @front; back = @back; side = @side; if( wireframe ) { front[o3d::SURF_FLAGS] = o3d::SURF_TWOSIDED; back[o3d::SURF_FLAGS] = o3d::SURF_TWOSIDED; side[o3d::SURF_FLAGS] = o3d::SURF_WIREFRAME; } else { front[o3d::SURF_FLAGS] = o3d::SURF_BLEND; back[o3d::SURF_FLAGS] = 0; side[o3d::SURF_FLAGS] = 0; } disp.chooseVisual(o3d::VIS_DBUFF|o3d::VIS_DEPTH, 0); draw = disp.createWindow( "Test", 0, 0, 512, 512, 0 ); disp.makeCurrent( draw ); img = o3d::_intReadJPG("Texture/Earth.jpg"); if (img) { texID = disp.createTexture(img, o3d::TM_TRILINEAR, /* Filter */ o3d::TM_MODULATE, /* Apply */ o3d::TM_REPEAT, /* Bound */ o3d::TM_EXPLICIT, /* Coord mode */ texOrient, /* Orient */ 0 ); /* InternalFormat */ front[o3d::SURF_NUM_TEX] = 1; front[o3d::SURF_TEXTURE_IDS+0] = texID; back[o3d::SURF_NUM_TEX] = 1; back[o3d::SURF_TEXTURE_IDS+0] = texID; side[o3d::SURF_NUM_TEX] = 1; side[o3d::SURF_TEXTURE_IDS+0] = texID; } intDisp = disp._intGetHandle(); o3d::_intTextAttrs( intDisp, front, side, back ); o3d::_intTextHeight( intDisp, 1.0 ); o3d::_intTextAlign( intDisp, o3d::TEXT_ALIGN_CENTER, o3d::TEXT_ALIGN_CENTER, o3d::TEXT_ALIGN_CENTER ); o3d::_intTextOrient( intDisp, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0 ); o3d::_intTextExtrude( intDisp, 0.0, 0.0, 0.5 ); disp.ambientLight( 0.2, ambColor ); disp.enableLighting( true ); Mat = new PackFloat(16); while( 1 ) { disp.setCamera( cam ); disp.directionalLight( lightColor, lightDir ); o3d::RotateY( Mat, ang ); disp.pushMatrix( Mat ); o3d::_intText3d( intDisp, 0.0, 0.0, 0.0, "Test" ); disp.popMatrix(); disp.update( o3d::UPDATE_ALL ); ang += 0.5; } }