public ApplicationSprite() { //this.stage.scaleMode = StageScaleMode.SHOW_ALL; // http://wiki.flare3d.com/index.php?title=Test19_-_Embeding_Collada_File this.scene = new Viewer3D(this); camera.setPosition(200, 200, -300); camera.lookAt(0.0, 50, 0.0); scene.camera = camera; //scene.library.addItem("Soldier_new-1.jpg", new Texture3D( // KnownEmbeddedResources.Default["assets/FlashFlare3DEmbedingColladaFile/Soldier_new-1.jpg"].ToBitmapAsset() // )); //new knocked_out_7(scene); //new knocked_out_7(scene) { x = 200 }; new HZCannon(scene); scene.autoResize = true; //this.scene.setViewport(0, 0, this.stage.stageWidth, this.stage.stageHeight); //this.stage.resize += // delegate // { // this.scene.setViewport(0, 0, this.stage.stageWidth, this.stage.stageHeight); // }; this.addChild(new net.hires.debug.Stats()); }
public knocked_out_7(Viewer3D scene) : base( KnownEmbeddedResources.Default["assets/FlashFlare3DEmbedingColladaFile/knocked_out_7.dae"].ToXMLAsset() ) { this.parent = scene; this.load(); }
public ApplicationSprite() { var scene = new Viewer3D(this); scene.camera = new Camera3D(); scene.camera.setPosition(120, 40, -30); scene.camera.lookAt(0, 0, 0); scene.addChild(new ship()); }
private bool ShowCenter() { SpecsAndGeomWindow SAGW = (SpecsAndGeomWindow)CatApplication.ActiveWindow; Viewer3D NewView = (Viewer3D)SAGW.ActiveViewer; NewView.Reframe(); Viewpoint3D viewpoint3D1 = NewView.Viewpoint3D; this.TopMost = false; return(false); }
public HZCannon(Viewer3D scene) : base( KnownEmbeddedResources.Default["assets/FlashFlare3DEmbedingColladaFile/HZCannon.dae"].ToXMLAsset() ) { scene.library.addItem("HZCannon_capture_009_04032013_192834.png", new Texture3D( KnownEmbeddedResources.Default["assets/FlashFlare3DEmbedingColladaFile/HZCannon_capture_009_04032013_192834.png"].ToBitmapAsset() )); this.parent = scene; this.load(); }
/*! * @param url URL to 3D animation file to load. * Load a 3D animation content file (BVH or Vixen format) * and apply it to the current skeleton. * * @see PlayAnimation PauseAnimation */ public void LoadAnimation(string url) { Viewer3D viewer = Viewer as Viewer3D; Scriptor scriptor = AnimScriptor; String ext = url.Substring(url.LastIndexOf('.')).ToLower(); string skelname = ConnectSkeleton(); AnimScriptor.Directory = Path.GetDirectoryName(url); AnimScriptor.Target = _skeleton; if (ext == ".scp") { scriptor.LoadScript(url); } else { _animName = Path.GetFileNameWithoutExtension(url) + skelname; scriptor.Load(url, skelname, Animator.AUTO_PLAY, _skeleton); } }
protected string ConnectSkeleton() { if (_skelName != null) { return(_skelName); } try { Group g = SharedWorld.MainScene.Engines.Find(".skeleton", Group.FIND_ACTIVE | Group.FIND_DESCEND | Group.FIND_END); Viewer3D viewer = Viewer as Viewer3D; Skeleton skel = g.ConvertTo(SerialID.VX_Skeleton) as Skeleton; string skelname = skel.Name; _skelName = skelname.Substring(skelname.IndexOf('.')); _skeleton = skel; AnimScriptor.Target = skel; return(_skelName); } catch (Exception) { return(null); } }
/*! * Pauses the currently playing animation. * * @see LoadAnimation PlayAnimation */ public void PauseAnimation(string name) { try { Viewer3D viewer = Viewer as Viewer3D; string skelname = ConnectSkeleton(); Scriptor scp = AnimScriptor; if (skelname != null) { if (name != null) { scp.End(name + skelname); } else { scp.End(_animName); } } } catch (Exception ex) { SharedWorld.LogError("PauseAnimation EXCEPTION " + ex.Message); } }
public void Initialize() { ClearControls(); this.slice = new Rectangle3D(); this.slice.Name = "SlicePlane"; // First tool strip: Slice position. slicePositionToolStrip = new ToolStrip(); slicePositionToolStrip.Dock = DockStyle.Top; currentSliceLabel = new ToolStripLabel(); currentSliceLabel.DisplayStyle = ToolStripItemDisplayStyle.Text; // NOTE: The text for this label is set below. slicePositionToolStrip.Items.Add(currentSliceLabel); zLabel = new ToolStripLabel(); zLabel.DisplayStyle = ToolStripItemDisplayStyle.Text; // NOTE: The text for this label is set below. slicePositionToolStrip.Items.Add(zLabel); ToolStripSeparator separator1 = new ToolStripSeparator(); slicePositionToolStrip.Items.Add(separator1); moveUpButton = new ToolStripButton(); moveUpButton.Click += new EventHandler(HandleMoveUpButtonClick); moveUpButton.DisplayStyle = ToolStripItemDisplayStyle.Text; moveUpButton.Text = "Move up"; slicePositionToolStrip.Items.Add(moveUpButton); moveDownButton = new ToolStripButton(); moveDownButton.Click += new EventHandler(HandleMoveDownButtonClick); moveDownButton.DisplayStyle = ToolStripItemDisplayStyle.Text; moveDownButton.Text = "Move down"; slicePositionToolStrip.Items.Add(moveDownButton); zStepLabel = new ToolStripLabel(); zStepLabel.DisplayStyle = ToolStripItemDisplayStyle.Text; zStepLabel.Text = "Step: "; slicePositionToolStrip.Items.Add(zStepLabel); zStepTextBox = new ToolStripTextBox(); zStepTextBox.DisplayStyle = ToolStripItemDisplayStyle.Text; zStepTextBox.Text = "0.01"; zStepTextBox.AutoSize = false; zStepTextBox.Width = 50; slicePositionToolStrip.Items.Add(zStepTextBox); ToolStripSeparator separator2 = new ToolStripSeparator(); slicePositionToolStrip.Items.Add(separator2); insertSliceButton = new ToolStripButton(); insertSliceButton.Click += new EventHandler(HandleInsertSliceButtonClick); insertSliceButton.DisplayStyle = ToolStripItemDisplayStyle.Text; insertSliceButton.Text = "Insert slice"; slicePositionToolStrip.Items.Add(insertSliceButton); removeSliceButton = new ToolStripButton(); removeSliceButton.Enabled = false; removeSliceButton.Click += new EventHandler(HandleRemoveSliceButtonClick); removeSliceButton.DisplayStyle = ToolStripItemDisplayStyle.Text; removeSliceButton.Text = "Remove slice"; slicePositionToolStrip.Items.Add(removeSliceButton); // Second tool strip: Slice editing sliceEditingToolStrip = new ToolStrip(); sliceEditingToolStrip.Dock = DockStyle.Top; moveButton = new ToolStripButton(); moveButton.DisplayStyle = ToolStripItemDisplayStyle.Text; moveButton.Text = "Move"; moveButton.CheckOnClick = true; moveButton.Checked = false; moveButton.CheckedChanged += new EventHandler(HandleMoveButtonCheckedChanged); sliceEditingToolStrip.Items.Add(moveButton); expandButton = new ToolStripButton(); expandButton.DisplayStyle = ToolStripItemDisplayStyle.Text; expandButton.Text = "Expand"; expandButton.CheckOnClick = true; expandButton.Checked = false; expandButton.CheckedChanged += new EventHandler(HandleExpandButtonCheckedChanged); sliceEditingToolStrip.Items.Add(expandButton); alignXButton = new ToolStripButton(); alignXButton.Enabled = false; alignXButton.DisplayStyle = ToolStripItemDisplayStyle.Text; alignXButton.Text = "Align X"; alignXButton.Click += new EventHandler(HandleAlignXButtonClick); sliceEditingToolStrip.Items.Add(alignXButton); alignYButton = new ToolStripButton(); alignYButton.Enabled = false; alignYButton.DisplayStyle = ToolStripItemDisplayStyle.Text; alignYButton.Text = "Align Y"; alignYButton.Click += new EventHandler(HandleAlignYButtonClick); sliceEditingToolStrip.Items.Add(alignYButton); // Third tool strip: Rendering tool strip renderingToolStrip = new ToolStrip(); renderingToolStrip.Dock = DockStyle.Top; showWireframeButton = new ToolStripButton(); showWireframeButton.DisplayStyle = ToolStripItemDisplayStyle.Text; showWireframeButton.Text = "Show wireframe"; showWireframeButton.CheckOnClick = true; showWireframeButton.Checked = false; showWireframeButton.CheckedChanged += new EventHandler(HandleShowWireframeButtonCheckedChanged); renderingToolStrip.Items.Add(showWireframeButton); showSurfacesButton = new ToolStripButton(); showSurfacesButton.DisplayStyle = ToolStripItemDisplayStyle.Text; showSurfacesButton.Text = "Show surfaces"; showSurfacesButton.CheckOnClick = true; showSurfacesButton.Checked = true; showSurfacesButton.CheckedChanged += new EventHandler(HandleShowSurfacesButtonCheckedChanged); renderingToolStrip.Items.Add(showSurfacesButton); showVerticesButton = new ToolStripButton(); showVerticesButton.DisplayStyle = ToolStripItemDisplayStyle.Text; showVerticesButton.Text = "Show vertices"; showVerticesButton.CheckOnClick = true; showVerticesButton.Checked = false; showVerticesButton.CheckedChanged += new EventHandler(HandleShowVerticesButtonCheckedChanged); renderingToolStrip.Items.Add(showVerticesButton); showSlicePlaneButton = new ToolStripButton(); showSlicePlaneButton.DisplayStyle = ToolStripItemDisplayStyle.Text; showSlicePlaneButton.Text = "Show slice plane"; showSlicePlaneButton.CheckOnClick = true; showSlicePlaneButton.Checked = true; showSlicePlaneButton.CheckedChanged += new EventHandler(HandleShowSlicePlaneButtonCheckedChanged); renderingToolStrip.Items.Add(showSlicePlaneButton); showAxesButton = new ToolStripButton(); showAxesButton.DisplayStyle = ToolStripItemDisplayStyle.Text; showAxesButton.Text = "Show axes"; showAxesButton.CheckOnClick = true; showAxesButton.Checked = false; showAxesButton.CheckedChanged += new EventHandler(HandleShowAxesButtonCheckedChanged); renderingToolStrip.Items.Add(showAxesButton); ToolStripSeparator separator3 = new ToolStripSeparator(); renderingToolStrip.Items.Add(separator3); numberOfLongitudePointsLabel = new ToolStripLabel(); numberOfLongitudePointsLabel.DisplayStyle = ToolStripItemDisplayStyle.Text; numberOfLongitudePointsLabel.Text = "Number of longitude points: "; renderingToolStrip.Items.Add(numberOfLongitudePointsLabel); numberOfLongitudePointsTextBox = new ToolStripTextBox(); numberOfLongitudePointsTextBox.DisplayStyle = ToolStripItemDisplayStyle.Text; numberOfLongitudePointsTextBox.Text = "32"; numberOfLongitudePointsTextBox.AutoSize = false; numberOfLongitudePointsTextBox.Width = 30; numberOfLongitudePointsTextBox.TextChanged += new EventHandler(HandleNumberOfLongitudePointsTextBoxTextChanged); renderingToolStrip.Items.Add(numberOfLongitudePointsTextBox); shadingModelLabel = new ToolStripLabel(); shadingModelLabel.DisplayStyle = ToolStripItemDisplayStyle.Text; shadingModelLabel.Text = "Shading model"; renderingToolStrip.Items.Add(shadingModelLabel); shadingModelComboBox = new ToolStripComboBox(); shadingModelComboBox.DropDownStyle = ComboBoxStyle.DropDownList; shadingModelComboBox.Items.Add("Flat"); shadingModelComboBox.Items.Add("Smooth"); shadingModelComboBox.AutoSize = false; shadingModelComboBox.Width = 70; shadingModelComboBox.SelectedIndex = 1; // Default value: Smooth shading shadingModelComboBox.SelectedIndexChanged += new EventHandler(HandleShadingModelComboBoxSelectedIndexChanged); renderingToolStrip.Items.Add(shadingModelComboBox); autoRenderButton = new ToolStripButton(); autoRenderButton.DisplayStyle = ToolStripItemDisplayStyle.Text; autoRenderButton.Text = "Autorender"; autoRenderButton.CheckOnClick = true; autoRenderButton.Checked = true; autoRenderButton.CheckedChanged += new EventHandler(HandleAutoRenderButtonCheckedChanged); renderingToolStrip.Items.Add(autoRenderButton); splitContainer = new SplitContainer(); splitContainer.Dock = DockStyle.Fill; this.Controls.Add(splitContainer); viewer3D = new Viewer3D(); viewer3D.Dock = DockStyle.Fill; splitContainer.Panel1.Controls.Add(viewer3D); bezierCurveViewer = new BezierCurveViewer(); bezierCurveViewer.Dock = DockStyle.Fill; splitContainer.Panel2.Controls.Add(bezierCurveViewer); splitContainer.SplitterDistance = this.Width / 2; bezierCurveViewer.SetRange(-2, 2, -2, 2); bezierCurveViewer.SplineCurveChanged += new EventHandler(HandleBezierSplineViewerSplineCurveChanged); bezierCurveViewer.PointsSelected += new EventHandler(HandleBezierCurveViewerPointsSelected); bezierCurveViewer.AllPointsDeSelected += new EventHandler(HandleBezierCurveViewerAllPointsDeSelected); // Add the toolstrips in reverse order // Strangely enough, they should also apparently be inserted AFTER the SplitContainer, despite // the latter's DockStyle (= Fill)! this.Controls.Add(renderingToolStrip); this.Controls.Add(sliceEditingToolStrip); this.Controls.Add(slicePositionToolStrip); // MW ToDo: Some ugly hard-coding here... scene = new Scene3D(); Light light = new Light(); light.Position[1] = -5; light.Position[2] = 3; light.IsOn = true; scene.LightList.Add(light); face.AmbientColor = Color.FromArgb(255, 205, 148); // Typical skin color approximation face.DiffuseColor = Color.FromArgb(255, 205, 148); // Typical skin color approximation face.SpecularColor = Color.White; face.Shininess = 50; // 20; int numberOfLongitudePoints = int.Parse(numberOfLongitudePointsTextBox.Text); face.Generate(new List <double>() { numberOfLongitudePoints }); scene.AddObject(face); slice.AmbientColor = Color.FromArgb(200, 100, 255, 100); slice.DiffuseColor = Color.FromArgb(200, 100, 255, 100); slice.SpecularColor = Color.FromArgb(200, 100, 255, 100); slice.Shininess = 20; slice.Generate(new List <double>() { 3.0, 3.0 }); scene.AddObject(slice); currentSliceIndex = face.HorizontalBezierCurveList.Count / 2; slice.Move(0, 0, face.HorizontalBezierCurveList[currentSliceIndex].SplineList[0].ControlPointList[0].CoordinateList[2]); // slice.Translate(0, 0, face.HorizontalBezierCurveList[currentSliceIndex].SplineList[0].ControlPointList[0].CoordinateList[2]); bezierCurveViewer.SetBezierCurve(face.HorizontalBezierCurveList[currentSliceIndex]); currentSliceLabel.Text = "Current slice: " + currentSliceIndex.ToString() + " of " + (face.HorizontalBezierCurveList.Count - 1).ToString(); zLabel.Text = "z = " + face.HorizontalBezierCurveList[currentSliceIndex].SplineList[0].ControlPointList[0].CoordinateList[2].ToString("0.0000"); zStepTextBox.TextChanged += new EventHandler(HandleZStepTextBoxTextChanged); // Add the event handler here, AFTER setting the slice index viewer3D.Scene = scene; viewer3D.CameraTarget = new OpenTK.Vector3(0f, 0f, 0.5f); // The model extends from 0 to 1 in z. viewer3D.ArrowUpPressed -= new EventHandler(HandlerViewer3DArrowUpPressed); viewer3D.ArrowUpPressed += new EventHandler(HandlerViewer3DArrowUpPressed); viewer3D.ArrowDownPressed -= new EventHandler(HandleViewer3DArrowDownPressed); viewer3D.ArrowDownPressed += new EventHandler(HandleViewer3DArrowDownPressed); }
// AIR does not yet show anything. why public ApplicationSprite() { // curityError: Error #2148: SWF file file:///X|/jsc.svn/examples/actionscript/synergy/Flare3DWaterShips/Flare3DWaterShips/bin/Debug/staging/Flare3DWaterShips.ApplicationSprite/web/Flare3DWaterShips.ApplicationSprite.swf cannot access local resource file:///X|/jsc.svn/examples/actionscript/synergy/Flare3DWaterShips/Flare3DWaterShips/bin/Debug/staging/Flare3DWaterShips.ApplicationSprite/web/Flare3DWaterShips.ApplicationSprite.swf/[[DYNAMIC]]/3. Only local-with-filesystem and trusted local SWF files may access local resources. //at flash.display::Loader/get content() //at flare.core::Texture3D/completeEvent()[Z:\projects\flare3d 2.5\src\flare\core\Texture3D.as:496] var scene = new Viewer3D(this, "", 0.2); scene.camera = new Camera3D(); scene.camera.setPosition(120, 40, -30); scene.camera.lookAt(0, 0, 0); #region mirrorCam var mirrorCam = new Camera3D(); var mirror = new Texture3D(new Point(512, 512)); mirror.mipMode = Texture3D.MIP_NONE; mirror.wrapMode = Texture3D.WRAP_CLAMP; mirror.upload(scene); #endregion #region oceanShader var Ocean = KnownEmbeddedResources.Default["assets/Flare3DWaterShips/ocean07.flsl.compiled"]; var oceanShader = new FLSLMaterial("oceanShader", Ocean.ToByteArrayAsset()); var oceanShader_params = oceanShader.@params as dynamic; // http://www.flare3d.com/docs/flare/core/Texture3D.html // http://wiki.flare3d.com/index.php?title=FLAR_Toolkit_integration oceanShader_params.skyMap.value = new Texture3D( KnownEmbeddedResources.Default[ "assets/Flare3DWaterShips/highlights.png" ].ToBitmapAsset(), false, Texture3D.FORMAT_CUBEMAP); oceanShader_params.normalMap.value = new Texture3D( KnownEmbeddedResources.Default["assets/Flare3DWaterShips/normalmap.jpg"].ToBitmapAsset()); oceanShader_params.mirrorMap.value = mirror; #endregion // http://www.flare3d.com/support/index.php?topic=142.0 var water = new Plane("water", 3000, 3000, oceanGridSize - 1, oceanShader, "+xz"); var skybox = new SkyBox( KnownEmbeddedResources.Default["assets/Flare3DWaterShips/skybox.png"].ToBitmapAsset(), SkyBox.HORIZONTAL_CROSS, null, 1); // http://www.flare3d.com/support/index.php?topic=63.0 // http://www.flare3d.com/docs/tutorials/loadFromBytes/ var ship0 = new Flare3DWaterShipComponent.ship(); // how to make it safe to provide 3rd party assetslibrary builder // code templates? which can be selected by KnownEmbeddedResources pattern match? // class XFileTemplate<T> where T like foo "*.zf3d" var ship1 = new Flare3DWaterShipComponent.ship(); ship1.x = 40; ship1.y = 10; var particles = new particles(); #region initWaves(): var bytes = new ByteArray(); bytes.endian = Endian.LITTLE_ENDIAN; bytes.length = oceanGridSize * oceanGridSize * 12; // 4 btyes * RGB = 12. // http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/ShaderData.html // public static class ShaderData // { // public ShaderData(ByteArray byteCode); // } var PBWater = KnownEmbeddedResources.Default["assets/Flare3DWaterShips/water.pbj"]; var shader = new Shader(PBWater.ToByteArrayAsset()); var shader_data = shader.data as dynamic; shader_data.src.input = bmp; var surf = new Surface3D("data"); // http://www.flare3d.com/docs/flare/core/Surface3D.html // public override int addVertexData(uint dataIndex, int size = -1, Vector<double> vector = null); surf.addVertexData(dataIndex: (uint)Surface3D.COLOR0, size: 3); surf.vertexBytes = bytes; surf.upload(scene); water.surfaces[0].sources[Surface3D.COLOR0] = surf; #endregion ship0.addChild(particles); scene.addChild(skybox); scene.addChild(water); scene.addChild(ship0); scene.addChild(ship1); var st = new Stopwatch(); st.Start(); ship1.setScale(2, 2, 2); scene.addEventListener(Scene3D.RENDER_EVENT, listener: new Action <Event>( delegate { // render the big waves. #region renderWaves() { var timer = st.ElapsedMilliseconds; point0.y = timer / 400; point1.y = timer / 640; // flash natives: apply params? bmp.perlinNoise(3, 3, 2, 0, false, true, 7, true, new[] { point0, point1 }); var job = new ShaderJob(shader, bytes, oceanGridSize, oceanGridSize); //job.addEventListener( ShaderEvent.COMPLETE, shaderCompleteEvent, false, 0, true ); job.complete += delegate { if (surf.vertexBuffer != null) { surf.vertexBuffer.uploadFromByteArray(bytes, 0, 0, oceanGridSize * oceanGridSize); } }; job.start(); } #endregion // copy from the main camera and invert in Y axis. mirrorCam.copyTransformFrom(scene.camera); mirrorCam.transform.appendScale(1, -1, 1); // setup the mirror cam to start rendering on the mirror texture. scene.setupFrame(mirrorCam); scene.context.setRenderToTexture(mirror.texture, true); scene.context.clear(0, 0, 0, 0); // get the pixel color height. var color = bmp.getPixel(oceanGridSize / 2, oceanGridSize / 2) & 0xff; // ! .0 marks it as double. otherwise ship will digitally step on water var height = color / 255.0 * 20 + 1; // draw objects into the mirror texture. ship0.y = -height; ship0.draw(); ship0.y = height; ship1.z = st.ElapsedMilliseconds * 0.001 - 100; ship1.y = -height; ship1.draw(); ship1.y = height; // get back to the main render. scene.context.setRenderToBackBuffer(); scene.setupFrame(scene.camera); } ).ToFunction() ); // http://www.flare3d.com/support/index.php?topic=1101.0 this.addChild(new net.hires.debug.Stats()); }
/*! * @param url URL of 3D scene file to load. * Load a 3D content file (Havok or Vixen format) * and handle a SceneLoadEvent when load is complete. * @see LoadAnimation */ public void LoadScene(string url) { try { Viewer3D viewer = Viewer as Viewer3D; Scene scene = SharedWorld.MainScene; Engine simroot = scene.Engines; SharedWorld.DoAsyncLoad = true; string ext = Path.GetExtension(url).ToLower(); if (ext == ".obj") { ObjIO.Import objload = new ObjIO.Import(); Scene newscene = objload.LoadFile(url); if (OBJLoaded != null) { OBJLoaded(newscene, url); } else { Viewer.SetScene(newscene); } } /* * else if (ext == ".xml") * { * ModImport.ModImport import = new ModImport.ModImport(); * * import.Load(url); * Scene newscene = import.ParseScene(); * Viewer.SetScene(newscene); * } * */ else if (ext == ".vix") { viewer.LoadAsync(url, scene); } else if (ext == ".hkt") { Physics physics = null; if (simroot != null) { physics = simroot.Find(".physics", Group.FIND_END | Group.FIND_CHILD) as Physics; } if (physics == null) { physics = new Physics(); physics.Name = "viewer.physics"; physics.Active = false; if (simroot != null) { simroot.Append(physics); } else { scene.Engines = physics; } } physics.Active = false; viewer.LoadAsync(url, scene); } else { throw new System.ArgumentException("invalid extension", ext); } } catch (Exception ex) { throw new System.IO.FileNotFoundException(ex.Message + ", Cannot open vixen file", url); } }
// AIR does not yet show anything. why public ApplicationSprite() { // curityError: Error #2148: SWF file file:///X|/jsc.svn/examples/actionscript/synergy/Flare3DWaterShips/Flare3DWaterShips/bin/Debug/staging/Flare3DWaterShips.ApplicationSprite/web/Flare3DWaterShips.ApplicationSprite.swf cannot access local resource file:///X|/jsc.svn/examples/actionscript/synergy/Flare3DWaterShips/Flare3DWaterShips/bin/Debug/staging/Flare3DWaterShips.ApplicationSprite/web/Flare3DWaterShips.ApplicationSprite.swf/[[DYNAMIC]]/3. Only local-with-filesystem and trusted local SWF files may access local resources. //at flash.display::Loader/get content() //at flare.core::Texture3D/completeEvent()[Z:\projects\flare3d 2.5\src\flare\core\Texture3D.as:496] var scene = new Viewer3D(this, "", 0.2); scene.camera = new Camera3D(); scene.camera.setPosition(120, 40, -30); scene.camera.lookAt(0, 0, 0); #region mirrorCam var mirrorCam = new Camera3D(); var mirror = new Texture3D(new Point(512, 512)); mirror.mipMode = Texture3D.MIP_NONE; mirror.wrapMode = Texture3D.WRAP_CLAMP; mirror.upload(scene); #endregion #region oceanShader var Ocean = KnownEmbeddedResources.Default["assets/Flare3DWaterShips/ocean07.flsl.compiled"]; var oceanShader = new FLSLMaterial("oceanShader", Ocean.ToByteArrayAsset()); var oceanShader_params = oceanShader.@params as dynamic; // http://www.flare3d.com/docs/flare/core/Texture3D.html // http://wiki.flare3d.com/index.php?title=FLAR_Toolkit_integration oceanShader_params.skyMap.value = new Texture3D( KnownEmbeddedResources.Default[ "assets/Flare3DWaterShips/highlights.png" ].ToBitmapAsset(), false, Texture3D.FORMAT_CUBEMAP); oceanShader_params.normalMap.value = new Texture3D( KnownEmbeddedResources.Default["assets/Flare3DWaterShips/normalmap.jpg"].ToBitmapAsset()); oceanShader_params.mirrorMap.value = mirror; #endregion // http://www.flare3d.com/support/index.php?topic=142.0 var water = new Plane("water", 3000, 3000, oceanGridSize - 1, oceanShader, "+xz"); var skybox = new SkyBox( KnownEmbeddedResources.Default["assets/Flare3DWaterShips/skybox.png"].ToBitmapAsset(), SkyBox.HORIZONTAL_CROSS, null, 1); // http://www.flare3d.com/support/index.php?topic=63.0 // http://www.flare3d.com/docs/tutorials/loadFromBytes/ var ship0 = new Flare3DWaterShipComponent.ship(); // how to make it safe to provide 3rd party assetslibrary builder // code templates? which can be selected by KnownEmbeddedResources pattern match? // class XFileTemplate<T> where T like foo "*.zf3d" var ship1 = new Flare3DWaterShipComponent.ship(); ship1.x = 40; ship1.y = 10; var particles = new particles(); #region initWaves(): var bytes = new ByteArray(); bytes.endian = Endian.LITTLE_ENDIAN; bytes.length = oceanGridSize * oceanGridSize * 12; // 4 btyes * RGB = 12. // http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/ShaderData.html // public static class ShaderData // { // public ShaderData(ByteArray byteCode); // } var PBWater = KnownEmbeddedResources.Default["assets/Flare3DWaterShips/water.pbj"]; var shader = new Shader(PBWater.ToByteArrayAsset()); var shader_data = shader.data as dynamic; shader_data.src.input = bmp; var surf = new Surface3D("data"); // http://www.flare3d.com/docs/flare/core/Surface3D.html // public override int addVertexData(uint dataIndex, int size = -1, Vector<double> vector = null); surf.addVertexData(dataIndex: (uint)Surface3D.COLOR0, size: 3); surf.vertexBytes = bytes; surf.upload(scene); water.surfaces[0].sources[Surface3D.COLOR0] = surf; #endregion ship0.addChild(particles); scene.addChild(skybox); scene.addChild(water); scene.addChild(ship0); scene.addChild(ship1); var st = new Stopwatch(); st.Start(); ship1.setScale(2, 2, 2); scene.addEventListener(Scene3D.RENDER_EVENT, listener: new Action<Event>( delegate { // render the big waves. #region renderWaves() { var timer = st.ElapsedMilliseconds; point0.y = timer / 400; point1.y = timer / 640; // flash natives: apply params? bmp.perlinNoise(3, 3, 2, 0, false, true, 7, true, new[] { point0, point1 }); var job = new ShaderJob(shader, bytes, oceanGridSize, oceanGridSize); //job.addEventListener( ShaderEvent.COMPLETE, shaderCompleteEvent, false, 0, true ); job.complete += delegate { if (surf.vertexBuffer != null) surf.vertexBuffer.uploadFromByteArray(bytes, 0, 0, oceanGridSize * oceanGridSize); }; job.start(); } #endregion // copy from the main camera and invert in Y axis. mirrorCam.copyTransformFrom(scene.camera); mirrorCam.transform.appendScale(1, -1, 1); // setup the mirror cam to start rendering on the mirror texture. scene.setupFrame(mirrorCam); scene.context.setRenderToTexture(mirror.texture, true); scene.context.clear(0, 0, 0, 0); // get the pixel color height. var color = bmp.getPixel(oceanGridSize / 2, oceanGridSize / 2) & 0xff; // ! .0 marks it as double. otherwise ship will digitally step on water var height = color / 255.0 * 20 + 1; // draw objects into the mirror texture. ship0.y = -height; ship0.draw(); ship0.y = height; ship1.z = st.ElapsedMilliseconds * 0.001 - 100; ship1.y = -height; ship1.draw(); ship1.y = height; // get back to the main render. scene.context.setRenderToBackBuffer(); scene.setupFrame(scene.camera); } ).ToFunction() ); // http://www.flare3d.com/support/index.php?topic=1101.0 this.addChild(new net.hires.debug.Stats()); }