Function:ns2texpoly3d
From S2PLOT
(Difference between revisions)
Revision as of 03:13, 27 January 2009 S2plot admin (Talk | contribs) ← Previous diff |
Revision as of 04:58, 30 August 2011 S2plot admin (Talk | contribs) Next diff → |
||
Line 9: | Line 9: | ||
==Description== | ==Description== | ||
- | Draw a 3-d textured polygon. | + | Draw a 3-d textured polygon. The array iP holds the vertex coordinates, array iTC holds the texture coordinates, |
- | + | parameter <tt>in</tt> is the number of vertices, itrans is one of 'o' (opaque), 't' (transparent) or 's' (standard) and | |
+ | ialpha is the alpha channel value. | ||
==See Also== | ==See Also== | ||
<table> | <table> | ||
- | <tr><td>[[Function:ns2spheret |ns2spheret]]</td><td> Draw a textured sphere, with given centre, radius, colour and texture filename.</td></tr> | + | <tr> |
- | <tr><td>[[Function:ns2vspheret |ns2vspheret]]</td><td> Draw a textured sphere, with given centre, radius, colour and texture filename - vector input.</td></tr> | + | </tr> |
<table> | <table> | ||
Line 20: | Line 21: | ||
<code><pre> | <code><pre> | ||
+ | #include <stdio.h> | ||
+ | #include <stdlib.h> | ||
+ | #include "s2plot.h" | ||
+ | |||
+ | unsigned int texid; /* 3D Texture ID */ | ||
+ | |||
+ | void cb(double *t, int *kc) | ||
+ | { | ||
+ | int nverts = 4; /* Number of vertices in polygon */ | ||
+ | char trans = 't'; /* 3d texture transparency */ | ||
+ | float alpha = 0.7; /* Alpha channel value */ | ||
+ | |||
+ | XYZ iP[4]; /* Array of polygon vertices */ | ||
+ | XYZ iTC[4]; /* Array of texture coordinates */ | ||
+ | static float texidx = 0.0; /* Current z-texture coordinate */ | ||
+ | |||
+ | iP[0].x = iP[3].x = -1.0; /* Define polygon vertices */ | ||
+ | iP[1].x = iP[2].x = +1.0; | ||
+ | iP[0].y = iP[1].y = +1.0; | ||
+ | iP[2].y = iP[3].y = -1.0; | ||
+ | iP[0].z = iP[1].z = iP[2].z = iP[3].z = texidx*2.0 - 1.0; | ||
+ | |||
+ | iTC[0].x = iTC[3].x = 0.0; /* Define texture coordinates */ | ||
+ | iTC[1].x = iTC[2].x = 1.0; | ||
+ | iTC[0].y = iTC[1].y = 1.0; | ||
+ | iTC[2].y = iTC[3].y = 0.0; | ||
+ | iTC[0].z = iTC[1].z = iTC[2].z = iTC[3].z = texidx; | ||
+ | |||
+ | COLOUR col = { 1,1,1 }; /* Draw the polygon boundaries */ | ||
+ | ns2vline(iP[0],iP[1],col); | ||
+ | ns2vline(iP[1],iP[2],col); | ||
+ | ns2vline(iP[2],iP[3],col); | ||
+ | ns2vline(iP[3],iP[0],col); | ||
+ | |||
+ | ns2texpoly3d(iP, iTC, nverts, texid, trans, alpha); /* Draw 3D texture */ | ||
+ | |||
+ | texidx += (1.0/320.0); /* Choose next z-texture coordinate */ | ||
+ | if (texidx > 1.0) texidx = 0.0; | ||
+ | } | ||
+ | |||
+ | int main(int argc, char *argv[]) | ||
+ | { | ||
+ | int Nx = 32, Ny = 32, Nz = 32; /* Texture dimensions */ | ||
+ | int w,h,d; /* Returned dimensions */ | ||
+ | |||
+ | s2opend("/?",argc,argv); /* Open the s2plot display device */ | ||
+ | s2swin(-1,1,-1,1,-1,1); /* Set the world coordinates */ | ||
+ | s2box("BCDET",0,0,"BCDET",0,0,"BCDET",0,0); | ||
+ | |||
+ | texid = ss2c3dt(Nx, Ny, Nz); /* Create a new 3d texture */ | ||
+ | unsigned char *bits = (unsigned char *)ss2g3dt(texid, &w, &h, &d); | ||
+ | /* Get the texture data for modification */ | ||
+ | int i, j, k; | ||
+ | long idx; | ||
+ | float x,y,z; | ||
+ | for (i=0;i<Nx;i++) { | ||
+ | x = -1.0 + i*(2.0/(float)(Nx-1)); | ||
+ | for (j=0;j<Ny;j++) { | ||
+ | y = -1.0 + j*(2.0/(float)(Ny-1)); | ||
+ | for (k=0;k<Nz;k++) { | ||
+ | z = -1.0 + k*(2.0/(float)(Nz-1)); | ||
+ | idx = ((i*Ny + j)*Nz + k)*4; | ||
+ | if ((x*x + y*y + z*z) < 1.0) { /* 3D solid red sphere */ | ||
+ | bits[idx + 1 ] = 255; | ||
+ | ns2point(x,y,z,1,1,1); /* Plot point in sphere */ | ||
+ | } else { | ||
+ | bits[idx + 0 ] = 0; | ||
+ | } | ||
+ | |||
+ | bits[idx + 1 ] = 0; /* Blue channel */ | ||
+ | bits[idx + 2 ] = 0; /* Green channel */ | ||
+ | bits[idx + 3 ] = 255; /* Alpha channel */ | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | fprintf(stderr, "3d texture IS %d x %d x %d\n", w, h, d); | ||
+ | ss2pt(texid); /* Push back the texture */ | ||
+ | |||
+ | cs2scb(cb); /* Install a dynamic callback */ | ||
+ | |||
+ | s2show(1); /* Display the geometry */ | ||
+ | |||
+ | return 0; | ||
+ | } | ||
</pre></code> | </pre></code> | ||
Revision as of 04:58, 30 August 2011
ns2texpoly3d
Draw a 3-d textured polygon.
Prototype
void ns2texpoly3d(XYZ *iP, XYZ *iTC, float in, unsigned int texid, char itrans, float ialpha);
Description
Draw a 3-d textured polygon. The array iP holds the vertex coordinates, array iTC holds the texture coordinates, parameter in is the number of vertices, itrans is one of 'o' (opaque), 't' (transparent) or 's' (standard) and ialpha is the alpha channel value.