home games dev
Lewpen.com»Research & Development»3D Graphics»Java 3D Engine»3D Panoramas»Unfolded Panorama

Unfolded Panorama

Instead of rotating the cube the texture can be warped and the cube and view point can remain static

/ Source / idx3d_Math.java

// | -----------------------------------------------------------------
// | idx3d III is (c)1999/2000 by Peter Walser
// | -----------------------------------------------------------------
// | idx3d is a 3d engine written in 100% pure Java (1.1 compatible)
// | and provides a fast and flexible API for software 3d rendering
// | on the Java platform.
// |
// | Feel free to use the idx3d API / classes / source code for
// | non-commercial purposes (of course on your own risk).
// | If you intend to use idx3d for commercial purposes, please
// | contact me with an e-mail [proxima@active.ch].
// |
// | Thanx & greetinx go to:
// | * Wilfred L. Guerin, 	for testing, bug report, and tons 
// |			of brilliant suggestions
// | * Sandy McArthur,	for reverse loops
// | * Dr. Douglas Lyons,	for mentioning idx3d1 in his book
// | * Hugo Elias,		for maintaining his great page
// | * the comp.graphics.algorithms people, 
// | 			for scientific concerns
// | * Tobias Hill,		for inspiration and awakening my
// |			interest in java gfx coding
// | * Kai Krause,		for inspiration and hope
// | * Incarom & Parisienne,	for keeping me awake during the 
// |			long coding nights
// | * Doris Langhard,	for being the sweetest girl on earth
// | * Etnica, Infinity Project, X-Dream and "Space Night"@BR3
// | 			for great sound while coding
// | and all coderz & scenerz out there (keep up the good work, ppl :)
// |
// | Peter Walser
// | proxima@active.ch
// | http://www2.active.ch/~proxima
// | "On the eigth day, God started debugging"
// | -----------------------------------------------------------------

public final class idx3d_Math
// Singleton class for accelerated mathematical operations
{
	private static float sinus[];
	private static float cosinus[];
	private static boolean trig=false;
	public static float pi=3.1415926535f;
	private static float rad2scale=4096f/3.14159265f/2f;
	private static float pad=256*3.14159265f;
	
	private static int[] fastRandoms;
	private static int fastRndPointer=0;
	private static boolean fastRndInit=false;
	
	// A L L O W  NO  I N S T A N C E S
	
		private idx3d_Math() {}
	
	// T R I G O N O M E T R Y
	
		public static final float deg2rad(float deg)
		{
			return deg*0.0174532925194f;
		}
		
		public static final float rad2deg(float rad)
		{
			return rad*57.295779514719f;
		}
		
		public static final float sin(float angle)
		{
			if(!trig) buildTrig();
			return sinus[(int)((angle+pad)*rad2scale)&0xFFF];
		}
	
		public static final float cos(float angle)
		{
			if(!trig) buildTrig();
			return cosinus[(int)((angle+pad)*rad2scale)&0xFFF];
		}
	
		private static void buildTrig()
		{
			System.out.println(">> Building idx3d_Math LUT");
			sinus=new float[4096];
			cosinus=new float[4096];
		
			for (int i=0;i<4096;i++)
			{
				sinus[i]=(float)Math.sin((float)i/rad2scale);
				cosinus[i]=(float)Math.cos((float)i/rad2scale);
			}
			trig=true;
		}
		
		public static final float pythagoras(float a, float b)
		{
			return (float)Math.sqrt(a*a+b*b);
		}
		
		public static final int pythagoras(int a, int b)
		{
			return (int)Math.sqrt(a*a+b*b);
		}
		

	// R A N G E  T O O L S
	
		public static final int crop(int num, int min, int max)
		{
			return (num<min)?min:(num>max)?max:num;
		}
		
		public static final float crop(float num, float min, float max)
		{
			return (num<min)?min:(num>max)?max:num;
		}
		
		public static final boolean inrange(int num, int min, int max)
		{
			return ((num>=min)&&(num<max));
		}

	// B U F F E R   O P E R A T I O N S
	
		public static final void clearBuffer(int[] buffer, int value)
		{
			int size=buffer.length-1;
			int cleared=1;
			int index=1;
			buffer[0]=value;

			while (cleared<size)
			{
				System.arraycopy(buffer,0,buffer,index,cleared);
				size-=cleared;
				index+=cleared;
				cleared<<=1;
			}
			System.arraycopy(buffer,0,buffer,index,size);
		}
		
		public static final void cropBuffer(int[] buffer, int min, int max)
		{
			for (int i=buffer.length-1;i>=0;i--) buffer[i]=crop(buffer[i],min,max);
		}
		
		public static final void copyBuffer(int[] source, int[] target)
		{
			System.arraycopy(source,0,target,0,crop(source.length,0,target.length));
		}
		
		

	// R A N D O M  N U M B E R S
	
		public static final float random()
		{
			return (float)(Math.random()*2-1);
		}
	
		public static final float random(float min, float max)
		{
			return (float)(Math.random()*(max-min)+min);
		}
		
		public static final float randomWithDelta(float averidge, float delta)
		{
			return averidge+random()*delta;
		}
				
		public static final int fastRnd(int bits)
		{
			if (bits<1) return 0;
			fastRndPointer=(fastRndPointer+1)&31;
			if (!fastRndInit)
			{
				fastRandoms=new int[32];
				for (int i=0;i<32;i++) fastRandoms[i]=(int)random(0,0xFFFFFF);
				fastRndInit=true;
			}		
			return fastRandoms[fastRndPointer]&(1<<(bits-1));
		}
		
		public static final int fastRndBit()
		{
			return fastRnd(1);
		}
		
		public static final float interpolate(float a, float b, float d)
		{
			float f=(1-cos(d*pi))*0.5f;
			return a+f*(b-a);
		}
			
}

Comments

Related Articles

This is a barebones renderer for one object, with a software solid triangle rasteriser

Placing the viewpoint inside the cube and making the faces of the cube textured

Sponsored Links

Toys & Games:

Doggie Doo
Nerf Vortex
Monster High
Lagoona Hydration Station
Milky Bunny
Moshling Tree House
Lego Ninja Go Fire Temple
Fireman Sam Pontypandy Rescue
Rock Elmo
Star Wars Ultimate Force Lightsaber

Games

The Dodge Game
Flatspace

2-Player Games:

Quake 2D
Meteora

Puzzle Games:

Mini Tetris
Sudoku Solver

Development

3D Graphics:

3D Graphics Articles
WebGL Examples
Flash 3D Engine
Java 3D Engine

Development:

Programming Articles
Animation Demos
Game Development Examples

Links

iBuddy Social Network
Local Legends Football
PHP Charts & Graphs
CubeLogix Studios