home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Fresh Fish 5
/
FreshFish_July-August1994.bin
/
bbs
/
gfx
/
earth-1.0.lha
/
Earth-1.0
/
globe.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-05-22
|
3KB
|
107 lines
//===============================================================
// Picture on Sphere Mapper. (C) DEC 1993 L.Vanhelsuwe
// -------------------------
// History
// -------
// Sat Dec 11: started this file
// Fri Dec 24: improved loop to avoid writing out vertices with identical xyz
//===============================================================
//#include <m68881.h>
#include <math.h>
#include <stdio.h>
#include <strings.h>
#include <exec/types.h>
#include <intuition/intuition.h>
#include <proto/exec.h>
#include <proto/dos.h>
#include <proto/intuition.h>
#include <proto/graphics.h>
#define BALLRAD 150
#define SCREEN_WIDTH 320
#define SCREEN_HEIGHT 256
#define IM_WIDTH 320
#define IM_HEIGHT 200
struct NewScreen ns = {0,0,SCREEN_WIDTH,SCREEN_HEIGHT,2,
0,1,0,0,
NULL,"World Map Sphere Mapper",NULL,NULL};
struct Screen *myscreen;
struct IntuitionBase *IntuitionBase;
struct GfxBase *GfxBase;
struct RastPort *rp;
void load_picture( char * filename);
//=====================================================
main() {
LONG fh1;
char outstr[256];
float xnorm, ynorm;
int sx,sy, x,y,z, ox,oy,oz;
IntuitionBase = (void*) OpenLibrary("intuition.library",0);
GfxBase = (void*) OpenLibrary("graphics.library",0);
myscreen = (void*) OpenScreen(&ns);
rp = &myscreen->RastPort;
load_picture("GLOBE.raw");
fh1 = Open("RAM:3D.Globe", MODE_NEWFILE);
ox = oy = oz = PI;
// Sample entire 2-D picture for non-background pixels and convert all
// those into mapped 3-D pixels
for (sy=0; sy < IM_HEIGHT; sy++) {
for (sx=0; sx < IM_WIDTH; sx++) { // printf("(%d,%d) = ", sx, sy);
if (ReadPixel(rp,sx,sy)) { // transform all non-background
xnorm = 2*PI*((float)sx)/IM_WIDTH; // normalize to
ynorm = PI/2 - (PI*((float)sy)/IM_HEIGHT); // spherical range
// printf("(%3.2f,%3.2f)\n", xnorm, ynorm);
x = (int) (0.5+ BALLRAD*sin(xnorm)*cos(ynorm));
y = (int) (0.5+ BALLRAD*sin(ynorm));
z = (int) (0.5+ BALLRAD*cos(xnorm)*cos(ynorm));
if (x != ox || y != oy || z != oz) {
sprintf(outstr," DC.W %d,%d,%d\n", x,y,z);
// printf( " DC.W %d,%d,%d", x,y,z);
Write(fh1, outstr, strlen(outstr));
ox = x; oy = y; oz = z;
}
}
WritePixel(rp,sx,sy); // erase pixel as progress feedback
}
}
Close(fh1); // close generated file.
Execute("C:COPY RAM:3D.Globe 3d:WORLDS", NULL, NULL);
Execute("C:DELETE RAM:3D.globe", NULL, NULL);
CloseScreen(myscreen);
}
//=====================================================
//=====================================================
void load_picture(char * filename) {
LONG fh1;
fh1 = Open(filename, MODE_OLDFILE);
Read(fh1, myscreen->BitMap.Planes[0], IM_WIDTH/8*IM_HEIGHT);
Close(fh1);
}