void *d3d_matrix_rotation_z(void *_pout, float angle) { struct d3d_matrix *pout = (struct d3d_matrix*)_pout; d3d_matrix_identity(pout); pout->m[0][0] = cos(angle); pout->m[1][1] = cos(angle); pout->m[0][1] = sin(angle); pout->m[1][0] = -sin(angle); return pout; }
void *d3d_matrix_ortho_off_center_lh(void *_pout, float l, float r, float b, float t, float zn, float zf) { struct d3d_matrix *pout = (struct d3d_matrix*)_pout; d3d_matrix_identity(pout); pout->m[0][0] = 2.0f / (r - l); pout->m[1][1] = 2.0f / (t - b); pout->m[2][2] = 1.0f / (zf -zn); pout->m[3][0] = -1.0f -2.0f *l / (r - l); pout->m[3][1] = 1.0f + 2.0f * t / (b - t); pout->m[3][2] = zn / (zn -zf); return pout; }
static void d3d9_cg_renderchain_calc_and_set_shader_mvp( void *data, /* stock vertex program */ unsigned vp_width, unsigned vp_height, unsigned rotation) { struct d3d_matrix proj, ortho, rot, matrix; d3d_matrix_ortho_off_center_lh(&ortho, 0, vp_width, 0, vp_height, 0, 1); d3d_matrix_identity(&rot); d3d_matrix_rotation_z(&rot, rotation * (D3D_PI / 2.0)); d3d_matrix_multiply(&proj, &ortho, &rot); d3d_matrix_transpose(&matrix, &proj); d3d9_cg_set_param_matrix(data, NULL, "modelViewProj", (const void*)&matrix); }
static bool d3d9_cg_renderchain_create_first_pass( LPDIRECT3DDEVICE9 dev, cg_renderchain_t *cg_chain, d3d9_renderchain_t *chain, const struct LinkInfo *info, unsigned _fmt) { unsigned i; struct shader_pass pass; struct d3d_matrix ident; unsigned fmt = (_fmt == RETRO_PIXEL_FORMAT_RGB565) ? d3d9_get_rgb565_format() : d3d9_get_xrgb8888_format(); d3d_matrix_identity(&ident); d3d9_set_transform(dev, D3DTS_WORLD, (D3DMATRIX*)&ident); d3d9_set_transform(dev, D3DTS_VIEW, (D3DMATRIX*)&ident); pass.info = *info; pass.last_width = 0; pass.last_height = 0; pass.attrib_map = (struct unsigned_vector_list*) unsigned_vector_list_new(); chain->prev.ptr = 0; for (i = 0; i < TEXTURES; i++) { chain->prev.last_width[i] = 0; chain->prev.last_height[i] = 0; chain->prev.vertex_buf[i] = (LPDIRECT3DVERTEXBUFFER9) d3d9_vertex_buffer_new( chain->dev, 4 * sizeof(struct D3D9Vertex), D3DUSAGE_WRITEONLY, 0, D3DPOOL_DEFAULT, NULL); if (!chain->prev.vertex_buf[i]) return false; chain->prev.tex[i] = (LPDIRECT3DTEXTURE9) d3d9_texture_new(chain->dev, NULL, info->tex_w, info->tex_h, 1, 0, fmt, D3DPOOL_MANAGED, 0, 0, 0, NULL, NULL, false); if (!chain->prev.tex[i]) return false; d3d9_set_texture(chain->dev, 0, chain->prev.tex[i]); d3d9_set_sampler_minfilter(dev, 0, d3d_translate_filter(info->pass->filter)); d3d9_set_sampler_magfilter(dev, 0, d3d_translate_filter(info->pass->filter)); d3d9_set_sampler_address_u(dev, 0, D3DTADDRESS_BORDER); d3d9_set_sampler_address_v(dev, 0, D3DTADDRESS_BORDER); d3d9_set_texture(chain->dev, 0, NULL); } d3d9_cg_load_program(cg_chain, &pass, info->pass->source.path, true); if (!d3d9_cg_renderchain_init_shader_fvf(chain, &pass)) return false; shader_pass_vector_list_append(chain->passes, pass); return true; }