ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/libgender/material.C
Revision: 1.8
Committed: Thu Oct 21 15:46:38 2004 UTC (19 years, 7 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.7: +56 -0 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.1 #include "opengl.h"
2     #include "material.h"
3    
4 root 1.8 #include <cstdlib>
5     #include <cstring>
6    
7     namespace shader {
8    
9     static CGcontext cg_context = cgCreateContext ();
10    
11     int var_i::next_name = 0;
12    
13     var_i::var_i (CGtype cgtype)
14     {
15     name = ++next_name;
16     param = cgCreateParameter (cg_context, cgtype);
17     }
18    
19     var_i::~var_i ()
20     {
21     cgDestroyParameter (param);
22     }
23    
24     void var_i::build (shader_builder &b)
25     {
26     abort ();
27     }
28    
29     void var_i::build_decl (shader_builder &b)
30     {
31     abort ();
32     }
33    
34     template<int dimension, GLenum gltype, CGtype cgtype>
35     varying_i<dimension, gltype, cgtype>::varying_i (const char *binding)
36     : var_i (cgtype)
37     {
38     strcpy (this->binding, binding);
39     }
40    
41     varying_3f_i position_3f_i ("POSITION");
42     varying_3f_i normal_3f_i ("NORMAL");
43     varying_3f_i color0_3f_i ("COLOR0");
44     varying_3f_i color1_3f_i ("COLOR1");
45     varying_2f_i texcoord0_2f_i ("TEXCOORD0");
46     varying_2f_i texcoord1_2f_i ("TEXCOORD1");
47     varying_2f_i texcoord2_2f_i ("TEXCOORD2");
48     varying_2f_i texcoord3_2f_i ("TEXCOORD3");
49     varying_2f_i texcoord4_2f_i ("TEXCOORD4");
50     varying_2f_i texcoord5_2f_i ("TEXCOORD5");
51     varying_2f_i texcoord6_2f_i ("TEXCOORD6");
52     varying_2f_i texcoord7_2f_i ("TEXCOORD7");
53     varying_1f_i psize_1f_i ("PSIZE");
54     varying_1f_i attr6_1f_i ("ATTR6"), attr7_1f_i ("ATTR7");
55     varying_2f_i attr6_2f_i ("ATTR6"), attr7_2f_i ("ATTR7");
56     varying_3f_i attr6_3f_i ("ATTR6"), attr7_3f_i ("ATTR7");
57     }
58    
59 root 1.1 material::~material ()
60     {
61     }
62    
63 root 1.6 void
64     simple_material::begin ()
65 root 1.1 {
66 root 1.6 glMaterialfv (GL_FRONT, GL_DIFFUSE, (GLfloat *) & diffuse);
67     glMaterialfv (GL_FRONT, GL_SPECULAR, (GLfloat *) & specular);
68     glMaterialfv (GL_FRONT, GL_EMISSION, (GLfloat *) & emission);
69     glMaterialf (GL_FRONT, GL_SHININESS, shininess);
70 root 1.1 }
71    
72 root 1.6 void
73     simple_material::end ()
74 root 1.1 {
75     }
76 root 1.6
77     void
78     osama_material::begin ()
79 root 1.3 {
80     cgGLEnableProfile (vsh_profile);
81     cgGLEnableProfile (fsh_profile);
82 root 1.6 cgGLEnableTextureParameter (g_Texture);
83 root 1.3 }
84 root 1.6
85     void
86     osama_material::end ()
87 root 1.3 {
88 root 1.6 cgGLDisableTextureParameter (g_Texture);
89     // cgGLUnbindProgram (vsh_profile);
90     // cgGLUnbindProgram (fsh_profile);
91 root 1.3 cgGLDisableProfile (vsh_profile);
92     cgGLDisableProfile (fsh_profile);
93     }
94 root 1.1
95 root 1.6 GLuint
96     texture::load_texture (SDL_Surface * surface, GLfloat * tex2oord)
97 root 1.3 {
98 root 1.4 GLuint textur;
99 root 1.3 int w, h;
100     SDL_Surface *image;
101     SDL_Rect area;
102     Uint32 saved_flags;
103     Uint8 saved_alpha;
104    
105     /* Use the surface width and height expanded to powers of 2 */
106     //w = power_of_two (surface->w);
107     //h = power_of_two (surface->h);
108     w = power_of_two (surface->w);
109     h = power_of_two (surface->h);
110 root 1.5 tex2oord[0] = 0.0f; /* Min X */
111     tex2oord[1] = 0.0f; /* Min Y */
112     tex2oord[2] = (GLfloat) surface->w / w; /* Max X */
113     tex2oord[3] = (GLfloat) surface->h / h; /* Max Y */
114 root 1.3
115     image = SDL_CreateRGBSurface (SDL_SWSURFACE, w, h, 32,
116     #if SDL_BYTEORDER == SDL_LIL_ENDIAN /* OpenGL RGBA masks */
117     0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000
118     #else
119     0xFF000000, 0x00FF0000, 0x0000FF00, 0x000000FF
120     #endif
121     );
122 root 1.6
123 root 1.3 if (image == NULL)
124 root 1.6 return 0;
125 root 1.3
126     /* Save the alpha blending attributes */
127     saved_flags = surface->flags & (SDL_SRCALPHA | SDL_RLEACCELOK);
128     saved_alpha = surface->format->alpha;
129     if ((saved_flags & SDL_SRCALPHA) == SDL_SRCALPHA)
130 root 1.6 SDL_SetAlpha (surface, 0, 0);
131 root 1.3
132     /* Copy the surface into the GL texture image */
133     area.x = 0;
134     area.y = 0;
135     area.w = surface->w;
136     area.h = surface->h;
137     SDL_BlitSurface (surface, &area, image, &area);
138    
139     /* Restore the alpha blending attributes */
140     if ((saved_flags & SDL_SRCALPHA) == SDL_SRCALPHA)
141 root 1.6 SDL_SetAlpha (surface, saved_flags, saved_alpha);
142 root 1.3
143     /* Create an OpenGL texture for the image */
144 root 1.4 glGenTextures (1, &textur);
145     glBindTexture (GL_TEXTURE_2D, textur);
146 root 1.6 glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
147     glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
148 root 1.7 glTexParameteri (GL_TEXTURE_2D, GL_GENERATE_MIPMAP_SGIS, GL_TRUE); // GENERATE_MIPMAP_SGIS
149 root 1.3 glTexImage2D (GL_TEXTURE_2D,
150     0,
151     GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, image->pixels);
152     SDL_FreeSurface (image); /* No longer needed */
153    
154 root 1.4 return textur;
155 root 1.3 }
156    
157 root 1.6 CGcontext cgc;
158 root 1.3
159 root 1.6 void
160     init_shaders ()
161     {
162 root 1.3 cgc = cgCreateContext ();
163     }
164 root 1.8