VirtualBox

source: vbox/trunk/src/VBox/GuestHost/OpenGL/packer/pack_lights.c@ 70084

最後變更 在這個檔案從70084是 69392,由 vboxsync 提交於 7 年 前

GuestHost/OpenGL: scm updates

  • 屬性 svn:eol-style 設為 native
  • 屬性 svn:keywords 設為 Id Revision
檔案大小: 4.0 KB
 
1/* Copyright (c) 2001, Stanford University
2 * All rights reserved
3 *
4 * See the file LICENSE.txt for information on redistributing this software.
5 */
6
7#include "packer.h"
8#include "cr_error.h"
9
10static GLboolean __handleLightData(GLenum light, GLenum pname, const GLfloat *params)
11{
12 CR_GET_PACKER_CONTEXT(pc);
13 unsigned int packet_length = sizeof(int) + sizeof(light) + sizeof(pname);
14 unsigned int params_length = 0;
15 unsigned char *data_ptr;
16 switch(pname)
17 {
18 case GL_AMBIENT:
19 case GL_DIFFUSE:
20 case GL_SPECULAR:
21 case GL_POSITION:
22 params_length = 4*sizeof(*params);
23 break;
24 case GL_SPOT_DIRECTION:
25 params_length = 3*sizeof(*params);
26 break;
27 case GL_SPOT_EXPONENT:
28 case GL_SPOT_CUTOFF:
29 case GL_CONSTANT_ATTENUATION:
30 case GL_LINEAR_ATTENUATION:
31 case GL_QUADRATIC_ATTENUATION:
32 params_length = sizeof(*params);
33 break;
34 default:
35 __PackError(__LINE__, __FILE__, GL_INVALID_ENUM,
36 "crPackLight(bad pname)");
37 return GL_FALSE;
38 }
39 packet_length += params_length;
40 CR_GET_BUFFERED_POINTER(pc, packet_length);
41 WRITE_DATA(0, int, packet_length);
42 WRITE_DATA(sizeof(int) + 0, GLenum, light);
43 WRITE_DATA(sizeof(int) + 4, GLenum, pname);
44 WRITE_DATA(sizeof(int) + 8, GLfloat, params[0]);
45 if (params_length > sizeof(*params))
46 {
47 WRITE_DATA(sizeof(int) + 12, GLfloat, params[1]);
48 WRITE_DATA(sizeof(int) + 16, GLfloat, params[2]);
49 }
50 if (params_length > 3*sizeof(*params))
51 {
52 WRITE_DATA(sizeof(int) + 20, GLfloat, params[3]);
53 }
54 return GL_TRUE;
55}
56
57void PACK_APIENTRY crPackLightfv (GLenum light, GLenum pname, const GLfloat *params)
58{
59 CR_GET_PACKER_CONTEXT(pc);
60 if (__handleLightData(light, pname, params))
61 WRITE_OPCODE(pc, CR_LIGHTFV_OPCODE);
62 CR_UNLOCK_PACKER_CONTEXT(pc);
63}
64
65void PACK_APIENTRY crPackLightiv (GLenum light, GLenum pname, const GLint *params)
66{
67 /* floats and ints are the same size, so the packing should be the same */
68 CR_GET_PACKER_CONTEXT(pc);
69 if (__handleLightData(light, pname, (const GLfloat *) params))
70 WRITE_OPCODE(pc, CR_LIGHTIV_OPCODE);
71 CR_UNLOCK_PACKER_CONTEXT(pc);
72}
73
74static GLboolean __handleLightModelData(GLenum pname, const GLfloat *params)
75{
76 CR_GET_PACKER_CONTEXT(pc);
77 unsigned int packet_length = sizeof(int) + sizeof(pname);
78 unsigned int params_length = 0;
79 unsigned char *data_ptr;
80 switch(pname)
81 {
82 case GL_LIGHT_MODEL_AMBIENT:
83 params_length = 4*sizeof(*params);
84 break;
85 case GL_LIGHT_MODEL_TWO_SIDE:
86 case GL_LIGHT_MODEL_LOCAL_VIEWER:
87 params_length = sizeof(*params);
88 break;
89 default:
90 __PackError(__LINE__, __FILE__, GL_INVALID_ENUM,
91 "crPackLightModel(bad pname)");
92 return GL_FALSE;
93 }
94 packet_length += params_length;
95 CR_GET_BUFFERED_POINTER(pc, packet_length);
96 WRITE_DATA(0, int, packet_length);
97 WRITE_DATA(sizeof(int) + 0, GLenum, pname);
98 WRITE_DATA(sizeof(int) + 4, GLfloat, params[0]);
99 if (params_length > sizeof(*params))
100 {
101 WRITE_DATA(sizeof(int) + 8, GLfloat, params[1]);
102 WRITE_DATA(sizeof(int) + 12, GLfloat, params[2]);
103 WRITE_DATA(sizeof(int) + 16, GLfloat, params[3]);
104 }
105 return GL_TRUE;
106}
107
108void PACK_APIENTRY crPackLightModelfv (GLenum pname, const GLfloat *params)
109{
110 CR_GET_PACKER_CONTEXT(pc);
111 if (__handleLightModelData(pname, params))
112 WRITE_OPCODE(pc, CR_LIGHTMODELFV_OPCODE);
113 CR_UNLOCK_PACKER_CONTEXT(pc);
114}
115
116void PACK_APIENTRY crPackLightModeliv (GLenum pname, const GLint *params)
117{
118 /* floats and ints are the same size, so the packing should be the same */
119 CR_GET_PACKER_CONTEXT(pc);
120 if (__handleLightModelData(pname, (const GLfloat *) params))
121 WRITE_OPCODE(pc, CR_LIGHTMODELIV_OPCODE);
122 CR_UNLOCK_PACKER_CONTEXT(pc);
123}
注意: 瀏覽 TracBrowser 來幫助您使用儲存庫瀏覽器

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette