199 lines
5.1 KiB
C
199 lines
5.1 KiB
C
/*
|
|
* Copyright (c) 1986, 1987, 1988, 1989 by Sun Microsystems, Inc.
|
|
* Permission to use, copy, modify, and distribute this software for any
|
|
* purpose and without fee is hereby granted, provided that the above
|
|
* copyright notice appear in all copies and that both that copyright
|
|
* notice and this permission notice are retained, and that the name
|
|
* of Sun Microsystems, Inc., not be used in advertising or publicity
|
|
* pertaining to this software without specific, written prior permission.
|
|
* Sun Microsystems, Inc., makes no representations about the suitability
|
|
* of this software or the interface defined in this software for any
|
|
* purpose. It is provided "as is" without express or implied warranty.
|
|
*/
|
|
#ifndef lint
|
|
static char sccsid[] = "@(#)ndctowld.c 1.1 94/10/31 Copyr 1986 Sun Micro";
|
|
#endif
|
|
|
|
/*
|
|
* Copyright (c) 1986 by Sun Microsystems, Inc.
|
|
*/
|
|
|
|
#include "coretypes.h"
|
|
#include "corevars.h"
|
|
|
|
/*
|
|
* Convert normalized device coordinates into world coordinates
|
|
*/
|
|
map_ndc_to_world_2(ndcx, ndcy, wldx, wldy)
|
|
float ndcx, ndcy, *wldx, *wldy;
|
|
{
|
|
|
|
/* Compute world coordinates using inverse transform */
|
|
static char funcname[] = "map_ndc_to_world_2";
|
|
register int nx, ny, round;
|
|
float f;
|
|
|
|
if (_core_check_x_form(funcname)) {
|
|
return(34);
|
|
}
|
|
|
|
f = ndcx;
|
|
f *= (float) MAX_NDC_COORD;
|
|
nx = _core_roundf(&f);
|
|
f = ndcy;
|
|
f *= (float) MAX_NDC_COORD;
|
|
ny = _core_roundf(&f);
|
|
|
|
if ((nx -= _core_poffx) < 0)
|
|
round = (-_core_scalex) >> 1;
|
|
else
|
|
round = _core_scalex >> 1;
|
|
nx = ((nx << 15) + round) / _core_scalex;
|
|
if ((ny -= _core_poffy) < 0)
|
|
round = (-_core_scaley) >> 1;
|
|
else
|
|
round = _core_scaley >> 1;
|
|
ny = ((ny << 15) + round) / _core_scaley;
|
|
|
|
*wldx = (float) nx *_core_invwxform[0][0] +
|
|
(float) ny *_core_invwxform[1][0] +
|
|
(float) MAX_NDC_COORD *_core_invwxform[3][0];
|
|
*wldy = (float) nx *_core_invwxform[0][1] +
|
|
(float) ny *_core_invwxform[1][1] +
|
|
(float) MAX_NDC_COORD *_core_invwxform[3][1];
|
|
|
|
return (0);
|
|
}
|
|
|
|
/*
|
|
* Convert world coordinates to normalized device coordinates.
|
|
*/
|
|
map_world_to_ndc_2(wldx, wldy, ndcx, ndcy)
|
|
float wldx, wldy, *ndcx, *ndcy;
|
|
{
|
|
static char funcname[] = "map_world_to_ndc_2";
|
|
pt_type p1, p2;
|
|
ipt_type ip;
|
|
|
|
/*
|
|
* Transform world coords to current viewport NDC coords
|
|
*/
|
|
|
|
if (_core_check_x_form(funcname)) {
|
|
return(34);
|
|
}
|
|
p1.x = wldx;
|
|
p1.y = wldy;
|
|
p1.z = 0.;
|
|
p1.w = 1.0;
|
|
_core_tranpt2(&p1.x, &p2.x);
|
|
_core_pt3cnvrt(&p2.x, &ip.x);
|
|
_core_vwpscale(&ip);
|
|
*ndcx = (float) ip.x / (float) MAX_NDC_COORD;
|
|
*ndcy = (float) ip.y / (float) MAX_NDC_COORD;
|
|
|
|
return (0);
|
|
}
|
|
|
|
/*
|
|
* Convert normalized device coordinates into world coordinates
|
|
*/
|
|
map_ndc_to_world_3(ndcx, ndcy, ndcz, wldx, wldy, wldz)
|
|
float ndcx, ndcy, ndcz, *wldx, *wldy, *wldz;
|
|
{
|
|
|
|
/*
|
|
* Compute world coordinates using inverse view transform
|
|
*/
|
|
|
|
static char funcname[] = "map_ndc_to_world_3";
|
|
register int nx, ny, nz, round;
|
|
float f;
|
|
|
|
if (_core_check_x_form(funcname)) {
|
|
return(34);
|
|
}
|
|
f = ndcx;
|
|
f *= (float) MAX_NDC_COORD;
|
|
nx = _core_roundf(&f);
|
|
f = ndcy;
|
|
f *= (float) MAX_NDC_COORD;
|
|
ny = _core_roundf(&f);
|
|
f = ndcz;
|
|
f *= (float) MAX_NDC_COORD;
|
|
nz = _core_roundf(&f);
|
|
|
|
if ((nx -= _core_poffx) < 0)
|
|
round = (-_core_scalex) >> 1;
|
|
else
|
|
round = _core_scalex >> 1;
|
|
nx = ((nx << 15) + round) / _core_scalex;
|
|
if ((ny -= _core_poffy) < 0)
|
|
round = (-_core_scaley) >> 1;
|
|
else
|
|
round = _core_scaley >> 1;
|
|
ny = ((ny << 15) + round) / _core_scaley;
|
|
if ((nz -= _core_poffz) < 0)
|
|
round = (-_core_scalez) >> 1;
|
|
else
|
|
round = _core_scalez >> 1;
|
|
nz = ((nz << 15) + round) / _core_scalez;
|
|
|
|
*wldx = (float) nx *_core_invwxform[0][0] +
|
|
(float) ny *_core_invwxform[1][0] +
|
|
(float) nz *_core_invwxform[2][0] +
|
|
(float) MAX_NDC_COORD *_core_invwxform[3][0];
|
|
*wldy = (float) nx *_core_invwxform[0][1] +
|
|
(float) ny *_core_invwxform[1][1] +
|
|
(float) nz *_core_invwxform[2][1] +
|
|
(float) MAX_NDC_COORD *_core_invwxform[3][1];
|
|
*wldz = (float) nx *_core_invwxform[0][2] +
|
|
(float) ny *_core_invwxform[1][2] +
|
|
(float) nz *_core_invwxform[2][2] +
|
|
(float) MAX_NDC_COORD *_core_invwxform[3][2];
|
|
|
|
return (0);
|
|
}
|
|
|
|
/*
|
|
* Convert world coordinates into normalized device coordinates.
|
|
*/
|
|
map_world_to_ndc_3(wldx, wldy, wldz, ndcx, ndcy, ndcz)
|
|
float wldx, wldy, wldz, *ndcx, *ndcy, *ndcz;
|
|
{
|
|
static char funcname[] = "map_world_to_ndc_3";
|
|
pt_type p1, p2;
|
|
ipt_type ip;
|
|
|
|
/* View transform world coords to current viewport coords */
|
|
if (_core_check_x_form(funcname)) {
|
|
return(34);
|
|
}
|
|
p1.x = wldx;
|
|
p1.y = wldy;
|
|
p1.z = wldz;
|
|
p1.w = 1.0;
|
|
_core_tranpt(&p1.x, &p2.x);
|
|
_core_pt3cnvrt(&p2.x, &ip.x);
|
|
_core_vwpscale(&ip);
|
|
*ndcx = (float) ip.x / (float) MAX_NDC_COORD;
|
|
*ndcy = (float) ip.y / (float) MAX_NDC_COORD;
|
|
*ndcz = (float) ip.z / (float) MAX_NDC_COORD;
|
|
|
|
return (0);
|
|
}
|
|
|
|
_core_check_x_form(funcname)
|
|
char *funcname;
|
|
{
|
|
|
|
if (_core_vtchang) {
|
|
if (_core_validvt(TRUE)) { /*** valid viewing transformation? ***/
|
|
_core_errhand(funcname, 34);
|
|
return (34);
|
|
}
|
|
}
|
|
return(0);
|
|
}
|
|
|