Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
AgeCommit message (Collapse)Author
2016-06-11BGE: Various render improvements.Benoit Bolsee
bge.logic.setRender(flag) to enable/disable render. The render pass is enabled by default but it can be disabled with bge.logic.setRender(False). Once disabled, the render pass is skipped and a new logic frame starts immediately. Note that VSync no longer limits the fps when render is off but the 'Use Frame Rate' option in the Render Properties still does. To run as many frames as possible, untick the option This function is useful when you don't need the default render, e.g. when doing offscreen render to an alternate device than the monitor. Note that without VSync, you must limit the frame rate by other means. fbo = bge.render.offScreenCreate(width,height,[,samples=0][,target=bge.render.RAS_OFS_RENDER_BUFFER]) Use this method to create an offscreen buffer of given size, with given MSAA samples and targetting either a render buffer (bge.render.RAS_OFS_RENDER_BUFFER) or a texture (bge.render.RAS_OFS_RENDER_TEXTURE). Use the former if you want to retrieve the frame buffer on the host and the latter if you want to pass the render to another context (texture are proper OGL object, render buffers aren't) The object created by this function can only be used as a parameter of the bge.texture.ImageRender() constructor to send the the render to the FBO rather than to the frame buffer. This is best suited when you want to create a render of specific size, or if you need an image with an alpha channel. bge.texture.<imagetype>.refresh(buffer=None, format="RGBA", ts=-1.0) Without arg, the refresh method of the image objects is pretty much a no-op, it simply invalidates the image so that on next texture refresh, the image will be recalculated. It is now possible to pass an optional buffer object to transfer the image (and recalculate it if it was invalid) to an external object. The object must implement the 'buffer protocol'. The image will be transfered as "RGBA" or "BGRA" pixels depending on format argument (only those 2 formats are supported) and ts is an optional timestamp in the image depends on it (e.g. VideoFFmpeg playing a video file). With this function you don't need anymore to link the image object to a Texture object to use: the image object is self-sufficient. bge.texture.ImageRender(scene, camera, fbo=None) Render to buffer is possible by passing a FBO object (see offScreenCreate). bge.texture.ImageRender.render() Allows asynchronous render: call this method to render the scene but without extracting the pixels yet. The function returns as soon as the render commands have been send to the GPU. The render will proceed asynchronously in the GPU while the host can perform other tasks. To complete the render, you can either call refresh() directly of refresh the texture to which this object is the source. Asynchronous render is useful to achieve optimal performance: call render() on frame N and refresh() on frame N+1 to give as much as time as possible to the GPU to render the frame while the game engine can perform other tasks. Support negative scale on camera. Camera scale was previously ignored in the BGE. It is now injected in the modelview matrix as a vertical or horizontal flip of the scene (respectively if scaleY<0 and scaleX<0). Note that the actual value of the scale is not used, only the sign. This allows to flip the image produced by ImageRender() without any performance degradation: the flip is integrated in the render itself. Optimized image transfer from ImageRender to buffer. Previously, images that were transferred to the host were always going through buffers in VideoTexture. It is now possible to transfer ImageRender images to external buffer without intermediate copy (i.e. directly from OGL to buffer) if the attributes of the ImageRender objects are set as follow: flip=False, alpha=True, scale=False, depth=False, zbuff=False. (if you need to flip the image, use camera negative scale)
2015-06-16BGE: Fix for precision lost in setBackground/getBackground at Video TextureJorge Bernal
Now internally the variables are processed as floats avoiding int->float->char conversions that are causing precision lost. A check for int numbers is maintained to keep compatibility with old behaviour. Reviewers: ben2610, campbellbarton, moguri, hg1 Reviewed By: moguri, hg1 Subscribers: campbellbarton Projects: #game_engine Differential Revision: https://developer.blender.org/D1301
2015-05-10BGE: Fix T43822 Videotexture does not use sky color for off-screenJorge Bernal
rendering Make scene background color as default for render-to-texture instead of current blue color (0, 0, 255). It is very useful for mirrors setups. Reviewers: moguri, ben2610, sybren, panzergame, hg1 Reviewed By: panzergame, hg1, moguri Subscribers: mpan3 Differential Revision: https://developer.blender.org/D1287
2013-11-04BGE Rasterizer Cleanup: Removing RAS_IRenderTools and moving the ↵Mitchell Stokes
functionality to RAS_IRasterizer. RAS_OpenGLRasterizer is a bit of a mess now with references to Ketsji and other modules it shouldn't be accessing.
2013-03-29style cleanupCampbell Barton
2012-11-18code cleanup: gpl header update (formatting)Campbell Barton
2012-06-17code cleanup: includes, also correct some py example typosCampbell Barton
2012-03-09style cleanup: consistent names for header guards.Campbell Barton
2012-03-09style cleanup: comment blocksCampbell Barton
2011-10-23remove $Id: tags after discussion on the mailign list: ↵Campbell Barton
http://markmail.org/message/fp7ozcywxum3ar7n
2011-10-07spaces -> tabs (whitespace only changes)Campbell Barton
2011-02-22doxygen: bge scenegraph and videotextureNathan Letwory
2010-12-03- added GCC warning -Wstrict-prototypesCampbell Barton
- fixed bug in paste material, exposed by stricter warnings. - removed/renamed various shadowed vars. - removed BGE lamp.colour, only allow lamp.color attribute.
2010-02-07BGE: add audio/video synchronization capability to VideoTextureBenoit Bolsee
Add optional parameter to VideoTexture.Texture refresh() method to specify timestamp (in seconds from start of movie) of the frame to be loaded. This value is passed down to image source and for VideoFFmpeg source, it is used instead of current time to load the frame from the video file. When combined with an audio actuator, it can be used to synchronize the sound and the image: specify the same video file in the sound actuator and use the KX_SoundActuator time attribute as timestamp to refresh: the frame corresponding to the sound will be loaded: GameLogic.video.refresh(True, soundAct.time)
2008-12-09ImageMirror: add clip attribute to limit clipping distance of mirror renderingBenoit Bolsee
2008-12-04VideoTexture: new ImageMirror class for easy mirror (and portal) creationBenoit Bolsee
The new class VideoTexture.ImageMirror() is available to perform automatic mirror rendering. Constructor: VideoTexture.ImageMirror(scene,observer,mirror,material) scene: reference to the scene that will be rendered. Both observer and mirror must be part of that scene. observer: reference to a game object used as view point for mirror rendering: the scene will be rendered through the mirror as if the active camera was at the observer location. Usually the observer is the active camera but you can use any game obejct. mirror: reference to the mesh object holding the mirror. material: material ID of the mirror texture as returned by VideoTexture.materialID(). The mirror is formed by the polygons mapped to that material. There are no specific methods or attributes. ImageMirror inherits all methods and attributes from ImageRender. You must refresh the parent VideoTexture.Texture object regularly to update the mirror rendering. Guidelines on how to create a working mirror: - Use a texture that is specific to the mirror so that the mirror rendering only appears on the mirror. - The mirror must be planar; the algorithm works well only for planar or quasi planar mirror. For spherical mirror, you will get better results with ImageRender and a camera at the center of the mirror. ImageMirror automatically computes the mirror orientation and position. The mirror doesn't need to be rectangular, it can be circular or take any form provided it is planar. - The mirror up direction must be along the Z axis in local mesh coordinates. If the mirror is not vertical, ImageMirror will compute the up direction as being the projection of the Z axis on the mirror plane. - UV mapping must be set right to get correct mirror rendering: - make a planar projection of the mirror polygons (Unwrap or projection from view) - eventually rotate the projection so that UV up direction corresponds to the mesh Z axis - scale the projection so that the extreme points touch the border of the texture - flip the UV projection horizontally (scale -1 on X axis). This is needed because the mirror texture is rendered from the back of the mirror and thus is reversed from the view point of the observer. Horizontal flip in the UV map restores the correct orientation. Besides these simple rules, the mirror rendering is completely automatic. In particular, you don't need to allocate a camera for the rendering, ImageMirror creates dynamically a camera for that. The reflection is correct even on large angles. The mirror can be a dynamic and moving object, the algorithm always computes the correct camera position based on observer relative position. You don't have to worry about mirror position in the scene: the algorithm automatically computes the camera frustum so that any object behind the mirror is not rendered. Warnings: - observer and mirror are references to game objects. ImageMirror keeps a pointer to them but does not increment the reference count. You must ensure that these game objects are not deleted as long as you refresh() the ImageMirror object. You must release the ImageMirror object before you delete the game objects. To release the ImageMirror object (normally stored in GameLogic), just assign it to None. - Mirror rendering is automatically skipped when the observer is behind the mirror but it is not disabled when the mirror is out of sight of the observer. You should only refresh the mirror when you know that the observer is likely to see it. For example, no need to refresh a car inner mirror when the player is not in the car. Example: contr = GameLogic.getCurrentController() # object holding the mirror mirror = contr.getOwner() scene = GameLogic.getCurrentScene() # observer will be the active camere camera = scene.getObjectList()['OBCamera'] matID = VideoTexture.materialID(mirror, 'IMmirror.png') GameLogic.mirror = VideoTexture.Texture(mirror, matID) GameLogic.mirror.source = VideoTexture.ImageMirror(scene,camera,mirror,matID) # to render the mirror, just call GameLogic.mirror.refresh(True) on each frame. You can download a demo game (with a video file) here: http://home.scarlet.be/~tsi46445/blender/VideoTextureDemo.zip For those who have already downloaded the demo, you can just update the blend file: http://home.scarlet.be/~tsi46445/blender/MirrorTextureDemo.blend
2008-11-26VideoTexture: new ImageRender class for Render To TextureBenoit Bolsee
The new class VideoTexture.ImageRender() is available to perform render to texture in the GE. Constructor: VideoTexture.ImageRender(scene,cam) cam : camera object that will be used for the render. It must be an inactive camera. scene: reference to the scene that will be rendered. The camera must be part of that scene. Returns an object that can be used as a source of a VideoTexture.Texture object Methods: none Attributes: background: 4-tuple representing the background color of the rendering as RGBA color components, each component being an integer between 0 and 255. Default value = [0,0,255,255] (=saturated blue) Note: athough the alpha component can be specified, it is not supported at the moment, the alpha channel of the rendered texture will always be 255. You can however introduce an alpha channel by appending a FilterBlueScreen() filter, it will set the alpha to 0 (transparent) on all pixels that were not rendered. capsize: 2-tuple representing the size of the render area as [x,y] number of pixels. Default value = largest rectangle with power of 2 dimensions that fits in the canvas You may want to reduce the render area to increase performance. For example, a render area of [256,128] is probably sufficient to implement a car inner mirror. For best performance, use power of 2 dimensions and don't set any filter: this allows direct transfer between the GPU frame buffer and texture memory without going through the host. alpha: Boolean indicating if the render alpha channel should be copied to the texture. Default value: False Experimental, do not use. whole: Boolean indicating if the entire canvas should be used for the rendering. Default value: False Note: There is no reason to set this attribute to True: the rendering will in any case be scaled down to the largest rectangle with power of 2 dimensions before transfering to the texture. Attributes inherited from the ImageBase class: image : image binary data, read-only size : [x,y] size of the texture, read-only scale : set to True for fast scale down in case the render area dimensions are not power of 2 flip : set to True for vertical flip. filter: set a post-processing filter on the render. Notes: * Aspect Ratio For consistent results in Blender and Blenderplayer, the same aspect ratio used by Blender to draw the camera viewport (Scene(F10)->Format tab->Size X/Size Y) is also used during the rendering. You can control the portion of the scene that will be rendered by "looking through the camera": the zone inside the outer dotted rectangle will be rendered to the texture. In order to reproduce the scene without X/Y distortion, you must apply the texture on an object or portion of object that has the same aspect ratio. * Order of rendering The rendereing is performed when you call the refresh() method of the parent Texture object. This happens outside the normal frame rendering and will have no effect on it. However, if you want to use ImageViewport and ImageRender at the same time, be sure to refresh the viewport texture before the render texture because the latter will destroy the frame buffer that is used by the former to update the texture. * Scene status The meshes are not updated during the render to texture: the rendered texture is one frame late to the rendered frame with regards to mesh deformation. * Example: cont = GameLogic.getCurrentController() # object that receives the texture obj = contr.getOwner() scene = GameLogic.getCurrentScene() # camera used for the render tvcam = scene.getObjectList()['OBtvcam'] # assume obj has some faces UV assigned to tv.png matID = VideoTexture.materialID(obj, 'IMtv.png') GameLogic.tv = VideoTexture.Texture(obj, matID) GameLogic.tv.source = VideoTexture.ImageRender(scene,tvcam) GameLogic.tv.source.capsize = [256,256] # to render the texture, just call GameLogic.tv.refresh(True) on each frame. You can download a demo game (with a video file) here: http://home.scarlet.be/~tsi46445/blender/VideoTextureDemo.zip For those who have already downloaded the demo, you can just update the blend file: http://home.scarlet.be/~tsi46445/blender/VideoTextureDemo.blend
2008-11-01VideoTexture module.Benoit Bolsee
The only compilation system that works for sure is the MSVC project files. I've tried my best to update the other compilation system but I count on the community to check and fix them. This is Zdeno Miklas video texture plugin ported to trunk. The original plugin API is maintained (can be found here http://home.scarlet.be/~tsi46445/blender/blendVideoTex.html) EXCEPT for the following: The module name is changed to VideoTexture (instead of blendVideoTex). A new (and only) video source is now available: VideoFFmpeg() You must pass 1 to 4 arguments when you create it (you can use named arguments): VideoFFmpeg(file) : play a video file VideoFFmpeg(file, capture, rate, width, height) : start a live video capture file: In the first form, file is a video file name, relative to startup directory. It can also be a URL, FFmpeg will happily stream a video from a network source. In the second form, file is empty or is a hint for the format of the video capture. In Windows, file is ignored and should be empty or not specified. In Linux, ffmpeg supports two types of device: VideoForLinux and DV1394. The user specifies the type of device with the file parameter: [<device_type>][:<standard>] <device_type> : 'v4l' for VideoForLinux, 'dv1394' for DV1394; default to 'v4l' <standard> : 'pal', 'secam' or 'ntsc', default to 'ntsc' The driver name is constructed automatically from the device types: v4l : /dev/video<capture> dv1394: /dev/dv1394/<capture> If you have different driver name, you can specify the driver name explicitely instead of device type. Examples of valid file parameter: /dev/v4l/video0:pal /dev/ieee1394/1:ntsc dv1394:ntsc v4l:pal :secam capture: Defines the index number of the capture source, starting from 0. The first capture device is always 0. The VideoTexutre modules knows that you want to start a live video capture when you set this parameter to a number >= 0. Setting this parameter < 0 indicates a video file playback. Default value is -1. rate: the capture frame rate, by default 25 frames/sec width: height: Width and height of the video capture in pixel, default value 0. In Windows you must specify these values and they must fit with the capture device capability. For example, if you have a webcam that can capture at 160x120, 320x240 or 640x480, you must specify one of these couple of values or the opening of the video source will fail. In Linux, default values are provided by the VideoForLinux driver if you don't specify width and height. Simple example ************** 1. Texture definition script: import VideoTexture contr = GameLogic.getCurrentController() obj = contr.getOwner() if not hasattr(GameLogic, 'video'): matID = VideoTexture.materialID(obj, 'MAVideoMat') GameLogic.video = VideoTexture.Texture(obj, matID) GameLogic.vidSrc = VideoTexture.VideoFFmpeg('trailer_400p.ogg') # Streaming is also possible: #GameLogic.vidSrc = VideoTexture.VideoFFmpeg('http://10.32.1.10/trailer_400p.ogg') GameLogic.vidSrc.repeat = -1 # If the video dimensions are not a power of 2, scaling must be done before # sending the texture to the GPU. This is done by default with gluScaleImage() # but you can also use a faster, but less precise, scaling by setting scale # to True. Best approach is to convert the video offline and set the dimensions right. GameLogic.vidSrc.scale = True # FFmpeg always delivers the video image upside down, so flipping is enabled automatically #GameLogic.vidSrc.flip = True if contr.getSensors()[0].isPositive(): GameLogic.video.source = GameLogic.vidSrc GameLogic.vidSrc.play() 2. Texture refresh script: obj = GameLogic.getCurrentController().getOwner() if hasattr(GameLogic, 'video') != 0: GameLogic.video.refresh(True) You can download this demo here: http://home.scarlet.be/~tsi46445/blender/VideoTextureDemo.blend http://home.scarlet.be/~tsi46445/blender/trailer_400p.ogg