From 73e79b624f37809c27039cb620bb6260d5aacee5 Mon Sep 17 00:00:00 2001 From: Christopher Denter Date: Tue, 24 May 2011 22:41:43 +0200 Subject: [PATCH] wip; pretty dirty --- examples/shader/plasma.py | 34 ++++++++---- kivy/base.py | 8 +-- kivy/core/image/img_osxcoreimage.py | 2 - kivy/core/image/osxcoreimage.pyx | 3 ++ kivy/core/sdl.pyx | 77 ++++++++++++++++++++++----- kivy/core/window/__init__.py | 2 + kivy/core/window/window_sdl.py | 16 ++---- kivy/data/glsl/default.fs | 4 +- kivy/graphics/instructions.pyx | 11 ++-- kivy/graphics/shader.pyx | 1 + kivy/graphics/vertex_instructions.pyx | 2 +- kivy/resources.py | 2 + setup.py | 5 +- 13 files changed, 117 insertions(+), 50 deletions(-) diff --git a/examples/shader/plasma.py b/examples/shader/plasma.py index 8a4bf203f..02dadae48 100644 --- a/examples/shader/plasma.py +++ b/examples/shader/plasma.py @@ -8,11 +8,23 @@ with some adapation. This might become a Kivy widget when experimentation will be done. ''' +print 'SETUP KIVY >>' +from kivy.logger import Logger +import logging +Logger.setLevel(logging.TRACE) + +from kivy.config import Config +Config.remove_option('input', 'default') +Config.remove_option('input', 'mactouch') +Config.set('graphics', 'fullscreen', 'auto') +print 'SETUP KIVY << done' + from kivy.clock import Clock from kivy.app import App from kivy.uix.floatlayout import FloatLayout from kivy.core.window import Window +#Window.clearcolor = None from kivy.graphics import RenderContext from kivy.properties import StringProperty @@ -37,15 +49,16 @@ uniform float time; void main(void) { - float x = gl_FragCoord.x; - float y = gl_FragCoord.y; - float mov0 = x+y+cos(sin(time)*2.)*100.+sin(x/100.)*1000.; - float mov1 = y / resolution.y / 0.2 + time; - float mov2 = x / resolution.x / 0.2; - float c1 = abs(sin(mov1+time)/2.+mov2/2.-mov1-mov2+time); - float c2 = abs(sin(c1+sin(mov0/1000.+time)+sin(y/40.+time)+sin((x+y)/100.)*3.)); - float c3 = abs(sin(c2+cos(mov1+mov2+c2)+cos(mov2)+sin(x/1000.))); - gl_FragColor = vec4( c1,c2,c3,1.0); +// float x = gl_FragCoord.x; +// float y = gl_FragCoord.y; +// float mov0 = x+y+cos(sin(time)*2.)*100.+sin(x/100.)*1000.; +// float mov1 = y / resolution.y / 0.2 + time; +// float mov2 = x / resolution.x / 0.2; +// float c1 = abs(sin(mov1+time)/2.+mov2/2.-mov1-mov2+time); +// float c2 = abs(sin(c1+sin(mov0/1000.+time)+sin(y/40.+time)+sin((x+y)/100.)*3.)); +// float c3 = abs(sin(c2+cos(mov1+mov2+c2)+cos(mov2)+sin(x/1000.))); +// gl_FragColor = vec4( c1,c2,c3,1.0); + gl_FragColor = vec4(1.0, 1.0, 0., 1.0); } ''' @@ -64,7 +77,7 @@ class ShaderWidget(FloatLayout): super(ShaderWidget, self).__init__(**kwargs) # We'll update our glsl variables in a clock - Clock.schedule_interval(self.update_glsl, 1 / 60.) + Clock.schedule_interval(self.update_glsl, 1.) def on_fs(self, instance, value): # set the fragment shader to our source code @@ -80,6 +93,7 @@ class ShaderWidget(FloatLayout): self.canvas['resolution'] = map(float, self.size) # This is needed for the default vertex shader. self.canvas['projection_mat'] = Window.render_context['projection_mat'] + # print self.canvas['projection_mat'] class PlasmaApp(App): diff --git a/kivy/base.py b/kivy/base.py index de5274e84..1cbee5558 100644 --- a/kivy/base.py +++ b/kivy/base.py @@ -268,10 +268,10 @@ class EventLoopBase(object): self.dispatch_input() window = self.window - if window and window.canvas.needs_redraw: - Clock.tick_draw() - window.dispatch('on_draw') - window.dispatch('on_flip') + #if window and window.canvas.needs_redraw: + Clock.tick_draw() + window.dispatch('on_draw') + window.dispatch('on_flip') # don't loop if we don't have listeners ! if len(self.event_listeners) == 0: diff --git a/kivy/core/image/img_osxcoreimage.py b/kivy/core/image/img_osxcoreimage.py index 73361aefa..ffd24908c 100644 --- a/kivy/core/image/img_osxcoreimage.py +++ b/kivy/core/image/img_osxcoreimage.py @@ -27,13 +27,11 @@ class ImageLoaderOSXCoreImage(ImageLoaderBase): 'tga', 'tiff', 'wal', 'wmf', 'xbm', 'xpm', 'xv') def load(self, filename): - print 'before' ret = osxcoreimage.load_raw_image_data(filename) if ret is None: Logger.warning('Image: Unable to load image <%s>' % filename) raise Exception('Unable to load image') w, h, imgtype, data = ret - print 'after' return ImageData(w, h, imgtype, data) # register diff --git a/kivy/core/image/osxcoreimage.pyx b/kivy/core/image/osxcoreimage.pyx index 2d94b6a74..278fd26ba 100644 --- a/kivy/core/image/osxcoreimage.pyx +++ b/kivy/core/image/osxcoreimage.pyx @@ -70,11 +70,13 @@ def load_raw_image_data(bytes _url): # see iphone3d book myImageSourceRef = CGImageSourceCreateWithURL(url, NULL) if myImageSourceRef == NULL: + print 'myImageSourceRef is NULL' return None cdef CGImageRef myImageRef myImageRef = CGImageSourceCreateImageAtIndex (myImageSourceRef, 0, NULL) if myImageRef == NULL: + print 'myImageRef is NULL' return None cdef int width = CGImageGetWidth(myImageRef) @@ -96,6 +98,7 @@ def load_raw_image_data(bytes _url): # XXX clean image object + print 'Image:', _url, width, height, imgtype return (width, height, imgtype, r_data) # diff --git a/kivy/core/sdl.pyx b/kivy/core/sdl.pyx index ab2aeae73..36718dc0e 100644 --- a/kivy/core/sdl.pyx +++ b/kivy/core/sdl.pyx @@ -51,12 +51,13 @@ cdef extern from "SDL.h": int SDL_QUIT int SDL_WINDOWEVENT int SDL_SYSWMEVENT - int SDL_KEYDOWN, - int SDL_KEYUP, + int SDL_KEYDOWN + int SDL_KEYUP int SDL_MOUSEMOTION int SDL_MOUSEBUTTONDOWN int SDL_MOUSEBUTTONUP int SDL_TEXTINPUT + int SDL_FINGERMOTION # GL Attribute int SDL_GL_DEPTH_SIZE @@ -67,7 +68,9 @@ cdef extern from "SDL.h": int SDL_GL_STENCIL_SIZE int SDL_GL_DOUBLEBUFFER int SDL_GL_CONTEXT_MAJOR_VERSION + int SDL_GL_CONTEXT_MINOR_VERSION int SDL_GL_RETAINED_BACKING + int SDL_GL_ACCELERATED_VISUAL # Init flags int SDL_INIT_VIDEO @@ -84,8 +87,11 @@ cdef extern from "SDL.h": int SDL_WINDOW_BORDERLESS int SDL_WINDOW_RESIZABLE int SDL_WINDOW_FULLSCREEN + int SDL_WINDOW_INPUT_FOCUS + int SDL_WINDOW_INPUT_GRABBED + int SDL_WINDOW_MOUSE_FOCUS - # Window event + ## Window event int SDL_WINDOWEVENT_EXPOSED int SDL_WINDOWEVENT_RESIZED @@ -99,6 +105,8 @@ cdef extern from "SDL.h": int SDL_GetWindowDisplayMode(SDL_Window *, SDL_DisplayMode *) int SDL_SetWindowDisplayMode(SDL_Window *, SDL_DisplayMode *) void SDL_GL_SwapWindow(SDL_Window *) + void SDL_GL_SwapBuffers() + int SDL_GL_MakeCurrent(SDL_Window* window, SDL_GLContext context) int SDL_GL_SetSwapInterval(int) int SDL_Flip(SDL_Surface *) @@ -107,12 +115,16 @@ cdef extern from "SDL.h": void SDL_GL_DeleteContext(SDL_GLContext) int SDL_PollEvent(SDL_Event *) + void SDL_PumpEvents() + int SDL_EventState(unsigned int, int) char *SDL_GetError() cdef SDL_Window *win = NULL cdef SDL_GLContext ctx = NULL +cdef SDL_Surface *surface = NULL + cdef int win_flags = 0 @@ -120,10 +132,39 @@ def die(): raise RuntimeError( SDL_GetError()) +#def init_video(): +# return SDL_Init(SDL_INIT_VIDEO) +# +# +#def create_window(): +# global win +# win = SDL_CreateWindow(NULL, 0, 0, 320, 480, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN) +# assert win != NULL +# +# +#def create_context(): +# global ctx +# ctx = SDL_GL_CreateContext(win) +# +# +#def poll_events(): +# cdef SDL_Event event +# while SDL_PollEvent(&event): +# print event.type, +# +# +#def swap(): +# assert win != NULL +# SDL_GL_SwapWindow(win) +# +#def get_error(): +# print SDL_GetError() + + def setup_window(width, height, use_fake, use_fullscreen): global win, ctx, win_flags - win_flags = SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN | SDL_WINDOW_BORDERLESS + win_flags = SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN | SDL_WINDOW_BORDERLESS | SDL_WINDOW_RESIZABLE ''' win_flags = SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE | SDL_WINDOW_SHOWN if use_fake: @@ -136,7 +177,7 @@ def setup_window(width, height, use_fake, use_fullscreen): die() #SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1) - #SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16) + ##SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16) #SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 1) #SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8) #SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8) @@ -150,16 +191,24 @@ def setup_window(width, height, use_fake, use_fullscreen): SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 0); SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 0); SDL_GL_SetAttribute(SDL_GL_RETAINED_BACKING, 0); - #SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL, 1); + SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL, 1); - SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2); - - win = SDL_CreateWindow(NULL, 0, 0, 768, 1024, win_flags) + win = SDL_CreateWindow(NULL, 0, 0, width, height, win_flags) if not win: die() + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0); + SDL_GL_SetSwapInterval(1); + ctx = SDL_GL_CreateContext(win) + assert ctx != NULL + SDL_GL_SetSwapInterval(1); + #surface = SDL_GetWindowSurface(win) + cdef SDL_DisplayMode mode + SDL_GetWindowDisplayMode(win, &mode) + return mode.w, mode.h def resize_window(w, h): @@ -168,6 +217,8 @@ def resize_window(w, h): mode.w = w mode.h = h SDL_SetWindowDisplayMode(win, &mode) + SDL_GetWindowDisplayMode(win, &mode) + print 'SDL resized window size to', mode.w, mode.h def set_window_title(str title): @@ -181,8 +232,8 @@ def teardown_window(): def poll(): - print 'polling' cdef SDL_Event event + if SDL_PollEvent(&event) == 0: return False @@ -214,11 +265,11 @@ def poll(): s = PyUnicode_FromString(event.text.text) return ('textinput', s) else: - print 'receive unknown sdl event', event.type - - + #print 'receive unknown sdl event', event.type + pass def flip(): SDL_GL_SwapWindow(win) + #SDL_GL_SwapBuffers() diff --git a/kivy/core/window/__init__.py b/kivy/core/window/__init__.py index 024ea22ac..7f278e4d4 100644 --- a/kivy/core/window/__init__.py +++ b/kivy/core/window/__init__.py @@ -383,11 +383,13 @@ class WindowBase(EventDispatcher): from kivy.graphics.transformation import Matrix width, height = self.system_size + print "system size:", self.system_size w2 = width / 2. h2 = height / 2. # prepare the viewport glViewport(0, 0, width, height) + print "GL_VIEWPORT:", width, height projection_mat = Matrix() projection_mat.view_clip(0.0, width, 0.0, height, -1.0, 1.0, 0) self.render_context['projection_mat'] = projection_mat diff --git a/kivy/core/window/window_sdl.py b/kivy/core/window/window_sdl.py index dde5e8641..a023ab53b 100644 --- a/kivy/core/window/window_sdl.py +++ b/kivy/core/window/window_sdl.py @@ -54,6 +54,7 @@ class WindowSDL(WindowBase): elif self._pos is not None: os.environ['SDL_VIDEO_WINDOW_POS'] = '%d,%d' % self._pos + pass # never stay with a None pos, application using w.center will be fired. self._pos = (0, 0) @@ -75,7 +76,7 @@ class WindowSDL(WindowBase): # setup ! w, h = self._size - sdl.setup_window(w, h, use_fake, use_fullscreen) + self._size = sdl.setup_window(w, h, use_fake, use_fullscreen) super(WindowSDL, self).create_window() @@ -93,18 +94,10 @@ class WindowSDL(WindowBase): self.dispatch('on_close') def set_title(self, title): - return - pygame.display.set_caption(title) + sdl.set_window_title(title) def set_icon(self, filename): return - try: - if not exists(filename): - return False - icon = pygame.image.load(filename) - pygame.display.set_icon(icon) - except: - Logger.exception('WinPygame: unable to set icon') def screenshot(self, *largs, **kwargs): return @@ -132,7 +125,6 @@ class WindowSDL(WindowBase): super(WindowPygame, self).on_keyboard(key, scancode, unicode, modifier) def flip(self): - print 'flipping' sdl.flip() super(WindowSDL, self).flip() @@ -146,7 +138,6 @@ class WindowSDL(WindowBase): if event is None: continue - print 'sdl receive', event action, args = event[0], event[1:] if action == 'quit': EventLoop.quit = True @@ -227,6 +218,7 @@ class WindowSDL(WindowBase): # don't known why, but pygame required a resize event # for opengl, before mainloop... window reinit ? self.dispatch('on_resize', *self.size) + print 'dispatched on_resize, size is', self.size while not EventLoop.quit and EventLoop.status == 'started': try: diff --git a/kivy/data/glsl/default.fs b/kivy/data/glsl/default.fs index 77c0b9781..babc9b777 100644 --- a/kivy/data/glsl/default.fs +++ b/kivy/data/glsl/default.fs @@ -10,6 +10,8 @@ varying vec2 tex_coord0; uniform sampler2D texture0; void main (void){ - gl_FragColor = frag_color * texture2D(texture0, tex_coord0); + //gl_FragColor = frag_color * texture2D(texture0, tex_coord0); + //gl_FragColor = frag_color; + gl_FragColor = vec4(1.); } diff --git a/kivy/graphics/instructions.pyx b/kivy/graphics/instructions.pyx index d9b4f3862..51625d009 100644 --- a/kivy/graphics/instructions.pyx +++ b/kivy/graphics/instructions.pyx @@ -81,7 +81,8 @@ cdef class Instruction: property needs_redraw: def __get__(self): - return bool(self.flags & GI_NEEDS_UPDATE) + return True + #return bool(self.flags & GI_NEEDS_UPDATE) cdef class InstructionGroup(Instruction): @@ -289,7 +290,7 @@ cdef class VertexInstruction(Instruction): size: self.size .. note:: - + The filename will be searched with the :func:`kivy.resources.resource_find` function. @@ -340,7 +341,7 @@ cdef class VertexInstruction(Instruction): cdef class Callback(Instruction): '''.. versionadded:: 1.0.4 - + A Callback is an instruction that will be called when the drawing operation is performed. When adding instructions to a canvas, you can do this:: @@ -545,7 +546,7 @@ cdef CanvasBase getActiveCanvas(): global ACTIVE_CANVAS return ACTIVE_CANVAS -# Canvas Stack, for internal use so canvas can be bound +# Canvas Stack, for internal use so canvas can be bound # inside other canvas, and restroed when other canvas is done cdef list CANVAS_STACK = list() @@ -559,7 +560,7 @@ cdef popActiveCanvas(): ACTIVE_CANVAS = CANVAS_STACK.pop() -#TODO: same as canvas, move back to context.pyx..fix circular import +#TODO: same as canvas, move back to context.pyx..fix circular import #on actual import from python problem include "common.pxi" from vertex cimport * diff --git a/kivy/graphics/shader.pyx b/kivy/graphics/shader.pyx index 2e088ac49..73f54683f 100644 --- a/kivy/graphics/shader.pyx +++ b/kivy/graphics/shader.pyx @@ -231,6 +231,7 @@ cdef class Shader: return -1 Logger.info('Shader: %s compiled successfully' % ctype) + print source return shader cdef str get_shader_log(self, shader): diff --git a/kivy/graphics/vertex_instructions.pyx b/kivy/graphics/vertex_instructions.pyx index ad192f19c..0407e7acb 100644 --- a/kivy/graphics/vertex_instructions.pyx +++ b/kivy/graphics/vertex_instructions.pyx @@ -482,7 +482,7 @@ cdef class BorderImage(Rectangle): hs[0], vs[1], ths[0], tvs[1], #v11 hs[1], vs[1], ths[1], tvs[1], #v12 hs[2], vs[1], ths[2], tvs[1], #v13 - hs[2], vs[2], ths[2], tvs[2], #v14 + hs[2], vs[2], ths[2], tvs[2], #v14 hs[1], vs[2], ths[1], tvs[2]] #v15 cdef int *indices = [ diff --git a/kivy/resources.py b/kivy/resources.py index aa7ae745b..d79fcf0c3 100644 --- a/kivy/resources.py +++ b/kivy/resources.py @@ -17,6 +17,8 @@ import kivy resource_paths = [ '.', dirname(sys.argv[0]), + # XXX iOS Hack; do properly. not sure how yet + join(dirname(sys.argv[0]), 'YourApp'), dirname(kivy.__file__)] diff --git a/setup.py b/setup.py index 70d41d357..cfc727e69 100644 --- a/setup.py +++ b/setup.py @@ -172,8 +172,9 @@ if True: sdl_extra_link_args = [] if platform == 'darwin': # Paths as per homebrew (modified formula to use hg checkout) - sdl_includes = ['/usr/local/Cellar/sdl/HEAD/include/SDL'] - sdl_extra_link_args += ['-L', '/Users/dennda/dev/sdl-1.3/Xcode-iPhoneOS/SDL/build/SDLiPhoneOS.build/Debug-iphoneos/libSDL.build/Objects-normal/armv7'] + sdl_includes = ['/Users/dennda/dev/sdl-1.3/include'] + #sdl_extra_link_args += ['-L', '/Users/dennda/dev/sdl-1.3/Xcode-iPhoneOS/SDL/build/SDLiPhoneOS.build/Debug-iphoneos/libSDL.build/Objects-normal/armv7'] + sdl_extra_link_args += ['-L', '/Users/dennda/dev/sdl-1.3/Xcode-iPhoneOS/SDL/build/Debug-iphoneos/'] sdl_extra_link_args += ['-framework', 'Foundation'] sdl_extra_link_args += ['-framework', 'UIKit'] sdl_extra_link_args += ['-framework', 'AudioToolbox']