From aae967c5f903d04d0d8543a2e8529491dd53dae9 Mon Sep 17 00:00:00 2001 From: Rivo Laks Date: Fri, 16 Mar 2007 13:02:47 +0000 Subject: [PATCH] Make your windows explode! Add ExplosionEffect which makes the windows blow up into small pieces when they're closed. In the future this could be used only when user kills (an unresponsive) window. svn path=/branches/work/kwin_composite/; revision=643135 --- CMakeLists.txt | 133 +++++++++++++++++- effects.cpp | 2 + effects/data/explosion-end.png | Bin 0 -> 34381 bytes effects/data/explosion-start.png | Bin 0 -> 33545 bytes effects/data/explosion.frag | 42 ++++++ effects/data/explosion.vert | 5 + effects/explosioneffect.cpp | 230 +++++++++++++++++++++++++++++++ effects/explosioneffect.h | 57 ++++++++ 8 files changed, 463 insertions(+), 6 deletions(-) create mode 100644 effects/data/explosion-end.png create mode 100644 effects/data/explosion-start.png create mode 100644 effects/data/explosion.frag create mode 100644 effects/data/explosion.vert create mode 100644 effects/explosioneffect.cpp create mode 100644 effects/explosioneffect.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 5e78dce2a1..9a1305526e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,7 +8,22 @@ add_subdirectory( pics ) add_subdirectory( clients ) add_subdirectory( data ) -include_directories( ${CMAKE_CURRENT_BINARY_DIR}/lib ${CMAKE_CURRENT_SOURCE_DIR}/lib ) +include_directories( + ${CMAKE_CURRENT_BINARY_DIR}/lib + ${CMAKE_CURRENT_SOURCE_DIR}/lib + ${CMAKE_CURRENT_SOURCE_DIR}/effects + ) + +include(UsePkgConfig) +PKGCONFIG(libcaptury CAPTURY_INCLUDES CAPTURY_LINK_DIR CAPTURY_LDFLAGS CAPTURY_CFLAGS) +if( CAPTURY_LDFLAGS ) + SET( CAPTURY_FOUND TRUE ) +endif( CAPTURY_LDFLAGS ) +macro_bool_to_01( CAPTURY_FOUND HAVE_CAPTURY ) + +configure_file(config-kwin.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-kwin.h ) +include_directories(${CMAKE_CURRENT_BINARY_DIR}) + ########### next target ############### @@ -35,28 +50,134 @@ set(kwin_KDEINIT_SRCS activation.cpp useractions.cpp geometry.cpp - rules.cpp ) + rules.cpp + composite.cpp + toplevel.cpp + unmanaged.cpp + scene.cpp + scene_basic.cpp + scene_xrender.cpp + scene_opengl.cpp + glutils.cpp + glutils_funcs.cpp + deleted.cpp + effects.cpp + effects/fade.cpp + effects/maketransparent.cpp + effects/scalein.cpp + effects/shakymove.cpp + effects/shiftworkspaceup.cpp + effects/howto.cpp + effects/dialogparent.cpp + effects/showfps.cpp + effects/zoom.cpp + effects/presentwindows.cpp + effects/minimizeanimation.cpp + effects/desktopchangeslide.cpp + effects/boxswitch.cpp + effects/fallapart.cpp + effects/drunken.cpp + effects/test_input.cpp + effects/test_thumbnail.cpp + ) + +if( CAPTURY_FOUND ) + set(kwin_KDEINIT_SRCS ${kwin_KDEINIT_SRCS} + effects/videorecord.cpp + ) + include_directories(${CAPTURY_INCLUDES}) +endif( CAPTURY_FOUND ) + +if(HAVE_OPENGL) + set(kwin_KDEINIT_SRCS ${kwin_KDEINIT_SRCS} + effects/wavywindows.cpp + effects/explosioneffect.cpp + ) +endif(HAVE_OPENGL) qt4_add_dbus_adaptor( kwin_KDEINIT_SRCS org.kde.KWin.xml workspace.h KWinInternal::Workspace ) -kde4_automoc(${kwin_KDEINIT_SRCS}) +kde4_automoc(kwin ${kwin_KDEINIT_SRCS}) kde4_add_kdeinit_executable( kwin ${kwin_KDEINIT_SRCS}) target_link_libraries(kdeinit_kwin ${KDE4_KDEUI_LIBS} kdecorations ${X11_LIBRARIES} ${QT_QT3SUPPORT_LIBRARY} ) +if(OPENGL_FOUND) + target_link_libraries(kdeinit_kwin ${OPENGL_gl_LIBRARY}) + # -ldl used by OpenGL code + target_link_libraries(kdeinit_kwin -ldl) +endif(OPENGL_FOUND) +if (X11_Xrandr_FOUND) + target_link_libraries(kdeinit_kwin ${X11_Xrandr_LIB}) +endif (X11_Xrandr_FOUND) +if (X11_Xcomposite_FOUND) + target_link_libraries(kdeinit_kwin ${X11_Xcomposite_LIB}) +endif (X11_Xcomposite_FOUND) +if (X11_Xdamage_FOUND) + target_link_libraries(kdeinit_kwin ${X11_Xdamage_LIB}) +endif (X11_Xdamage_FOUND) +if (X11_Xrender_FOUND) + target_link_libraries(kdeinit_kwin ${X11_Xrender_LIB}) +endif (X11_Xrender_FOUND) +if (X11_Xfixes_FOUND) + target_link_libraries(kdeinit_kwin ${X11_Xfixes_LIB}) +endif (X11_Xfixes_FOUND) +if( HAVE_CAPTURY ) + target_link_libraries(kdeinit_kwin ${CAPTURY_LDFLAGS}) +endif( HAVE_CAPTURY ) + install(TARGETS kdeinit_kwin DESTINATION ${LIB_INSTALL_DIR} ) target_link_libraries( kwin kdeinit_kwin ) -install(TARGETS kwin DESTINATION ${BIN_INSTALL_DIR}) +install(TARGETS kwin DESTINATION bin) ########### install files ############### install( FILES kwin.kcfg DESTINATION ${KCFG_INSTALL_DIR} ) install( FILES kwin.notifyrc DESTINATION ${DATA_INSTALL_DIR}/kwin ) -install( FILES org.kde.KWin.xml DESTINATION ${DBUS_INTERFACES_DIR} ) -kde4_install_icons( ${ICON_INSTALL_DIR} ) +install( FILES effects/data/explosion.frag effects/data/explosion.vert effects/data/explosion-start.png effects/data/explosion-end.png DESTINATION ${DATA_INSTALL_DIR}/kwin ) + +kde4_install_icons( ${ICON_INSTALL_DIR} crystalsvg ) + + +#original Makefile.am contents follow: + +#INCLUDES = -I$(srcdir)/lib $(all_includes) +# +#SUBDIRS = lib . killer kcmkwin pics clients oldheaders data +# +#bin_PROGRAMS = +#lib_LTLIBRARIES = +#kdeinit_LTLIBRARIES = kwin.la +# +#kwin_la_SOURCES = workspace.cpp client.cpp placement.cpp atoms.cpp \ +# utils.cpp layers.cpp main.cpp popupinfo.cpp tabbox.cpp \ +# options.cpp plugins.cpp events.cpp KWinInterface.skel \ +# killwindow.cpp geometrytip.cpp sm.cpp group.cpp bridge.cpp \ +# manage.cpp notifications.cpp activation.cpp useractions.cpp \ +# geometry.cpp rules.cpp +# +#kwin_la_LIBADD = $(LIB_KDEUI) lib/libkdecorations.la +#kwin_la_LDFLAGS = $(all_libraries) -module -avoid-version +# +#include_HEADERS = KWinInterface.h +# +#KDE_ICON = kwin +# +#METASOURCES = AUTO +# +#messages: rc.cpp +# $(XGETTEXT) *.h *.cpp killer/*.cpp lib/*.cpp -o $(podir)/kwin.pot +# +#kwin_datadir = $(kde_datadir)/kwin +# +#kwin_data_DATA= eventsrc +# +#kde_kcfg_DATA = kwin.kcfg +# +#include ../../admin/Doxyfile.am diff --git a/effects.cpp b/effects.cpp index 021020e143..47ac3f1a61 100644 --- a/effects.cpp +++ b/effects.cpp @@ -19,6 +19,7 @@ License. See the file "COPYING" for the exact licensing terms. #include "effects/desktopchangeslide.h" #include "effects/dialogparent.h" #include "effects/drunken.h" +#include "effects/explosioneffect.h" #include "effects/fade.h" #include "effects/howto.h" #include "effects/maketransparent.h" @@ -183,6 +184,7 @@ EffectsHandler::EffectsHandler() registerEffect("PresentWindows", new GenericEffectFactory); #ifdef HAVE_OPENGL registerEffect("WavyWindows", new GenericEffectFactory); + registerEffect("Explosion", new GenericEffectFactory); #endif registerEffect("MinimizeAnimation", new GenericEffectFactory); registerEffect("Howto", new GenericEffectFactory); diff --git a/effects/data/explosion-end.png b/effects/data/explosion-end.png new file mode 100644 index 0000000000000000000000000000000000000000..433b9b274f725e1b2732650c0e37495ceb900237 GIT binary patch literal 34381 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 literal 0 HcmV?d00001 diff --git a/effects/data/explosion-start.png b/effects/data/explosion-start.png new file mode 100644 index 0000000000000000000000000000000000000000..2da11af633ad968a2eca7d05e13fbcdd194d9382 GIT binary patch literal 33545 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 Z@*lEVtUs)(K)V0{002ovPDHLkV1kp-EmQyi literal 0 HcmV?d00001 diff --git a/effects/data/explosion.frag b/effects/data/explosion.frag new file mode 100644 index 0000000000..863ea50b84 --- /dev/null +++ b/effects/data/explosion.frag @@ -0,0 +1,42 @@ +uniform sampler2D winTexture; +uniform sampler2D startOffsetTexture; +uniform sampler2D endOffsetTexture; +uniform float factor; +uniform float scale; + +const float regionTexSize = 512.0; + + +vec2 getOffset(sampler2D texture, vec2 pos) +{ + return (texture2D(texture, pos / regionTexSize).xy - 0.5) / (5.0 / 256.0); +} + +void main() +{ + // Original (unscaled) position in pixels + vec2 origpos = gl_TexCoord[0].xy; + // Position in pixels on the scaled window + vec2 pos = origpos * scale; + // Start/end position of current region + vec2 rstart = origpos + getOffset(startOffsetTexture, origpos); + vec2 rend = origpos + getOffset(endOffsetTexture, origpos); + float alpha = texture2D(startOffsetTexture, origpos / regionTexSize).b; + // Distance from the start of the region + vec2 dist = pos - rstart*scale; + if(any(greaterThan(dist, rend-rstart))) + discard;//alpha = 0.0; + + vec4 transformedtexcoord = vec4(rstart + dist, vec2(1.0)) * gl_TextureMatrix[0]; + vec3 tex = texture2D(winTexture, transformedtexcoord.xy).rgb; +#if 0 + // ATM we ignore custom opacity values because Fade effect fades out the + // window which results in the explosion being way too quick. Once there's + // a way to suppress Fade effect when ExplosionEffect is active, we can + // use the custom opacity again + gl_FragColor = vec4(tex, (1.0 - factor*factor) * alpha * opacity); +#else + gl_FragColor = vec4(tex, (1.0 - factor*factor) * alpha); +#endif +} + diff --git a/effects/data/explosion.vert b/effects/data/explosion.vert new file mode 100644 index 0000000000..f1bef4e5ed --- /dev/null +++ b/effects/data/explosion.vert @@ -0,0 +1,5 @@ +void main() +{ + gl_TexCoord[0] = gl_MultiTexCoord0; + gl_Position = ftransform(); +} diff --git a/effects/explosioneffect.cpp b/effects/explosioneffect.cpp new file mode 100644 index 0000000000..3785e25f49 --- /dev/null +++ b/effects/explosioneffect.cpp @@ -0,0 +1,230 @@ +/***************************************************************** + KWin - the KDE window manager + This file is part of the KDE project. + +Copyright (C) 2007 Rivo Laks + +You can Freely distribute this program under the GNU General Public +License. See the file "COPYING" for the exact licensing terms. +******************************************************************/ + + +#include "explosioneffect.h" + +#include +#include +#include +#include +#include + +#include +#include + +#include + + +namespace KWinInternal +{ + +ExplosionEffect::ExplosionEffect() : Effect() + { + mActiveAnimations = 0; + mValid = true; + mInited = false; + } + +bool ExplosionEffect::loadData() +{ + mInited = true; + QString shadername("explosion"); + QString fragmentshader = KGlobal::dirs()->findResource("data", "kwin/explosion.frag"); + QString vertexshader = KGlobal::dirs()->findResource("data", "kwin/explosion.vert"); + if(fragmentshader.isEmpty() || vertexshader.isEmpty()) + { + kError() << k_funcinfo << "Couldn't locate shader files" << endl; + return false; + } + + mShader = new GLShader(vertexshader, fragmentshader); + if(!mShader->isValid()) + { + kError() << k_funcinfo << "The shader failed to load!" << endl; + return false; + } + else + { + mShader->bind(); + mShader->setUniform("winTexture", 0); + mShader->setUniform("startOffsetTexture", 4); + mShader->setUniform("endOffsetTexture", 5); + mShader->unbind(); + } + + if((mStartOffsetTex = loadTexture("explosion-start.png")) == 0) + return false; + if((mEndOffsetTex = loadTexture("explosion-end.png")) == 0) + return false; + + return true; + } + +unsigned int ExplosionEffect::loadTexture(const QString& filename) +{ + QString fullfilename = KGlobal::dirs()->findResource("data", "kwin/" + filename); + if(fullfilename.isEmpty()) + { + kError() << k_funcinfo << "Couldn't find texture '" << filename << "'" << endl; + return 0; + } + + QImage img(fullfilename); + if(img.isNull()) + { + kError() << k_funcinfo << "Couldn't load image from file " << fullfilename << endl; + return 0; + } + img = convertToGLFormat(img); + + unsigned int tex; + glGenTextures(1, &tex); + glBindTexture(GL_TEXTURE_2D, tex); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, img.width(), img.height(), 0, GL_RGBA, + GL_UNSIGNED_BYTE, img.bits()); + glBindTexture(GL_TEXTURE_2D, 0); + return tex; +} + +QImage ExplosionEffect::convertToGLFormat(const QImage& img) const +{ + // This method has been copied from Qt's QGLWidget::convertToGLFormat() + QImage res = img.convertToFormat(QImage::Format_ARGB32); + res = res.mirrored(); + + if (QSysInfo::ByteOrder == QSysInfo::BigEndian) { + // Qt has ARGB; OpenGL wants RGBA + for (int i=0; i < res.height(); i++) { + uint *p = (uint*)res.scanLine(i); + uint *end = p + res.width(); + while (p < end) { + *p = (*p << 8) | ((*p >> 24) & 0xFF); + p++; + } + } + } + else { + // Qt has ARGB; OpenGL wants ABGR (i.e. RGBA backwards) + res = res.rgbSwapped(); + } + return res; +} + +void ExplosionEffect::prePaintScreen( int* mask, QRegion* region, int time ) + { + if( mActiveAnimations > 0 ) + // We need to mark the screen as transformed. Otherwise the whole screen + // won't be repainted, resulting in artefacts + *mask |= Scene::PAINT_SCREEN_TRANSFORMED; + + effects->prePaintScreen(mask, region, time); + } + +void ExplosionEffect::prePaintWindow( EffectWindow* w, int* mask, QRegion* region, int time ) + { + if( mWindows.contains( w )) + { + mWindows[ w ] += time / 700.0; // complete change in 700ms + if( mWindows[ w ] < 1 ) + { + *mask |= Scene::PAINT_WINDOW_TRANSLUCENT | Scene::PAINT_WINDOW_TRANSFORMED; + *mask &= ~Scene::PAINT_WINDOW_OPAQUE; + w->enablePainting( Scene::Window::PAINT_DISABLED_BY_DELETE ); + } + else + { + mWindows.remove( w ); + static_cast< Deleted* >( w->window())->unrefWindow(); + mActiveAnimations--; + } + } + + effects->prePaintWindow( w, mask, region, time ); + } + +void ExplosionEffect::paintWindow( EffectWindow* w, int mask, QRegion region, WindowPaintData& data ) + { + // Make sure we have OpenGL compositing and the window is vidible and not a + // special window + SceneOpenGL::Window* glwin = dynamic_cast< SceneOpenGL::Window* >( w->sceneWindow() ); + //Client* c = qobject_cast< Client* >( w->window() ); + bool useshader = ( mValid && glwin && mWindows.contains( w ) ); + if( useshader && !mInited ) + useshader = mValid = loadData(); + if( useshader ) + { + float maxscaleadd = 1.5f; + float scale = 1 + maxscaleadd*mWindows[w]; + //data.xTranslate = (f - 1)* + data.xScale = scale; + data.yScale = scale; + data.xTranslate += int( w->window()->width() / 2 * ( 1 - scale )); + data.yTranslate += int( w->window()->height() / 2 * ( 1 - scale )); + data.opacity *= 0.99; // Force blending + mShader->bind(); + mShader->setUniform("factor", (float)mWindows[w]); + mShader->setUniform("scale", scale); + glActiveTexture(GL_TEXTURE4); + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, mStartOffsetTex); + glActiveTexture(GL_TEXTURE5); + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, mEndOffsetTex); + glActiveTexture(GL_TEXTURE0); + glwin->setShader(mShader); + } + + // Call the next effect. + effects->paintWindow( w, mask, region, data ); + + if( useshader ) + { + mShader->unbind(); + glActiveTexture(GL_TEXTURE4); + glBindTexture(GL_TEXTURE_2D, 0); + glDisable(GL_TEXTURE_2D); + glActiveTexture(GL_TEXTURE5); + glBindTexture(GL_TEXTURE_2D, 0); + glDisable(GL_TEXTURE_2D); + glActiveTexture(GL_TEXTURE0); + } + } + +void ExplosionEffect::postPaintScreen() + { + if( mActiveAnimations > 0 ) + workspace()->addRepaintFull(); + + // Call the next effect. + effects->postPaintScreen(); + } + +void ExplosionEffect::windowClosed( EffectWindow* c ) + { + Client* cc = dynamic_cast< Client* >( c->window()); + if( cc == NULL || (cc->isOnCurrentDesktop() && !cc->isMinimized())) + { + mWindows[ c ] = 0; // count up to 1 + c->window()->addRepaintFull(); + static_cast< Deleted* >( c->window())->refWindow(); + mActiveAnimations++; + } + } + +void ExplosionEffect::windowDeleted( EffectWindow* c ) + { + mWindows.remove( c ); + } + +} // namespace + diff --git a/effects/explosioneffect.h b/effects/explosioneffect.h new file mode 100644 index 0000000000..3441def1b5 --- /dev/null +++ b/effects/explosioneffect.h @@ -0,0 +1,57 @@ +/***************************************************************** + KWin - the KDE window manager + This file is part of the KDE project. + +Copyright (C) 2007 Rivo Laks + +You can Freely distribute this program under the GNU General Public +License. See the file "COPYING" for the exact licensing terms. +******************************************************************/ + +#ifndef KWIN_EXPLOSIONEFFECT_H +#define KWIN_EXPLOSIONEFFECT_H + +// Include with base class for effects. +#include + +namespace KWinInternal +{ + +class GLShader; + +/** + * Makes windows explode into small pieces when they're closed + **/ +class ExplosionEffect + : public Effect + { + public: + ExplosionEffect(); + + virtual void prePaintScreen( int* mask, QRegion* region, int time ); + virtual void prePaintWindow( EffectWindow* w, int* mask, QRegion* region, int time ); + virtual void paintWindow( EffectWindow* w, int mask, QRegion region, WindowPaintData& data ); + virtual void postPaintScreen(); + + virtual void windowClosed( EffectWindow* c ); + virtual void windowDeleted( EffectWindow* c ); + + + protected: + bool loadData(); + unsigned int loadTexture(const QString& filename); + QImage convertToGLFormat(const QImage& img) const; + + private: + GLShader* mShader; + unsigned int mStartOffsetTex; + unsigned int mEndOffsetTex; + QMap< const EffectWindow*, double > mWindows; + int mActiveAnimations; + bool mValid; + bool mInited; + }; + +} // namespace + +#endif