BGE: pre_draw() callback returns the wrong logic.getCurrentScene() for background scenes #43536

Closed
opened 2015-02-02 20:43:43 +01:00 by Dalai Felinto · 8 comments

Blender 2.73

See attached file, the main scene adds the other scene as a background scene (after 5 seconds).
Both scenes run the following init function once:

import bge

def draw():
    scene = bge.logic.getCurrentScene()
    print(scene.name)

def init():
    scene = bge.logic.getCurrentScene()
    if scene.name == 'New Scene':
        scene.pre_draw.append(draw)

The result expected was "New Scene" being printed multiple times, instead I get "Initial Scene".

bug-overlay-pre_draw.blend

Blender 2.73 See attached file, the main scene adds the other scene as a background scene (after 5 seconds). Both scenes run the following `init` function once: ``` import bge def draw(): scene = bge.logic.getCurrentScene() print(scene.name) def init(): scene = bge.logic.getCurrentScene() if scene.name == 'New Scene': scene.pre_draw.append(draw) ``` The result expected was "New Scene" being printed multiple times, instead I get "Initial Scene". [bug-overlay-pre_draw.blend](https://archive.blender.org/developer/F140515/bug-overlay-pre_draw.blend)
Author
Owner

Changed status to: 'Open'

Changed status to: 'Open'
Author
Owner

Added subscriber: @dfelinto

Added subscriber: @dfelinto
Author
Owner

The reason for this situation is that in the code we interact over the scenes to callback the pre_draw functions, but we don't set each scene as the active one. One option is to pass the scene to the callback as a optional parameter. The following code would look like this:

import bge

def draw(scene):
    print(scene.name)

def init():
    scene = bge.logic.getCurrentScene()
    if scene.name == 'New Scene':
        scene.pre_draw.append(draw)
The reason for this situation is that in the code we interact over the scenes to callback the pre_draw functions, but we don't set each scene as the active one. One option is to pass the scene to the callback as a optional parameter. The following code would look like this: ``` import bge def draw(scene): print(scene.name) def init(): scene = bge.logic.getCurrentScene() if scene.name == 'New Scene': scene.pre_draw.append(draw) ```
Author
Owner

Added subscriber: @ideasman42

Added subscriber: @ideasman42
Author
Owner

There is a workaround in Python to implement the suggested above:

import bge
from functools import partial

def callback(scene):
    print(scene.name)
    
def init(cont):
    own = cont.owner
    scene = own.scene
    if scene.name == 'New Scene':
        callback_ = partial(callback, scene)
        scene.pre_draw.append(callback_)

Or even:

import bge

def callback(scene):
    print(scene.name)

def init(cont):
    own = cont.owner
    scene = own.scene
    if scene.name == 'New Scene':
        
        def closure():
            callback(scene)
        
        scene.pre_draw.append(closure)

@ideasman42, any thoughts? Should we bother fixing this?

There is a workaround in Python to implement the suggested above: ``` import bge from functools import partial def callback(scene): print(scene.name) def init(cont): own = cont.owner scene = own.scene if scene.name == 'New Scene': callback_ = partial(callback, scene) scene.pre_draw.append(callback_) ``` Or even: ``` import bge def callback(scene): print(scene.name) def init(cont): own = cont.owner scene = own.scene if scene.name == 'New Scene': def closure(): callback(scene) scene.pre_draw.append(closure) ``` @ideasman42, any thoughts? Should we bother fixing this?

This issue was referenced by a2f9a0cfd9

This issue was referenced by a2f9a0cfd940049f22cb89a8812629948a3580ae
Member

Changed status from 'Open' to: 'Resolved'

Changed status from 'Open' to: 'Resolved'
Member

Closed by commit a2f9a0cfd9.

Closed by commit a2f9a0cfd9.
Sign in to join this conversation.
3 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: blender/blender#43536
No description provided.