add moveCameraToAsset
This commit is contained in:
@@ -139,7 +139,10 @@ class _ExampleWidgetState extends State<ExampleWidget> {
|
|||||||
}, 'transform to unit cube'),
|
}, 'transform to unit cube'),
|
||||||
_item(() async {
|
_item(() async {
|
||||||
_filamentController.setPosition(_cube!, 1.0, 1.0, -1.0);
|
_filamentController.setPosition(_cube!, 1.0, 1.0, -1.0);
|
||||||
}, 'set position to 1, 1, -1'),
|
}, 'set cube position to 1, 1, -1'),
|
||||||
|
_item(() async {
|
||||||
|
_filamentController.setPosition(_cube!, 1.0, 1.0, -1.0);
|
||||||
|
}, 'move camera to cube position'),
|
||||||
_item(() async {
|
_item(() async {
|
||||||
var frameData = Float32List.fromList(
|
var frameData = Float32List.fromList(
|
||||||
List<double>.generate(120, (i) => i / 120).expand((x) {
|
List<double>.generate(120, (i) => i / 120).expand((x) {
|
||||||
@@ -244,6 +247,10 @@ class _ExampleWidgetState extends State<ExampleWidget> {
|
|||||||
_filamentController.setToneMapping(ToneMapper.LINEAR);
|
_filamentController.setToneMapping(ToneMapper.LINEAR);
|
||||||
}, "Set tone mapping to linear"));
|
}, "Set tone mapping to linear"));
|
||||||
|
|
||||||
|
children.add(_item(() {
|
||||||
|
_filamentController.moveCameraToAsset(_cube!);
|
||||||
|
}, "Move camera to asset"));
|
||||||
|
|
||||||
return Stack(children: [
|
return Stack(children: [
|
||||||
Positioned.fill(
|
Positioned.fill(
|
||||||
bottom: 100,
|
bottom: 100,
|
||||||
|
|||||||
@@ -81,6 +81,8 @@ namespace polyvox {
|
|||||||
void setBackgroundImage(const char* resourcePath, bool fillHeight);
|
void setBackgroundImage(const char* resourcePath, bool fillHeight);
|
||||||
void clearBackgroundImage();
|
void clearBackgroundImage();
|
||||||
void setBackgroundImagePosition(float x, float y, bool clamp);
|
void setBackgroundImagePosition(float x, float y, bool clamp);
|
||||||
|
void moveCameraToAsset(EntityId entityId);
|
||||||
|
|
||||||
void setCameraExposure(float aperture, float shutterSpeed, float sensitivity);
|
void setCameraExposure(float aperture, float shutterSpeed, float sensitivity);
|
||||||
void setCameraPosition(float x, float y, float z);
|
void setCameraPosition(float x, float y, float z);
|
||||||
void setCameraRotation(float rads, float x, float y, float z);
|
void setCameraRotation(float rads, float x, float y, float z);
|
||||||
|
|||||||
@@ -89,6 +89,7 @@ void transform_to_unit_cube(void* assetManager, EntityId asset);
|
|||||||
void set_position(void* assetManager, EntityId asset, float x, float y, float z);
|
void set_position(void* assetManager, EntityId asset, float x, float y, float z);
|
||||||
void set_rotation(void* assetManager, EntityId asset, float rads, float x, float y, float z);
|
void set_rotation(void* assetManager, EntityId asset, float rads, float x, float y, float z);
|
||||||
void set_scale(void* assetManager, EntityId asset, float scale);
|
void set_scale(void* assetManager, EntityId asset, float scale);
|
||||||
|
void move_camera_to_asset(const void* const viewer, EntityId asset);
|
||||||
void set_camera_exposure(const void* const viewer, float aperture, float shutterSpeed, float sensitivity);
|
void set_camera_exposure(const void* const viewer, float aperture, float shutterSpeed, float sensitivity);
|
||||||
void set_camera_position(const void* const viewer, float x, float y, float z);
|
void set_camera_position(const void* const viewer, float x, float y, float z);
|
||||||
void set_camera_rotation(const void* const viewer, float rads, float x, float y, float z);
|
void set_camera_rotation(const void* const viewer, float rads, float x, float y, float z);
|
||||||
|
|||||||
@@ -21,7 +21,6 @@
|
|||||||
#include "Log.hpp"
|
#include "Log.hpp"
|
||||||
#include "AssetManager.hpp"
|
#include "AssetManager.hpp"
|
||||||
|
|
||||||
#include "material/StandardMaterialProvider.hpp"
|
|
||||||
#include "material/UnlitMaterialProvider.hpp"
|
#include "material/UnlitMaterialProvider.hpp"
|
||||||
#include "material/FileMaterialProvider.hpp"
|
#include "material/FileMaterialProvider.hpp"
|
||||||
#include "gltfio/materials/uberarchive.h"
|
#include "gltfio/materials/uberarchive.h"
|
||||||
|
|||||||
@@ -113,7 +113,7 @@ FilamentViewer::FilamentViewer(const void* context, const ResourceLoaderWrapper*
|
|||||||
#if TARGET_OS_IPHONE
|
#if TARGET_OS_IPHONE
|
||||||
_engine = Engine::create(Engine::Backend::METAL);
|
_engine = Engine::create(Engine::Backend::METAL);
|
||||||
#else
|
#else
|
||||||
_engine = Engine::create(Engine::Backend::OPENGL, nullptr, (void*)context, nullptr);
|
_engine = Engine::create(Engine::Backend::OPENGL); //L, nullptr, (void*)context, nullptr);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
_renderer = _engine->createRenderer();
|
_renderer = _engine->createRenderer();
|
||||||
@@ -870,9 +870,23 @@ void FilamentViewer::setCameraPosition(float x, float y, float z) {
|
|||||||
cam.setModelMatrix(_cameraPosition * _cameraRotation);
|
cam.setModelMatrix(_cameraPosition * _cameraRotation);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FilamentViewer::moveCameraToAsset(EntityId entityId) {
|
||||||
|
|
||||||
|
auto asset = _assetManager->getAssetByEntityId(entityId);
|
||||||
|
if(!asset) {
|
||||||
|
Log("Failed to find asset attached to specified entity id.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const filament::Aabb bb = asset->mAsset->getBoundingBox();
|
||||||
|
Camera& cam =_view->getCamera();
|
||||||
|
_cameraPosition = math::mat4f::translation(bb.getCorners());
|
||||||
|
_cameraRotation = math::mat4f();
|
||||||
|
cam.setModelMatrix(_cameraPosition * _cameraRotation);
|
||||||
|
}
|
||||||
|
|
||||||
void FilamentViewer::setCameraRotation(float rads, float x, float y, float z) {
|
void FilamentViewer::setCameraRotation(float rads, float x, float y, float z) {
|
||||||
Camera& cam =_view->getCamera();
|
Camera& cam =_view->getCamera();
|
||||||
|
|
||||||
_cameraRotation = math::mat4f::rotation(rads, math::float3(x,y,z));
|
_cameraRotation = math::mat4f::rotation(rads, math::float3(x,y,z));
|
||||||
cam.setModelMatrix(_cameraPosition * _cameraRotation);
|
cam.setModelMatrix(_cameraPosition * _cameraRotation);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -97,6 +97,10 @@ extern "C" {
|
|||||||
return ((FilamentViewer*)viewer)->setCamera(asset, nodeName);
|
return ((FilamentViewer*)viewer)->setCamera(asset, nodeName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FLUTTER_PLUGIN_EXPORT void move_camera_to_asset(const void* const viewer, EntityId asset) {
|
||||||
|
((FilamentViewer*)viewer)->moveCameraToAsset(asset, asset);
|
||||||
|
}
|
||||||
|
|
||||||
FLUTTER_PLUGIN_EXPORT void set_camera_focus_distance(const void* const viewer, float distance) {
|
FLUTTER_PLUGIN_EXPORT void set_camera_focus_distance(const void* const viewer, float distance) {
|
||||||
((FilamentViewer*)viewer)->setCameraFocusDistance(distance);
|
((FilamentViewer*)viewer)->setCameraFocusDistance(distance);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import 'dart:ui' as ui;
|
|||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
import 'package:polyvox_filament/animations/bone_animation_data.dart';
|
import 'package:polyvox_filament/animations/bone_animation_data.dart';
|
||||||
import 'package:polyvox_filament/animations/morph_animation_data.dart';
|
import 'package:polyvox_filament/animations/morph_animation_data.dart';
|
||||||
|
import 'package:polyvox_filament/generated_bindings_web.dart';
|
||||||
|
|
||||||
typedef AssetManager = int;
|
typedef AssetManager = int;
|
||||||
typedef FilamentEntity = int;
|
typedef FilamentEntity = int;
|
||||||
@@ -519,6 +520,13 @@ class FilamentController {
|
|||||||
await _channel.invokeMethod("setCameraPosition", [x, y, z]);
|
await _channel.invokeMethod("setCameraPosition", [x, y, z]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future moveCameraToAsset(FilamentEntity asset) async {
|
||||||
|
if (_viewer == null || _resizing) {
|
||||||
|
throw Exception("No viewer available, ignoring");
|
||||||
|
}
|
||||||
|
await _channel.invokeMethod("moveCameraToAsset", asset);
|
||||||
|
}
|
||||||
|
|
||||||
Future setCameraExposure(
|
Future setCameraExposure(
|
||||||
double aperture, double shutterSpeed, double sensitivity) async {
|
double aperture, double shutterSpeed, double sensitivity) async {
|
||||||
if (_viewer == null || _resizing) {
|
if (_viewer == null || _resizing) {
|
||||||
|
|||||||
@@ -104,8 +104,11 @@ class _FilamentGestureDetectorState extends State<FilamentGestureDetector> {
|
|||||||
? null
|
? null
|
||||||
: (d) async {
|
: (d) async {
|
||||||
if (d.buttons == kTertiaryButton || _rotating) {
|
if (d.buttons == kTertiaryButton || _rotating) {
|
||||||
widget.controller
|
print("Starting at ${d.position}");
|
||||||
.rotateStart(d.localPosition.dx, d.localPosition.dy);
|
widget.controller.rotateStart(
|
||||||
|
d.position.dx * 2.0,
|
||||||
|
d.position.dy *
|
||||||
|
2.0); // multiply by 2.0 to account for pixel density, TODO don't hardcode
|
||||||
} else {
|
} else {
|
||||||
widget.controller
|
widget.controller
|
||||||
.panStart(d.localPosition.dx, d.localPosition.dy);
|
.panStart(d.localPosition.dx, d.localPosition.dy);
|
||||||
@@ -115,8 +118,9 @@ class _FilamentGestureDetectorState extends State<FilamentGestureDetector> {
|
|||||||
? null
|
? null
|
||||||
: (PointerMoveEvent d) async {
|
: (PointerMoveEvent d) async {
|
||||||
if (d.buttons == kTertiaryButton || _rotating) {
|
if (d.buttons == kTertiaryButton || _rotating) {
|
||||||
|
print("Updating at ${d.position}");
|
||||||
widget.controller
|
widget.controller
|
||||||
.rotateUpdate(d.localPosition.dx, d.localPosition.dy);
|
.rotateUpdate(d.position.dx * 2.0, d.position.dy * 2.0);
|
||||||
} else {
|
} else {
|
||||||
widget.controller
|
widget.controller
|
||||||
.panUpdate(d.localPosition.dx, d.localPosition.dy);
|
.panUpdate(d.localPosition.dx, d.localPosition.dy);
|
||||||
|
|||||||
@@ -143,7 +143,6 @@ class _FilamentWidgetState extends State<FilamentWidget> {
|
|||||||
if (_textureId == null) {
|
if (_textureId == null) {
|
||||||
return Container(color: Colors.transparent);
|
return Container(color: Colors.transparent);
|
||||||
}
|
}
|
||||||
|
|
||||||
var texture = Texture(
|
var texture = Texture(
|
||||||
key: ObjectKey("texture_$_textureId"),
|
key: ObjectKey("texture_$_textureId"),
|
||||||
textureId: _textureId!,
|
textureId: _textureId!,
|
||||||
|
|||||||
@@ -35,6 +35,8 @@ public class SwiftPolyvoxFilamentPlugin: NSObject, FlutterPlugin, FlutterTexture
|
|||||||
|
|
||||||
var path:String? = nil
|
var path:String? = nil
|
||||||
|
|
||||||
|
print("Received request to load \(uriString)")
|
||||||
|
|
||||||
if(uriString.hasPrefix("file://")) {
|
if(uriString.hasPrefix("file://")) {
|
||||||
path = String(uriString.dropFirst(7))
|
path = String(uriString.dropFirst(7))
|
||||||
} else {
|
} else {
|
||||||
@@ -47,12 +49,13 @@ public class SwiftPolyvoxFilamentPlugin: NSObject, FlutterPlugin, FlutterTexture
|
|||||||
|
|
||||||
if(path != nil) {
|
if(path != nil) {
|
||||||
do {
|
do {
|
||||||
print("Attempting to load file at path \(path!)")
|
print("Loading file at path \(path!)")
|
||||||
let data = try Data(contentsOf: URL(fileURLWithPath:path!))
|
let data = try Data(contentsOf: URL(fileURLWithPath:path!))
|
||||||
let nsData = data as NSData
|
let nsData = data as NSData
|
||||||
let resId = UInt32(instance.resources.count)
|
let resId = UInt32(instance.resources.count)
|
||||||
instance.resources[resId] = nsData
|
instance.resources[resId] = nsData
|
||||||
let length = nsData.length
|
let length = nsData.length
|
||||||
|
print("Got file of length \(length)")
|
||||||
return ResourceBuffer(data:nsData.bytes, size:UInt32(nsData.count), id:UInt32(resId))
|
return ResourceBuffer(data:nsData.bytes, size:UInt32(nsData.count), id:UInt32(resId))
|
||||||
} catch {
|
} catch {
|
||||||
print("ERROR LOADING RESOURCE")
|
print("ERROR LOADING RESOURCE")
|
||||||
@@ -613,7 +616,9 @@ public class SwiftPolyvoxFilamentPlugin: NSObject, FlutterPlugin, FlutterTexture
|
|||||||
}
|
}
|
||||||
let success = set_camera(viewer, asset, nodeName)
|
let success = set_camera(viewer, asset, nodeName)
|
||||||
result(success)
|
result(success)
|
||||||
|
case "moveCameraToAsset":
|
||||||
|
move_camera_to_asset(viewer, call.arguments as! EntityId)
|
||||||
|
result(true)
|
||||||
case "setCameraPosition":
|
case "setCameraPosition":
|
||||||
let args = call.arguments as! [Any]
|
let args = call.arguments as! [Any]
|
||||||
set_camera_position(viewer, Float(args[0] as! Double), Float(args[1] as! Double), Float(args[2] as! Double))
|
set_camera_position(viewer, Float(args[0] as! Double), Float(args[1] as! Double), Float(args[2] as! Double))
|
||||||
|
|||||||
@@ -81,6 +81,7 @@ namespace polyvox {
|
|||||||
void setBackgroundImage(const char* resourcePath);
|
void setBackgroundImage(const char* resourcePath);
|
||||||
void clearBackgroundImage();
|
void clearBackgroundImage();
|
||||||
void setBackgroundImagePosition(float x, float y, bool clamp);
|
void setBackgroundImagePosition(float x, float y, bool clamp);
|
||||||
|
void moveCameraToAsset(EntityId entityId);
|
||||||
void setCameraExposure(float aperture, float shutterSpeed, float sensitivity);
|
void setCameraExposure(float aperture, float shutterSpeed, float sensitivity);
|
||||||
void setCameraPosition(float x, float y, float z);
|
void setCameraPosition(float x, float y, float z);
|
||||||
void setCameraRotation(float rads, float x, float y, float z);
|
void setCameraRotation(float rads, float x, float y, float z);
|
||||||
|
|||||||
@@ -89,6 +89,7 @@ void transform_to_unit_cube(void* assetManager, EntityId asset);
|
|||||||
void set_position(void* assetManager, EntityId asset, float x, float y, float z);
|
void set_position(void* assetManager, EntityId asset, float x, float y, float z);
|
||||||
void set_rotation(void* assetManager, EntityId asset, float rads, float x, float y, float z);
|
void set_rotation(void* assetManager, EntityId asset, float rads, float x, float y, float z);
|
||||||
void set_scale(void* assetManager, EntityId asset, float scale);
|
void set_scale(void* assetManager, EntityId asset, float scale);
|
||||||
|
void move_camera_to_asset(const void* const viewer, EntityId asset);
|
||||||
void set_camera_exposure(const void* const viewer, float aperture, float shutterSpeed, float sensitivity);
|
void set_camera_exposure(const void* const viewer, float aperture, float shutterSpeed, float sensitivity);
|
||||||
void set_camera_position(const void* const viewer, float x, float y, float z);
|
void set_camera_position(const void* const viewer, float x, float y, float z);
|
||||||
void set_camera_rotation(const void* const viewer, float rads, float x, float y, float z);
|
void set_camera_rotation(const void* const viewer, float rads, float x, float y, float z);
|
||||||
|
|||||||
@@ -52,9 +52,13 @@ _scene(scene) {
|
|||||||
_gltfResourceLoader = new ResourceLoader({.engine = _engine,
|
_gltfResourceLoader = new ResourceLoader({.engine = _engine,
|
||||||
.normalizeSkinningWeights = true });
|
.normalizeSkinningWeights = true });
|
||||||
|
|
||||||
auto uberdata = resourceLoaderWrapper->load("packages/polyvox_filament/assets/materials.uberz");
|
// auto uberdata = resourceLoaderWrapper->load("packages/polyvox_filament/assets/materials.uberz");
|
||||||
|
// _ubershaderProvider = gltfio::createUbershaderProvider(
|
||||||
|
// _engine, uberdata.data, uberdata.size);
|
||||||
_ubershaderProvider = gltfio::createUbershaderProvider(
|
_ubershaderProvider = gltfio::createUbershaderProvider(
|
||||||
_engine, uberdata.data, uberdata.size);
|
_engine, UBERARCHIVE_DEFAULT_DATA, UBERARCHIVE_DEFAULT_SIZE);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// _ubershaderProvider = gltfio::createJitShaderProvider(_engine, true);
|
// _ubershaderProvider = gltfio::createJitShaderProvider(_engine, true);
|
||||||
// _ubershaderProvider = new StandardMaterialProvider(_engine);
|
// _ubershaderProvider = new StandardMaterialProvider(_engine);
|
||||||
@@ -74,7 +78,6 @@ _scene(scene) {
|
|||||||
AssetManager::~AssetManager() {
|
AssetManager::~AssetManager() {
|
||||||
_gltfResourceLoader->asyncCancelLoad();
|
_gltfResourceLoader->asyncCancelLoad();
|
||||||
_ubershaderProvider->destroyMaterials();
|
_ubershaderProvider->destroyMaterials();
|
||||||
//_unlitProvider->destroyMaterials();
|
|
||||||
destroyAll();
|
destroyAll();
|
||||||
AssetLoader::destroy(&_assetLoader);
|
AssetLoader::destroy(&_assetLoader);
|
||||||
|
|
||||||
|
|||||||
@@ -861,6 +861,20 @@ void FilamentViewer::updateViewportAndCameraProjection(
|
|||||||
contentScaleFactor);
|
contentScaleFactor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FilamentViewer::moveCameraToAsset(EntityId entityId) {
|
||||||
|
|
||||||
|
auto asset = _assetManager->getAssetByEntityId(entityId);
|
||||||
|
if(!asset) {
|
||||||
|
Log("Failed to find asset attached to specified entity id.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const filament::Aabb bb = asset->getBoundingBox();
|
||||||
|
auto corners = bb.getCorners();
|
||||||
|
Camera& cam =_view->getCamera();
|
||||||
|
cam.lookAt(corners.vertices[0], corners.vertices[7]);
|
||||||
|
}
|
||||||
|
|
||||||
void FilamentViewer::setCameraPosition(float x, float y, float z) {
|
void FilamentViewer::setCameraPosition(float x, float y, float z) {
|
||||||
Camera& cam =_view->getCamera();
|
Camera& cam =_view->getCamera();
|
||||||
|
|
||||||
|
|||||||
@@ -97,6 +97,10 @@ extern "C" {
|
|||||||
return ((FilamentViewer*)viewer)->setCamera(asset, nodeName);
|
return ((FilamentViewer*)viewer)->setCamera(asset, nodeName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FLUTTER_PLUGIN_EXPORT void move_camera_to_asset(const void* const viewer, EntityId asset) {
|
||||||
|
((FilamentViewer*)viewer)->moveCameraToAsset(asset);
|
||||||
|
}
|
||||||
|
|
||||||
FLUTTER_PLUGIN_EXPORT void set_camera_focus_distance(const void* const viewer, float distance) {
|
FLUTTER_PLUGIN_EXPORT void set_camera_focus_distance(const void* const viewer, float distance) {
|
||||||
((FilamentViewer*)viewer)->setCameraFocusDistance(distance);
|
((FilamentViewer*)viewer)->setCameraFocusDistance(distance);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user