![]() |
|
||||||||||
|
|||||
|
Регистрация: Mar 2012
Сообщений: 7
|
Привет!
как сделать скрин в stage3d если юзается движок альтернатива? пробовал так: private function onSnapshotClicked(e:UIEvent):void { var bd: BitmapData = new BitmapData(Main.instance.stage.stageWidth, Main.instance.stage.stageHeight); var cntx: Context3D = BuilderResources.context; cntx.clear(); GameCamera.instance.render(stage); cntx.drawToBitmapData(bd); var bmp: Bitmap = new Bitmap(bd); cntx.present(); Main.instance.addChild(bmp); } Но нифига. Постоянная ошибка: Error #3692: All buffers need to be cleared every frame before drawing. доканывает мои нервы. Нарыл такое: http://forum.starling-framework.org/...awtobitmapdata но там для старлинга... Последний раз редактировалось TMonax; 25.12.2015 в 15:41. |
|
|||||
|
Собственно это баг в движке, равносильный багу в старлинге. Он происходит из-за того, что устанавливается рендер в текстуру каждую интерацию для каждого объекта, поэтому и буффер должен каждый раз очищаться, но если он будет очищаться так каждый раз, то у тебя будет отрисован только один объект.
Попробуй так, но не уверен, что это поможет, лучше пофиксить прямо в движке если у него исходный код есть private function onSnapshotClicked(e:UIEvent):void { var bd: BitmapData = new BitmapData(Main.instance.stage.stageWidth, Main.instance.stage.stageHeight); var cntx: Context3D = BuilderResources.context; cntx.drawToBitmapData(bd); cntx.clear(); GameCamera.instance.render(stage); var bmp: Bitmap = new Bitmap(bd); cntx.present(); Main.instance.addChild(bmp); } Вообще, для наглядности, должно происходить как-то так, вначале указывается либо буффер, либо текстура, либо битмапдата для отрисовки, а потом уже очищается context3d.
__________________
Я заклинаю вас действовать иначе. |
|
|||||
|
Регистрация: Oct 2013
Сообщений: 7
|
Когда то делал так.
private function photosave (e:MouseEvent):void{ var br:ByteArray = PNGEncoder.encode(camera.view.canvas.clone()); var file:FileReference = new FileReference(); file.save(br, "char.png"); } package { import flash.geom.*; import flash.display.Bitmap; import flash.display.BitmapData; import flash.utils.ByteArray; /** * Class that converts BitmapData into a valid PNG */ public class PNGEncoder { /** * Created a PNG image from the specified BitmapData * * @param image The BitmapData that will be converted into the PNG format. * @return a ByteArray representing the PNG encoded image data. * @langversion ActionScript 3.0 * @playerversion Flash 9.0 * @tiptext */ public static function encode(img:BitmapData):ByteArray { // Create output byte array var png:ByteArray = new ByteArray(); // Write PNG signature png.writeUnsignedInt(0x89504e47); png.writeUnsignedInt(0x0D0A1A0A); // Build IHDR chunk var IHDR:ByteArray = new ByteArray(); IHDR.writeInt(img.width); IHDR.writeInt(img.height); IHDR.writeUnsignedInt(0x08060000); // 32bit RGBA IHDR.writeByte(0); writeChunk(png,0x49484452,IHDR); // Build IDAT chunk var IDAT:ByteArray= new ByteArray(); for(var i:int=0;i < img.height;i++) { // no filter IDAT.writeByte(0); var p:uint; var j:int; if ( !img.transparent ) { for(j=0;j < img.width;j++) { p = img.getPixel(j,i); IDAT.writeUnsignedInt( uint(((p&0xFFFFFF) << 8)|0xFF)); } } else { for(j=0;j < img.width;j++) { p = img.getPixel32(j,i); IDAT.writeUnsignedInt( uint(((p&0xFFFFFF) << 8)| (p>>>24))); } } } IDAT.compress(); writeChunk(png,0x49444154,IDAT); // Build IEND chunk writeChunk(png,0x49454E44,null); // return PNG return png; } private static var crcTable:Array; private static var crcTableComputed:Boolean = false; private static function writeChunk(png:ByteArray, type:uint, data:ByteArray):void { if (!crcTableComputed) { crcTableComputed = true; crcTable = []; var c:uint; for (var n:uint = 0; n < 256; n++) { c = n; for (var k:uint = 0; k < 8; k++) { if (c & 1) { c = uint(uint(0xedb88320) ^ uint(c >>> 1)); } else { c = uint(c >>> 1); } } crcTable[n] = c; } } var len:uint = 0; if (data != null) { len = data.length; } png.writeUnsignedInt(len); var p:uint = png.position; png.writeUnsignedInt(type); if ( data != null ) { png.writeBytes(data); } var e:uint = png.position; png.position = p; c = 0xffffffff; for (var i:int = 0; i < (e-p); i++) { c = uint(crcTable[ (c ^ png.readUnsignedByte()) & uint(0xff)] ^ uint(c >>> 8)); } c = uint(c^uint(0xffffffff)); png.position = e; png.writeUnsignedInt(c); } } } |
|
|||||
|
Регистрация: Mar 2012
Сообщений: 7
|
Всем спасибо.
Решил задачу так (рабочий код): package { import alternativa.engine3d.controllers.SimpleObjectController; import alternativa.engine3d.core.Camera3D; import alternativa.engine3d.core.Object3D; import alternativa.engine3d.core.Resource; import alternativa.engine3d.core.View; import alternativa.engine3d.loaders.Parser3DS; import alternativa.engine3d.loaders.ParserA3D; import alternativa.engine3d.loaders.ParserCollada; import alternativa.engine3d.loaders.ParserMaterial; import alternativa.engine3d.loaders.TexturesLoader; import alternativa.engine3d.materials.TextureMaterial; import alternativa.engine3d.objects.Mesh; import alternativa.engine3d.objects.Surface; import alternativa.engine3d.resources.ExternalTextureResource; import alternativa.engine3d.resources.Geometry; import flash.display.Sprite; import flash.display.Stage3D; import flash.display.StageAlign; import flash.display.StageScaleMode; import flash.events.Event; import flash.net.URLLoader; import flash.net.URLLoaderDataFormat; import flash.net.URLRequest; import flash.geom.Vector3D; import alternativa.engine3d.primitives.Box; import alternativa.engine3d.materials.FillMaterial; import flash.display.Bitmap; import flash.display.BitmapData; import flash.geom.Matrix; import flash.geom.Rectangle; import flash.geom.Point; public class main extends Sprite { private var scene:Object3D = new Object3D(); private var camera:Camera3D; private var controller:SimpleObjectController; private var stage3D:Stage3D; private var mybitmap:Bitmap; public function main():void { stage.align = StageAlign.TOP_LEFT; stage.scaleMode = StageScaleMode.NO_SCALE; camera = new Camera3D(1, 1000); camera.view = new View(stage.stageWidth, stage.stageHeight, false, 0, 0, 4); addChild(camera.view); addChild(camera.diagram); camera.x = -150; camera.y = -150; camera.z = 0; camera.view.renderToBitmap = true; controller = new SimpleObjectController(stage, camera, 200); controller.lookAt(new Vector3D(0,0,0)); scene.addChild(camera); stage3D = stage.stage3Ds[0]; stage3D.addEventListener(Event.CONTEXT3D_CREATE, onContextCreate); stage3D.requestContext3D(); } private function onContextCreate(e:Event):void { stage3D.removeEventListener(Event.CONTEXT3D_CREATE, onContextCreate); mybitmap = new Bitmap(); mybitmap.smoothing = true; mybitmap.bitmapData = camera.view.canvas; var b:Box = new Box(50, 50, 50, 1, 1, 1, false, null); b.setMaterialToAllSurfaces(new FillMaterial(0xFF0000)); scene.addChild(b); uploadResources(b.getResources(false, Geometry)); stage.addEventListener(Event.ENTER_FRAME, onEnterFrame); stage.addEventListener(Event.RESIZE, onResize); onResize(); stage.addChild(mybitmap); } private function uploadResources(resources:Vector.):void { for each (var resource:Resource in resources) { resource.upload(stage3D.context3D); } } private function onEnterFrame(e:Event):void { controller.update(); camera.render(stage3D); mybitmap.bitmapData = cropBitmapData(camera.view.canvas, 200, 130); } private function onResize(e:Event = null):void { camera.view.width = stage.stageWidth; camera.view.height = stage.stageHeight; } private function cropBitmapData(sourceBitmapData:BitmapData, width:Number, height:Number):BitmapData { var ratio:Number = height/width; var m:Matrix = new Matrix(); m.scale(width / sourceBitmapData.width, height / sourceBitmapData.height); var bmp:BitmapData = new BitmapData(width, height, false, 0x000000); bmp.draw(sourceBitmapData, m); return bmp.clone(); bmp.dispose(); } } } |
![]() |
![]() |
Часовой пояс GMT +4, время: 08:26. |
|
|
« Предыдущая тема | Следующая тема » |
|
|