void gpuSetUniformBool(u32 shader, ShaderType type, int id, bool value) { ShaderData* shdr = (ShaderData*) shader; if(shdr == NULL || shdr->dvlb == NULL) { return; } shaderInstance_s* instance = type == VERTEX_SHADER ? shdr->program.vertexShader : shdr->program.geometryShader; if(instance != NULL) { shaderInstanceSetBool(instance, id, value); } }
void drawPortals(portal_s* portals[], int n, renderSceneCallback_t callback, camera_s* c, int depth, u8 stencil) { if(!portals || !portalVertexData || !callback || !c || !depth)return; int i; gsSwitchRenderMode(-1); GPU_SetAttributeBuffers( 1, // number of attributes (u32*)osConvertVirtToPhys(portalBaseAddr), // we use the start of linear heap as base since that's where all our buffers are located GPU_ATTRIBFMT(0, 3, GPU_FLOAT), // we want v0 (vertex position) 0xFFE, // mask : we want v0 0x0, // permutation : we use identity 1, // number of buffers : we have one attribute per buffer (u32[]){(u32)portalOutlineVertexData-portalBaseAddr}, // buffer offsets (placeholders) (u64[]){0x0}, // attribute permutations for each buffer (u8[]){1} // number of attributes for each buffer ); gsPushMatrix(); shaderInstanceSetBool(portalProgram.vertexShader, 0, true); gsSetShader(&portalProgram); //TEMP int colorUniformLoc = shaderInstanceGetUniformLocation(portalProgram.vertexShader, "color"); GPU_SetTexEnv(0, GPU_TEVSOURCES(GPU_PRIMARY_COLOR, GPU_PRIMARY_COLOR, GPU_PRIMARY_COLOR), GPU_TEVSOURCES(GPU_PRIMARY_COLOR, GPU_PRIMARY_COLOR, GPU_PRIMARY_COLOR), GPU_TEVOPERANDS(0,0,0), GPU_TEVOPERANDS(0,0,0), GPU_MODULATE, GPU_MODULATE, 0xFFFFFFFF); for(i=0; i<n; i++) { portal_s* p = portals[i]; if(!p->draw)continue; GPU_SetFloatUniform(GPU_VERTEX_SHADER, colorUniformLoc, (u32*)(float[]){1.0f, p->color.z, p->color.y, p->color.x}, 1); gsPushMatrix(); gsTranslate(p->position.x, p->position.y, p->position.z); gsMultMatrix(p->matrix); gsUpdateTransformation(); GPU_DrawArray(GPU_TRIANGLE_STRIP, portalNumVertices); gsPopMatrix(); }