197 for (
size_t i = 0; i < _shader->_ptr_spec.size(); ++i) {
200 if (altered & (spec._dep[0] | spec._dep[1])) {
203 if (ptr_data ==
nullptr) {
210 int input_size = std::min(abs(spec._dim[0] * spec._dim[1] * spec._dim[2]), (
int)ptr_data->_size);
212 CGparameter p = _cg_parameter_map[spec._id._seqno];
213 switch (ptr_data->_type) {
214 case Shader::SPT_int:
215 cgSetParameterValueic(p, input_size, (
int *)ptr_data->_ptr);
218 case Shader::SPT_double:
219 cgSetParameterValuedc(p, input_size, (
double *)ptr_data->_ptr);
222 case Shader::SPT_float:
223 cgSetParameterValuefc(p, input_size, (
float *)ptr_data->_ptr);
228 << spec._id._name <<
": unrecognized parameter type\n";
235 for (
size_t i = 0; i < _shader->_mat_spec.size(); ++i) {
238 if (altered & (spec._dep[0] | spec._dep[1])) {
239 CGparameter p = _cg_parameter_map[spec._id._seqno];
247 LMatrix4f temp_matrix = LCAST(
float, *val);
248 LMatrix3f temp_matrix3;
253 data = temp_matrix.get_data();
257 global_data = (PN_stdfloat *)data;
258 global_shader_mat_spec = &spec;
259 global_internal_name_0 = global_shader_mat_spec->_arg[0];
260 global_internal_name_1 = global_shader_mat_spec->_arg[1];
263 switch (spec._piece) {
264 case Shader::SMP_whole:
266 temp_matrix.transpose_in_place();
267 data = temp_matrix.get_data();
269 hr = cgD3D9SetUniform(p, data);
272 case Shader::SMP_transpose:
274 hr = cgD3D9SetUniform(p, data);
277 case Shader::SMP_row0:
278 hr = cgD3D9SetUniform(p, data + 0);
280 case Shader::SMP_row1:
281 hr = cgD3D9SetUniform(p, data + 4);
283 case Shader::SMP_row2:
284 hr = cgD3D9SetUniform(p, data + 8);
286 case Shader::SMP_row3x1:
287 case Shader::SMP_row3x2:
288 case Shader::SMP_row3x3:
289 case Shader::SMP_row3:
290 hr = cgD3D9SetUniform(p, data + 12);
293 case Shader::SMP_col0:
294 v[0] = data[0]; v[1] = data[4]; v[2] = data[8]; v[3] = data[12];
295 hr = cgD3D9SetUniform(p, v);
297 case Shader::SMP_col1:
298 v[0] = data[1]; v[1] = data[5]; v[2] = data[9]; v[3] = data[13];
299 hr = cgD3D9SetUniform(p, v);
301 case Shader::SMP_col2:
302 v[0] = data[2]; v[1] = data[6]; v[2] = data[10]; v[3] = data[14];
303 hr = cgD3D9SetUniform(p, v);
305 case Shader::SMP_col3:
306 v[0] = data[3]; v[1] = data[7]; v[2] = data[11]; v[3] = data[15];
307 hr = cgD3D9SetUniform(p, v);
310 case Shader::SMP_upper3x3:
312 temp_matrix3 = temp_matrix.get_upper_3();
313 temp_matrix3.transpose_in_place();
314 data = temp_matrix3.get_data();
316 hr = cgD3D9SetUniform(p, data);
319 case Shader::SMP_transpose3x3:
321 temp_matrix3 = temp_matrix.get_upper_3();
322 data = temp_matrix3.get_data();
324 hr = cgD3D9SetUniform(p, data);
327 case Shader::SMP_cell15:
328 hr = cgD3D9SetUniform(p, data + 15);
330 case Shader::SMP_cell14:
331 hr = cgD3D9SetUniform(p, data + 14);
333 case Shader::SMP_cell13:
334 hr = cgD3D9SetUniform(p, data + 13);
339 <<
"issue_parameters () SMP parameter type not implemented " << spec._piece <<
"\n";
344 std::string name =
"unnamed";
347 name = spec._arg[0]->get_basename();
351 <<
"NAME " << name <<
"\n" <<
"MAT TYPE " << spec._piece
352 <<
" cgD3D9SetUniform failed " << D3DERRORSTRING(hr);
354 CGerror error = cgGetError();
355 if (error != CG_NO_ERROR) {
356 dxgsg9_cat.error() <<
" CG ERROR: " << cgGetErrorString(error) <<
"\n";
394#ifdef SUPPORT_IMMEDIATE_MODE
402 int nvarying = _shader->_var_spec.size();
403 LPDIRECT3DDEVICE9 device = gsg->_screen->_d3d_device;
408 if (_vertex_element_array !=
nullptr) {
409 delete _vertex_element_array;
421 bool apply_white_color =
false;
423 int number_of_arrays = gsg->_data_reader->get_num_arrays();
424 for (
int array_index = 0; array_index < number_of_arrays; ++array_index) {
426 gsg->_data_reader->get_array_reader(array_index);
427 if (array_reader ==
nullptr) {
428 dxgsg9_cat.error() <<
"Unable to get reader for array " << array_index <<
"\n";
432 for (
int var_index = 0; var_index < nvarying; ++var_index) {
433 CGparameter p = _cg_parameter_map[_shader->_var_spec[var_index]._id._seqno];
436 "No parameter in map for parameter " << var_index <<
437 " (probably optimized away)\n";
441 InternalName *name = _shader->_var_spec[var_index]._name;
445 int texslot = _shader->_var_spec[var_index]._append_uv;
446 if (texslot >= 0 && texslot < gsg->_state_texture->get_num_on_stages()) {
447 TextureStage *stage = gsg->_state_texture->get_on_stage(texslot);
449 if (name == InternalName::get_texcoord()) {
451 }
else if (texname != InternalName::get_texcoord()) {
456 if (name == InternalName::get_color() && !gsg->_vertex_colors_enabled) {
457 apply_white_color =
true;
462 Geom::NumericType numeric_type;
463 int num_values, start, stride;
464 if (!gsg->_data_reader->get_array_info(name, param_array_reader,
465 num_values, numeric_type,
472 dxgsg9_cat.info() <<
"Geometry contains no data for shader parameter " << *name <<
"\n";
473 if (name == InternalName::get_color()) {
474 apply_white_color =
true;
480 if (param_array_reader != array_reader) {
484 const char *semantic = cgGetParameterSemantic(p);
485 if (semantic ==
nullptr) {
486 dxgsg9_cat.error() <<
"Unable to retrieve semantic for parameter " << var_index <<
"\n";
490 if (strncmp(semantic,
"POSITION", strlen(
"POSITION")) == 0) {
491 if (numeric_type == Geom::NT_float32) {
492 switch (num_values) {
494 vertex_element_array->add_position_xyz_vertex_element(array_index, start);
497 vertex_element_array->add_position_xyzw_vertex_element(array_index, start);
500 dxgsg9_cat.error() <<
"VE ERROR: invalid number of vertex coordinate elements " << num_values <<
"\n";
504 dxgsg9_cat.error() <<
"VE ERROR: invalid vertex type " << numeric_type <<
"\n";
506 }
else if (strncmp(semantic,
"TEXCOORD", strlen(
"TEXCOORD")) == 0) {
507 int slot = atoi(semantic + strlen(
"TEXCOORD"));
508 if (numeric_type == Geom::NT_float32) {
509 switch (num_values) {
511 vertex_element_array->add_u_vertex_element(array_index, start, slot);
514 vertex_element_array->add_uv_vertex_element(array_index, start, slot);
517 vertex_element_array->add_uvw_vertex_element(array_index, start, slot);
520 vertex_element_array->add_xyzw_vertex_element(array_index, start, slot);
523 dxgsg9_cat.error() <<
"VE ERROR: invalid number of vertex texture coordinate elements " << num_values <<
"\n";
527 dxgsg9_cat.error() <<
"VE ERROR: invalid texture coordinate type " << numeric_type <<
"\n";
529 }
else if (strncmp(semantic,
"COLOR", strlen(
"COLOR")) == 0) {
530 if (numeric_type == Geom::NT_packed_dcba ||
531 numeric_type == Geom::NT_packed_dabc ||
532 numeric_type == Geom::NT_uint8) {
533 switch (num_values) {
535 vertex_element_array->add_diffuse_color_vertex_element(array_index, start);
538 dxgsg9_cat.error() <<
"VE ERROR: invalid color coordinates " << num_values <<
"\n";
542 dxgsg9_cat.error() <<
"VE ERROR: invalid color type " << numeric_type <<
"\n";
544 }
else if (strncmp(semantic,
"NORMAL", strlen(
"NORMAL")) == 0) {
545 if (numeric_type == Geom::NT_float32) {
546 switch (num_values) {
548 vertex_element_array->add_normal_vertex_element(array_index, start);
551 dxgsg9_cat.error() <<
"VE ERROR: invalid number of normal coordinate elements " << num_values <<
"\n";
555 dxgsg9_cat.error() <<
"VE ERROR: invalid normal type " << numeric_type <<
"\n";
557 }
else if (strncmp(semantic,
"BINORMAL", strlen(
"BINORMAL")) == 0) {
558 if (numeric_type == Geom::NT_float32) {
559 switch (num_values) {
561 vertex_element_array->add_binormal_vertex_element(array_index, start);
564 dxgsg9_cat.error() <<
"VE ERROR: invalid number of binormal coordinate elements " << num_values <<
"\n";
568 dxgsg9_cat.error() <<
"VE ERROR: invalid binormal type " << numeric_type <<
"\n";
570 }
else if (strncmp(semantic,
"TANGENT", strlen(
"TANGENT")) == 0) {
571 if (numeric_type == Geom::NT_float32) {
572 switch (num_values) {
574 vertex_element_array->add_tangent_vertex_element(array_index, start);
577 dxgsg9_cat.error() <<
"VE ERROR: invalid number of tangent coordinate elements " << num_values <<
"\n";
581 dxgsg9_cat.error() <<
"VE ERROR: invalid tangent type " << numeric_type <<
"\n";
584 dxgsg9_cat.error() <<
"Unsupported semantic " << semantic <<
" for parameter " << var_index <<
"\n";
591 dxgsg9_cat.error() <<
"Unable to setup vertex buffer for array " << array_index <<
"\n";
597 hr = device->SetStreamSource(array_index, dvbc->_vbuffer, 0, array_format->
get_stride());
599 dxgsg9_cat.error() <<
"SetStreamSource failed" << D3DERRORSTRING(hr);
603 _num_bound_streams = number_of_arrays;
605 if (apply_white_color) {
608 int array_index = number_of_arrays;
610 hr = device->SetStreamSource(array_index, vbuffer, 0, 0);
612 dxgsg9_cat.error() <<
"SetStreamSource failed" << D3DERRORSTRING(hr);
614 vertex_element_array->add_diffuse_color_vertex_element(array_index, 0);
615 ++_num_bound_streams;
618 if (_vertex_element_array !=
nullptr &&
619 _vertex_element_array->add_end_vertex_element()) {
620 if (dxgsg9_cat.is_debug()) {
625 if (cgD3D9ValidateVertexDeclaration(_cg_program,
626 _vertex_element_array->_vertex_element_array) == CG_TRUE) {
627 dxgsg9_cat.debug() <<
"cgD3D9ValidateVertexDeclaration succeeded\n";
629 dxgsg9_cat.debug() <<
"cgD3D9ValidateVertexDeclaration failed\n";
634 if (_vertex_declaration !=
nullptr) {
635 _vertex_declaration->Release();
636 _vertex_declaration =
nullptr;
639 hr = device->CreateVertexDeclaration(_vertex_element_array->_vertex_element_array,
640 &_vertex_declaration);
642 dxgsg9_cat.error() <<
"CreateVertexDeclaration failed" << D3DERRORSTRING(hr);
644 hr = device->SetVertexDeclaration(_vertex_declaration);
646 dxgsg9_cat.error() <<
"SetVertexDeclaration failed" << D3DERRORSTRING(hr);
650 dxgsg9_cat.error() <<
"VertexElementArray creation failed\n";
bool update_shader_vertex_arrays(DXShaderContext9 *prev, GSG *gsg, bool force)
Disables all vertex arrays used by the previous shader, then enables all the vertex arrays needed by ...
void disable_shader_vertex_arrays(GSG *gsg)
Disable all the vertex arrays used by this shader.
void disable_shader_texture_bindings(GSG *gsg)
Disable all the texture bindings used by this shader.
void update_shader_texture_bindings(DXShaderContext9 *prev, GSG *gsg)
Disables all texture bindings used by the previous shader, then enables all the texture bindings need...
void issue_parameters(GSG *gsg, int altered)
This function gets called whenever the RenderState or TransformState has changed, but the Shader itse...
Caches a GeomVertexArrayData in the DirectX device as a vertex buffer.
The ShaderContext is meant to contain the compiled version of a shader string.
This is a special class object that holds all the information returned by a particular GSG to indicat...
Defines the properties of a named stage of the multitexture pipeline.
Represents a texture object, which is typically a single 2-d image but may also represent a 1-d or 3-...
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.