Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 25.12.2015, 15:31
TMonax вне форума Посмотреть профиль Отправить личное сообщение для TMonax Найти все сообщения от TMonax
  № 1  
Ответить с цитированием
TMonax
 
Аватар для TMonax

Регистрация: Mar 2012
Сообщений: 7
По умолчанию Скриншот в Stage3D (Alternativa3d)

Привет!
как сделать скрин в stage3d если юзается движок альтернатива?
пробовал так:
Код AS3:
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);
}
Типа по правилу "вызывать контекст.drawToBitmapData между рендером и present-ом".
Но нифига.
Постоянная ошибка:
Error #3692: All buffers need to be cleared every frame before drawing.
доканывает мои нервы.

Нарыл такое:
http://forum.starling-framework.org/...awtobitmapdata
но там для старлинга...


Последний раз редактировалось TMonax; 25.12.2015 в 15:41.
Старый 26.12.2015, 13:09
Bletraut вне форума Посмотреть профиль Отправить личное сообщение для Bletraut Найти все сообщения от Bletraut
  № 2  
Ответить с цитированием
Bletraut
 
Аватар для Bletraut

Регистрация: Mar 2013
Адрес: Вне пространства.
Сообщений: 567
Отправить сообщение для Bletraut с помощью ICQ Отправить сообщение для Bletraut с помощью Skype™
Собственно это баг в движке, равносильный багу в старлинге. Он происходит из-за того, что устанавливается рендер в текстуру каждую интерацию для каждого объекта, поэтому и буффер должен каждый раз очищаться, но если он будет очищаться так каждый раз, то у тебя будет отрисован только один объект.
Попробуй так, но не уверен, что это поможет, лучше пофиксить прямо в движке если у него исходный код есть
Код AS3:
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);
}
Добавлено через 4 минуты
Код AS3:
	if (!_postProcessing)
			{
				context3d.setRenderToBackBuffer();
			}
			else
			{
				context3d.setRenderToTexture(sceneTexture, true);
			}
			context3d.clear();
Вообще, для наглядности, должно происходить как-то так, вначале указывается либо буффер, либо текстура, либо битмапдата для отрисовки, а потом уже очищается context3d.
__________________
Я заклинаю вас действовать иначе.

Старый 04.01.2016, 00:55
Nikirozzz вне форума Посмотреть профиль Отправить личное сообщение для Nikirozzz Найти все сообщения от Nikirozzz
  № 3  
Ответить с цитированием
Nikirozzz

Регистрация: Oct 2013
Сообщений: 7
Когда то делал так.
Код AS3:
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");
}
Код AS3:
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);
            }
        }
}
Правда это давно было, возможно сейчас этот способ уже не работает.

Старый 07.01.2016, 13:48
TMonax вне форума Посмотреть профиль Отправить личное сообщение для TMonax Найти все сообщения от TMonax
  № 4  
Ответить с цитированием
TMonax
 
Аватар для TMonax

Регистрация: Mar 2012
Сообщений: 7
Tip Решение

Всем спасибо.
Решил задачу так (рабочий код):
Код AS3:
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.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 08:26.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.