Name

    SGIS_point_line_texgen

Name Strings

    GL_SGIS_point_line_texgen

Version

    Last Modified Date: April 3, 1999
    Author Revision: $Header: //depot/main/doc/registry/extensions/SGI/point_line_texgen.spec#4 $

Number

    213

Dependencies

    OpenGL 1.1 is required.

Overview

    This extension adds two texture coordinate generation modes, both
    which generate a texture coordinate based on the minimum distance 
    from a vertex to a specified line.

New Procedures and Functions

    None

New Tokens

    Accepted by the <params> parameters of TexGeni, TexGenf, TexGend,
    TexGeniv, TexGenfv, and TexGendv:

	EYE_DISTANCE_TO_POINT_SGIS	0x81F0
	OBJECT_DISTANCE_TO_POINT_SGIS	0x81F1
	EYE_DISTANCE_TO_LINE_SGIS	0x81F2
	OBJECT_DISTANCE_TO_LINE_SGIS	0x81F3

    Accepted by the <pname> parameters of TexGeniv, TexGenfv, and TexGendv:

	EYE_POINT_SGIS			0x81F4
	OBJECT_POINT_SGIS		0x81F5
	EYE_LINE_SGIS			0x81F6
	OBJECT_LINE_SGIS		0x81F7

Additions to Chapter 2 of the 1.0 Specification (OpenGL Operation)

    If TEXTURE_GEN_MODE indicates OBJECT_DISTANCE_TO_POINT_SGIS, then the
    generating function for the coordinate indicated by <coord> is

	g = || V' - P ||

    where

	P is a point (px/pw, py/pw, pz/pw)

        V' is (xo/wo, yo/wo, zo/wo)

    In other words, g is the distance in object coordinates from the 
    vertex to P.

    xo, yo, zo, and wo are the object coordinates of the vertex.

    P is specified by calling TexGen with <pname> set to OBJECT_POINT and 
    <params> pointing to an array containing px, py, pz, and pw, respectively.

    If TEXTURE_GEN_MODE indicates EYE_DISTANCE_TO_POINT_SGIS, then the
    generating function for the coordinate indicated by <coord> is the 
    same as above, but P, D, and V' are redefined as:

	P is a point (px'/pw', py'/pw', pz'/pw') where

					 |px|
					 |py|
		(px', py', pz', pw') = M |pz|
					 |pw|

	V' is (xe/we, ye/we, ze/we)

    In other words, g is the distance in eye coordinates from the 
    vertex to P.

    xe, ye, ze, and we are the eye coordinates of the vertex.

    P is specified by calling TexGen with <pname> set to EYE_POINT and 
    <params> pointing to an array containing px, py, pz, and pw, respectively.


    If TEXTURE_GEN_MODE indicates OBJECT_DISTANCE_TO_LINE_SGIS, then the
    generating function for the coordinate indicated by <coord> is

	g = || O - (O (dot) D') * D' ||

    where

	P is a point (px/pw, py/pw, pz/pw)

        D is a vector (dx, dy, dz) 

	D' is the normalized form of D

        V' is (xo/wo, yo/wo, zo/wo)

	O = V' - P

    In other words, g is the distance in object coordinates from the 
    vertex to the line defined by point P and direction D.

    xo, yo, zo, and wo are the object coordinates of the vertex.

    P and D are specified together by calling TexGen with <pname> set 
    to OBJECT_LINE and <params> pointing to an array containing px, py, 
    pz, pw, dx, dy, and dz, respectively.

    If TEXTURE_GEN_MODE indicates EYE_DISTANCE_TO_LINE_SGIS, then the
    generating function for the coordinate indicated by <coord> is the 
    same as above, but P, D, and V' are redefined as:

	P is a point (px'/pw', py'/pw', pz'/pw') where

					 |px|
					 |py|
		(px', py', pz', pw') = M |pz|
					 |pw|

	D is a direction vector (dx', dy', dz') where

						-1
		(dx', dy', dz') = (dx, dy, dz) M
						u

		and M  is the upper leftmost 3x3 matrix taken from the
		     u
		modelview matrix.

	V' is (xe/we, ye/we, ze/we)

    In other words, g is the distance in eye coordinates from the 
    vertex to the line defined by point P and direction D.

    xe, ye, ze, and we are the eye coordinates of the vertex.

    P and D are specified together by calling TexGen with <pname> set 
    to EYE_LINE and <params> pointing to an array containing px, py, 
    pz, pw, dx, dy, and dz, respectively.

Additions to Chapter 3 of the 1.0 Specification (Rasterization)

    None

Additions to Chapter 4 of the 1.0 Specification (Per-Fragment Operations
and the Frame Buffer)

    None

Additions to Chapter 5 of the 1.0 Specification (Special Functions)

    None

Additions to Chapter 6 of the 1.0 Specification (State and State Requests)

    None

New State
							Initial
    Get Value			Get Command	Type	Value			Attrib
    ---------			-----------	----	-------			------
    EYE_POINT_SGIS		GetTexGeniv	4 x R	{0,0,0,1}		texture
    OBJECT_POINT_SGIS		GetTexGeniv	4 x R	{0,0,0,1}		texture
    EYE_LINE_SGIS		GetTexGeniv	7 x R	{0,0,0,1,0,0,1}		texture
    OBJECT_LINE_SGIS		GetTexGeniv	7 x R	{0,0,0,1,0,0,1}		texture


