void Surface::surface_commit(Resource *) { m_damage = m_pending.damage; if (m_pending.buffer || m_pending.newlyAttached) { setBackBuffer(m_pending.buffer); m_bufferRef = QWaylandBufferRef(m_buffer); if (m_attacher) m_attacher->attach(m_bufferRef); emit m_waylandSurface->configure(m_bufferRef); } m_pending.buffer = 0; m_pending.offset = QPoint(); m_pending.newlyAttached = false; m_pending.damage = QRegion(); if (m_buffer) m_buffer->setCommitted(); m_frameCallbacks << m_pendingFrameCallbacks; m_pendingFrameCallbacks.clear(); emit m_waylandSurface->redraw(); }
void MMSWindowClass::setAttributesFromTAFF(MMSTaffFile *tafff, string *path, bool reset_paths) { MMSFBColor color; if ((reset_paths)&&(path)&&(*path!="")) { // unset my paths unsetBgImagePath(); } startTAFFScan { switch (attrid) { case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_alignment: setAlignment(getAlignmentFromString(attrval_str)); break; case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_dx: setDx(attrval_str); break; case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_dy: setDy(attrval_str); break; case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_w: setWidth(attrval_str); break; case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_h: setHeight(attrval_str); break; case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_bgcolor: setBgColor(MMSFBColor((unsigned int)attrval_int)); break; case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_bgcolor_a: color.a = color.r = color.g = color.b = 0; if (isBgColor()) getBgColor(color); color.a = attrval_int; setBgColor(color); break; case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_bgcolor_r: color.a = color.r = color.g = color.b = 0; if (isBgColor()) getBgColor(color); color.r = attrval_int; setBgColor(color); break; case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_bgcolor_g: color.a = color.r = color.g = color.b = 0; if (isBgColor()) getBgColor(color); color.g = attrval_int; setBgColor(color); break; case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_bgcolor_b: color.a = color.r = color.g = color.b = 0; if (isBgColor()) getBgColor(color); color.b = attrval_int; setBgColor(color); break; case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_bgimage: if (*attrval_str) setBgImagePath(""); else setBgImagePath((path)?*path:""); setBgImageName(attrval_str); break; case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_bgimage_path: if (*attrval_str) setBgImagePath(attrval_str); else setBgImagePath((path)?*path:""); break; case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_bgimage_name: setBgImageName(attrval_str); break; case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_opacity: setOpacity(attrval_int); break; case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_fadein: setFadeIn((attrval_int) ? true : false); break; case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_fadeout: setFadeOut((attrval_int) ? true : false); break; case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_debug: setDebug((attrval_int) ? true : false); break; case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_margin: setMargin(attrval_int); break; case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_up_arrow: setUpArrow(attrval_str); break; case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_down_arrow: setDownArrow(attrval_str); break; case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_left_arrow: setLeftArrow(attrval_str); break; case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_right_arrow: setRightArrow(attrval_str); break; case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_navigate_up: setNavigateUp(attrval_str); break; case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_navigate_down: setNavigateDown(attrval_str); break; case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_navigate_left: setNavigateLeft(attrval_str); break; case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_navigate_right: setNavigateRight(attrval_str); break; case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_own_surface: #ifdef __HAVE_DIRECTFB__ if(attrval_int) { MMSConfigData config; if(config.getBackend() == MMSFB_BE_DFB) { cerr << "Warning: DirectFB backend does not support own_surface=true (ignored)" << endl; break; } } #endif setOwnSurface((attrval_int) ? true : false); break; case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_movein: setMoveIn(getDirectionFromString(attrval_str)); break; case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_moveout: setMoveOut(getDirectionFromString(attrval_str)); break; case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_modal: setModal((attrval_int) ? true : false); break; case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_static_zorder: setStaticZOrder((attrval_int) ? true : false); break; case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_always_on_top: setAlwaysOnTop((attrval_int) ? true : false); break; case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_focusable: setFocusable((attrval_int) ? true : false); break; case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_backbuffer: setBackBuffer((attrval_int) ? true : false); break; case MMSGUI_WINDOW_ATTR::MMSGUI_WINDOW_ATTR_IDS_initial_load: setInitialLoad((attrval_int) ? true : false); break; } } endTAFFScan if ((reset_paths)&&(path)&&(*path!="")) { // set my paths if (!isBgImagePath()) setBgImagePath(*path); } }
//----------------------------------------------------------------------------- //! 描画 //----------------------------------------------------------------------------- void TaskFilterLensFlare::render() { static const s32 SHADER_STANDARD = SystemShader::SHADER_FILTER; static const s32 SHADER_SUBTRACT = SystemShader::SHADER_SUBTRACT; static const s32 SHADER_EXPAND_BLUR = SystemShader::SHADER_EXPAND_BLUR; //------------------------------------------------------------- // (1) バックバッファからワークバッファにコピー // グレアの場合はぼかすので1/2バッファの縮小しておくことで // 後段パスが軽量化される(バイリニアで4ピクセル平均) //------------------------------------------------------------- copyToWorkTexture(SHADER_STANDARD, 0); // 半透明無効化 setBlendMode(BM_NONE); //------------------------------------------------------------- // (2)高輝度の成分を抽出 // 画像から閾値(Threshold)の分を減算 //------------------------------------------------------------- s32 index = 1; s32 mip = 0; //static float threshold = 0.9f; // タイトルで確認する時用 static float threshold = 2.5f; //static float threshold = 9.1f; static float scale = 1000.0f; Controller* control = GmControlMan()->getController(1); if(control->GetPadState(Controller::PAD_RB)){ threshold += 0.01f; }else if (control->GetPadState(Controller::PAD_LB)){ threshold -= 0.01f; } threshold = max(0.0f, threshold); GmShader()->changeShader(SystemShader::SHADER_SUBTRACT); GmShader()->setUniform1fv("gThreshold", (GLfloat*)&threshold); GmShader()->setUniform1fv("scale", (GLfloat*)&scale); setRenderTarget(index, mip); //setBackBuffer(); put(0, 0); // texuter[0] mip=0 : SUBTRACT GmShader()->beginPrevShader(); GmRender()->saveBackBuffer("レンズフレア差分"); //------------------------------------------------------------- // (3) アナモルフィックレンズのゴースト作成(線対称) //------------------------------------------------------------- /*GmShader()->changeShader(SystemShader::SHADER_LENS_FLARE); GmShader()->bindTexture("lensColorTex", _lensColorTex->getTextureHandle(), 1, GL_TEXTURE_1D); GmShader()->setUniform1i("isAnamolphic", (GLint)true); setRenderTarget(index ^ 1, mip); put(index, mip); index ^= 1; GmShader()->unbindTexture(GL_TEXTURE_1D); GmRender()->saveBackBuffer("レンズフレア作成後"); */ //------------------------------------------------------------- // (3) 横方向ブラー&青着色 //------------------------------------------------------------- //// 左右にブラーを掛けるため二回している //for (s32 d = 0; d<2; ++d){ // // 光の方向を指定 // f32 x = 1; // f32 y = 0.0f; // if(d == 1) { // x = -1; // //---- 一時保存しておいたテクスチャからコピー // setRenderTarget(index, mip); // put(_stockTexture, mip, SHADER_STANDARD); // } // GmShader()->changeShader(SystemShader::SHADER_GLARE); // // ブラー方向設定 // GmShader()->setUniform1f("gAttenuation", 0.99f); // // ブラー方向設定 // GmShader()->setUniform2fv("gDir2D", (GLfloat*)&Vector3(x, y, 0.0f)); // for (s32 i = 0; i<3; i++) // { // // ピクセルの間隔(1, 8, 64) // GmShader()->setUniform1f("gStride", (GLfloat)(pow(8, (f32)i))); // //---- 水平ブラー // setRenderTarget(index ^ 1, mip); // put(index, mip); // index ^= 1; // } // // 元に戻す // GmShader()->beginPrevShader(); // // 蓄積テクスチャに保存 // GmRender()->setRenderTarget(_accumTexture, Float2(0, 0), 0); // if(d==0){ // glClear(GL_COLOR_BUFFER_BIT); // } // setBlendMode(BM_ADD_NOALPHA); // put(index, mip, SHADER_STANDARD); //} // 光の方向を指定 f32 x = 1; f32 y = 0.0f; GmShader()->changeShader(SystemShader::SHADER_ANAMOLPHIC_FLARE); // ブラー方向設定 GmShader()->setUniform1f("gAttenuation", 0.98f); // ブラー方向設定 GmShader()->setUniform2fv("gDir2D", (GLfloat*)&Vector3(x, y, 0.0f)); for (s32 i = 0; i<3; i++) { // ピクセルの間隔(1, 8, 64) GmShader()->setUniform1f("gStride", (GLfloat)(pow(8, (f32)i))); //---- 水平ブラー setRenderTarget(index ^ 1, mip); put(index, mip); index ^= 1; } // 元に戻す GmShader()->beginPrevShader(); GmRender()->saveBackBuffer("レンズフレアブラー後 1/4サイズ"); //---- 2倍にバイリニアで拡大 { GmRender()->setRenderTarget(_bilenarExpandTex[0], Float2(0, 0), 0); put(index, mip, SHADER_EXPAND_BLUR); GmRender()->saveBackBuffer("バイリニアで2倍に拡大"); //---- 実行確認のため保存 GmRender()->setRenderTarget(_stockTexture, Float2(0, 0), 0); put(_bilenarExpandTex[0], mip, SHADER_STANDARD); GmRender()->saveBackBuffer("バイリニアで4倍に拡大"); } //---- 4点0.25フェッチでわずかにぼかしてバイリニアで拡大 { static f32 offset = 0.5f; if (GetKeyState(VK_OEM_PLUS) & 0x80){ offset += 0.01f; } else if (GetKeyState(VK_OEM_MINUS) & 0x80){ offset -= 0.01f; } GmShader()->changeShader(SystemShader::SHADER_EXPAND_BLUR); GmShader()->setUniform1f("gUVOffset", offset); GmRender()->setRenderTarget(_stockTexture, Float2(0, 0), 0); put(_bilenarExpandTex[0], mip); GmRender()->saveBackBuffer("ストックテクスチャ"); GmShader()->beginPrevShader(); } //------------------------------------------------------------- // (3) 通常レンズでのフレア&HALO作成 //------------------------------------------------------------- #if 0 GmShader()->changeShader(SystemShader::SHADER_LENS_FLARE); GmShader()->bindTexture("lensColorTex", _lensColorTex->getTextureHandle(), 1, GL_TEXTURE_1D); GmShader()->setUniform1i("isAnamolphic", (GLint)true); setRenderTarget(index^1, mip); put(index, mip); index ^= 1; GmShader()->unbindTexture(GL_TEXTURE_1D); GmRender()->saveBackBuffer("レンズフレア作成後"); #endif //------------------------------------------------------------- // (4) ガウシアンブラー→縮小を繰り返し、多段バッファ生成 //------------------------------------------------------------- # if 0 //---- 水平ブラー setRenderTarget(index ^ 1, mip); put(index, mip, SystemShader::SHADER_GAUSSIAN_3X3_H); index ^= 1; //---- 垂直ブラー setRenderTarget(index ^ 1, mip); put(index, mip, SystemShader::SHADER_GAUSSIAN_3X3_V); index ^= 1; while (mip<4) { //---- ミップ段数を一段下にコピー setRenderTarget(index, mip + 1); put(index, mip, SHADER_STANDARD); mip++; //---- 水平ブラー setRenderTarget(index ^ 1, mip); put(index, mip, SystemShader::SHADER_GAUSSIAN_3X3_H); index ^= 1; ////---- 垂直ブラー //setRenderTarget(index ^ 1, mip); //put(index, mip, SystemShader::SHADER_GAUSSIAN_3X3_V); //index ^= 1; } #endif #define IS_DIRT_AND_BURST 0 //------------------------------------------------------------- // (5) レンズ汚れ、スターバーストをつける //------------------------------------------------------------- #if IS_DIRT_AND_BURST GmShader()->changeShader(SystemShader::SHADER_LENS_DIRT_STAR); Matrix viewMatrix = GmScene()->getViewMatrix(); Vector3 right = Vector3(viewMatrix._m[0]); Vector3 viewDir = -Vector3(viewMatrix._m[2]); float camRot = Vector3::dot(right, Vector3(0,0,1)) + Vector3::dot(viewDir, Vector3(0,1,0)); Matrix cameraRotZMat = Matrix::rotateZ(Radian(camRot)); static Matrix scaleBias1 = Matrix( 2.0f, 0.0f, -1.0f, 0.0f, 0.0f, 2.0f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f ); static Matrix scaleBias2 = Matrix( 0.5f, 0.0f, 0.5f, 0.0f, 0.0f, 0.5f, 0.5f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f ); Matrix lensStarMatrix = scaleBias2 * cameraRotZMat * scaleBias1; //Matrix lensStarMatrix = cameraRotZMat; GmShader()->setMatrix4x4("lensStarMatrix", 1, GL_TRUE, (GLfloat*)&lensStarMatrix); GmShader()->bindTexture("lensStarTex", _lensStarBurstTex->getTextureHandle(), 3); GmShader()->bindTexture("lensDirtTex", _lensDirtTex->getTextureHandle(), 2); // 汚れテクスチャはmip 0 でやらないとぼやけてしまうため mip 0に対して行っている setRenderTarget(index^1, 0); put(index, mip); index ^= 1; GmShader()->unbindTexture(); GmShader()->beginPrevShader(); #endif //------------------------------------------------------------- // (6) 加算合成で全てをバックバッファに合成する //------------------------------------------------------------- setBackBuffer(); s32 workTextureIndex = index; s32 mipLevel = mip; // 汚れフィルタを通る場合はmipLevel 0でやっているためmipLevelを変更 if (IS_DIRT_AND_BURST == 1) { mipLevel = 0; } static bool isResult = false; // BACKボタンでレンズフレアのみ描画か加算合成かを切り替え if (control->GetPushState(Controller::PAD_BACK)){ isResult ^= true; } if (isResult){ setBlendMode(BM_NONE); //put(workTextureIndex, mipLevel, SHADER_STANDARD); put(_stockTexture, mipLevel, SHADER_STANDARD); }else{ setBlendMode(BM_ADD_NOALPHA); put(_stockTexture, mipLevel, SHADER_STANDARD); setBlendMode(BM_NONE); } }