A new Murl Engine Build 2023.2b is available for download.
Bug Fixes
All changes can also be found in the change log.
As always, if you encounter difficulties, find a bug or want to discuss development issues, head over to our Bug Tracker or send us an email.
]]>A new Murl Engine Build 2023.2a is available for download.
Bug Fixes
All changes can also be found in the change log.
As always, if you encounter difficulties, find a bug or want to discuss development issues, head over to our Bug Tracker or send us an email.
]]>A new Murl Engine Build 2023.2 is available for download.
Build Environment
Bug Fixes
General
Werkbank
All changes can also be found in the change log.
As always, if you encounter difficulties, find a bug or want to discuss development issues, head over to our Bug Tracker or send us an email.
]]>A new Murl Engine Build 2023.1 is available for download.
Build Environment
Improvements
IEnums::LANGUAGE_ARABIC
Bug Fixes
All changes can also be found in the change log.
As always, if you encounter difficulties, find a bug or want to discuss development issues, head over to our Bug Tracker or send us an email.
]]>A new Murl Engine Build 2022.1 is available for download.
Build Environment
Improvements
Murl::Array
and Murl::String
Bug Fixes
All changes can also be found in the change log.
As always, if you encounter difficulties, find a bug or want to discuss development issues, head over to our Bug Tracker or send us an email.
]]>A new Murl Engine Build 2022.1 is available for download.
Build Environment
General
New Features
Improvements
Bug Fixes
<= 0
ANR: IabHelper$a.onServiceConnected<>
Graph::Aligner
not visible under certain circumstances
MurlGLThread.RequestExitAndWait
All changes can also be found in the change log.
As always, if you encounter difficulties, find a bug or want to discuss development issues, head over to our Bug Tracker or send us an email.
]]>A new Murl Engine Build 2021.2 is available for download.
Update 2021-12-16: Fixes in Version 2021.2.8817
Build Environment
New Features
Graph::IAttachment
interface and Graph::Attachment
node class
API Changes
Improvements
IVideoSurface::ApplyMatteFringe()
algorithm
SetStaticInstanceCreationEnabled()
and SetStaticInstanceParentNodeId()
methods
Bug Fixes
scaleFactor
atrributes to BonePathConstraint nodes
at.spraylight.murl.googleplay.MurlInAppGooglePlayBillingV3.QuerySkuDetailsAsync
AppStoreControl
ReceiptData
and ReceiptSignature
Resource::VorbisAudioStream
java.lang.UnsupportedOperationException
when calling eglCreatePixmapSurface
Murl::String
: Memory leak when using Set()
methods on a non-empty string
All changes can also be found in the change log.
As always, if you encounter difficulties, find a bug or want to discuss development issues, head over to our Bug Tracker or send us an email.
]]>A new Murl Engine Build 2021.1 is available for download.
Update 2021-03-23: Fixes in Version 2021.1.8437
Build Environment
API Changes
System::File
Improvements
AppWillTerminate()
missing
IEngineConfiguration
: Add a configuration item to enable GPU buffer safety copies
SetAsyncLoadingEnabled
working on Android platform
SetSyncLoadingTimeout
method available at any time
Resource::Image
Bug Fixes
IabHelper.consume()
Video::IIndexBuffer
and Video::IVertexBuffer
setters
Resource::NativeMesh
Graph::IRoot
for methods InitGraph()
, DeInitGraph()
, InitNode()
and DeInitNode()
Graph::IRoot::DeInitGraph()
takes a long time to finish when called from logic OnDeInit()
Murl::Core::GraphRoot::FinishGraphOutput
in out client across all version.
Stretch
attribute in IK constraint
PrepareDecodingPngImage
Timeline::HasPassedTime()
doesn't works
StartEngine()
/StopEngine()
Murl::Input::TouchableHandler::ReportBegin()
Murl::Video::GlEs20::Indices::Create(Murl::Video::IRenderer*)
Murl::Video::GlEs20::IndexBuffer::Draw()
Murl::Video::Renderer::SetupView()
Murl::Video::Renderer::ProcessFrameBuffer()
Murl::Platform::Android::VideoInterface::ActivateBackBuffer()
Murl::Video::GlEs20::Renderer::ApplyTextures
Murl::IndexBase<...>::Find(Murl::Audio::IPlayable* const&, unsigned int) const
Suspend()
MurlGLThread.RequestExitAndWait
MurlGLThread.surfaceCreated
MurlGLThread.WaitForSurfaceDestroyed
at.spraylight.murl.MurlGLThread.CreateEglMainWindowSurface
at.spraylight.murl.MurlGLView.SetFocus
Util::GetRelativePath()
does not correctly return given absolute path when base path is empty
Graph::ComplexTransform
: Misspelled attribute inheritReflectiom
(should be inheritReflection
)
All changes can also be found in the change log.
As always, if you encounter difficulties, find a bug or want to discuss development issues, head over to the Forum.
]]>A new Murl Engine Build 2020.2 is available for download.
Build Environment:
New Features:
API Changes:
Murl::IUrlRequest
Improvements:
std::make_shared
analog for Murl::SharedPointer
.
Bug Fixes:
All changes can also be found in the change log.
As always, if you encounter difficulties, find a bug or want to discuss development issues, head over to the Forum.
]]>A new Murl Engine Build 2020.1 is available for download.
Build Environment:
API Changes:
Map
Graph::IFactory
SuspendApp()
ValueType
definition
Improvements:
StdHash
for enum class
Murl::Array
and other containers are missing Front()
and Back()
methods.
Bug Fixes:
IEnums::PIXEL_FORMAT_SR8
Native::ResourceImage
has corrupted pixels when storing a 16bit PNG surface
Murl::String
trims zero characters at the end even when I specify string's length explicitly;
Graph::SubState
ignores setting of includePreservedStates
Graph::SubState
does not change affected state when nodes are added or removed
replications
property not defined when creating static instances from package.xml
Graph::CloneTransform
does not do relative transformations
Graph::Variable
fails to reinit when previously a constant input is set and replaced with a variable input at the same index
Video::IVertexBuffer
RemoveAllAttributes()
does not work.
Graph::WaveUniformTimeController
crashes in PostInit()
when owner does not implement target interface
All changes can also be found in the change log.
As always, if you encounter difficulties, find a bug or want to discuss development issues, head over to the Forum.
]]>A new Murl Engine Build 2019.2 is available for download.
Build Environment:
Bug Fixes:
IAppStoreProduct::GetStatus
is STATUS_NOT_PURCHASED
after lock iphone during purchase
IAppStoreProduct::GetStatus
retrieves ERROR
instead of CANCELLED
in case cancelling of purchase by home button
Graph::Instance
does not destroy containers upon DeInit()
Video::Renderer::ReleaseSignature()
with ID 0
Resource::HdrImage
and Resource::PfmImage
don't allow scaled surface creation
IAppStoreProduct::GetStatus
retrieves STORE_PURCHASE_WAS_CANCELLED
after purchasing item on Android.
java.lang.NullPointerException
at MurlInAppV3PurchaseControllerAndroidMarket
java.lang.NullPointerException
at at.spraylight.murl.googleplay.util.IabHelper$1.onServiceConnected(IabHelper.java:265)
java.lang.IllegalStateException
IAB helper is not set up. Can't perform operation: queryInventory
java.lang.NullPointerException
at at.spraylight.murl.googleplay.MurlInAppV3PurchaseControllerAndroidMarket$3.onConsumeFinished
All changes can also be found in the change log.
As always, if you encounter difficulties, find a bug or want to discuss development issues, head over to the Forum.
]]>A new Murl Engine Build 2019.1.7666 is available for download.
Build Environment:
API Changes:
New Features:
Improvements:
Murl::Util::PrintToString
format argument
Graph::TextGeometry
Bug Fixes:
DestroyUrlRequest
on request that is not finished crashes the app.
outputTextureId
of Graph::TextGeometry
and Graph::FlatTextTexture
All changes can also be found in the change log.
As always, if you encounter difficulties, find a bug or want to discuss development issues, head over to the Forum.
]]>A new Murl Engine Build 2018.3.7623 is available for download.
Build Environment:
API Changes:
--input_xml
option.
Bug Fixes:
StringToSInt32
parse for empty string.
Graph::NinePatchPlaneSequenceGeometry
not respecting texture size stored in atlas
Graph::PlaneSequenceGeometry: SetRectangleName()
not accepted if node is not yet initialized
Graph::TextGeometry
does not accept a font resource directly set via code
Graph::Button
) during Logic::OnProcessTick()
Logic::Processor::RemoveDeInitChild()
returns incorrect bool value from DeInit()
call
Graph::Button
initialization fails if button is not yet attached to a parent
appConfig->SetIosPreferredScreenEdgesDeferringSystemGestures
funktioniert nicht
Improvements:
IUrlRequest
: add possibility to get HTTP headers from response
MURL_FACTORY_OBJECT_PROPERTIES
macro and others
Graph::Button
/ Graph::FrameBuffer
: Allow dynamic setting of input in/out coordinates
IUrlRequest
: Add possibility to specify HTTP headers
--none_power_of_two_height
to allow vertical cropping of the font output image.
IEnums::GPU_APPLE_3_CORE
, Enums::GPU_APPLE_4_CORE
iPad devices: IPAD_6
, IPAD_PRO_11IN0_1
, IPAD_PRO_12IN9_3
All changes can also be found in the change log.
As always, if you encounter difficulties, find a bug or want to discuss development issues, head over to the Forum.
]]>A new Murl Engine Build 2018.2.7478 is available for download.
Build Environment:
New Features:
Bug Fixes:
MurlGLView.onApplyWindowInsets()
GetKeys()
behavior in IKeyboardDevice on Android
Platform::Android::KeyboardControl::SetText()
method
All changes can also be found in the change log.
As always, if you encounter difficulties, find a bug or want to discuss development issues, head over to the Forum.
]]>A new Murl Engine Build 2018.1.7420 is available for download.
Build Environment:
New Features:
asm.js
and WASM
output running
in web browsers
IEnums::TargetHost
enumeration, to distinguish if code runs
natively in an app, or within a web browser
Changes:
*.jet
to *.murlpkg
to
be consistent on all platforms. For existing projects, please add a
noCompress
option to your build.gradle
file in the Android section:
aaptOptions { noCompress 'murl', 'murlpkg', 'lua' }
<Graph::BoxCuller>
Replace with <Graph::VolumeCuller>
<Graph::FrustumCuller>
Replace with <Graph::VolumeCuller>
<Graph::OrthographicCamera>
Replace with <Graph::Camera projectionType="ORTHOGRAPHIC">
<Graph::PerspectiveCamera>
Replace with <Graph::Camera projectionType="PERSPECTIVE">
<Graph::Sound>
Replace with <Graph::AudioSource>
Graph::Node
swappable="<Bool>"
Replace with enableAutomaticSwapping="<Bool>"
Graph::AudioSource
soundResourceId="<Resource ID>"
Replace with audioResourceId="<Resource ID>"
Graph::AudioSequence
soundIds="[<Node IDs>]"
Replace with audioSourceIds="[<Node IDs>]"
soundId="<Node ID>"
Replace with audioSourceId="<Node ID>"
soundId.N="<Node ID>"
Replace with audioSourceId.N="<Node ID>"
New Interfaces:
Util::IFactory
Util::IFactoryRegistry
Util::IImageDecompressor
Util::IVideoSurfaceDecoder
Util::IVideoSurfaceEncoder
New Classes:
Math::Ray
Util::VideoSurfaceDecoder
and VideoSurfaceEncoder
classes, for
decoding/encoding various image formats
New Resource Objects:
Resource::HdrImage
Resource::PfmImage
New Graph Node Interfaces:
Graph::IAnchorState
New Graph Node Classes:
Graph::IAnchorState
Graph::IAnchorStateCopy
New Graph Controller Classes:
Graph::CameraNodeLinkController
Graph::ScalableNodeLinkController
Graph::SubjectNodeLinkController
Improvements:
IAppConfiguration
GetDisplaySurfaceSafeMarginXX()
.murlpkg
files, to prevent duplicate
resources from being included more than once
GetLoadMode()
and GetFileCategory()
methods to IPackage
interface
Graph::TextGeometry
Util::Rng
and derived classes from "private"
to "protected", to facilitate state de-/serialization
Fixes:
Util::VideoSurface
clamping color values on reading/writing
individual pixels
System::CLib
file/folder functions on Android
Util::Base64Decoder::DecodeValue()
Logic::Animation::Reset()
Graph::GenericGeometry
sometimes not reacting on calls to
SetNumberOfIndices()
/SetNumberOfVertices()
GetProductName()
and GetVersionName()
in IEngineConfiguration
incorrectly appending a null character on Windows
SHFileOperationW()
on Windows, preventing
folders from correctly being created or deleted
Util::FileInterface::GetAbsoluteName()
on Windows
Graph::IShadowCamera
Util::ShaderBuilder
falsely complaining about not writing to
shader output
All changes can also be found in the change log.
As always, if you encounter difficulties, find a bug or want to discuss development issues, head over to the Forum.
]]>A new Murl Engine Build 1.00.6944Beta is available for download.
Changes:
Graph::VolumeCuller
to replace deprecated Graph::BoxCuller
and Graph::FrustumCuller
Graph::PerspectiveCamera
and Graph::OrthographicCamera
(now
deprecated) into Graph::Camera
New Features:
IEnums::CONSTANT_BUFFER_ITEM_SHADOW_n
and individual uniforms
IEnums::UNIFORM_ITEM_SHADOW_VIEW_PROJECTION_MATRIX_n_m
and
IEnums::UNIFORM_ITEM_SHADOW_SPLIT_DISTANCE_n
Graph::ShadowCamera
Improvements:
Resource::PvrImage
to support all the different PVR file
format variants
Resource::Image
for base & mip scaling
Fixes:
Graph::Light
Resource::NativeImage
video streams
Resource::NativeImage
not respecting resource parameters
Math::Cone
setter from an off-center Math::Frustum
Android::FileInterface
Resource::XmlImage
when using invalid parameters
Resource::XmlImage
returning wrong video stream format
Graph::TextGeometry
ignoring objectBoundingModeX="CONTENTS"
for bitmap fonts
Video::Camera
in certain situations
*) Android Changes:
You need to adapt your java and aidl source sets and your amazon lib dependency in your build.gradle file:
from:
sourceSets { main { java { srcDirs += project.ext.MURL_ENGINE_ROOT+'/tests/source/'+project.ext.MURL_MODULE_BIN_FILE+'/java' srcDirs += project.ext.MURL_ENGINE_ROOT+'/base/source/platform/android/java' if (project.ext.MURL_ANDROID_IAB_STORE != "samsung") { exclude 'at/spraylight/murl/samsung/*' } if (project.ext.MURL_ANDROID_IAB_STORE != "google") { exclude 'at/spraylight/murl/googleplay/**' } if (project.ext.MURL_ANDROID_IAB_STORE != "amazon") { exclude 'at/spraylight/murl/amazon/*' } } aidl { srcDirs += project.ext.MURL_ENGINE_ROOT+'/base/source/platform/android/java' if (project.ext.MURL_ANDROID_IAB_STORE != "google") { exclude 'com/android/vending/billing/IInAppBillingService.aidl' } if (project.ext.MURL_ANDROID_IAB_STORE != "samsung") { exclude 'com/sec/android/iap/*' } }
to:
sourceSets { main { java { srcDirs += project.ext.MURL_ENGINE_ROOT+'/tests/source/'+project.ext.MURL_MODULE_BIN_FILE+'/java' srcDirs += project.ext.MURL_ENGINE_ROOT+'/base/source/platform/android/java' if (project.ext.MURL_ANDROID_IAB_STORE == "google") { srcDirs += project.ext.MURL_ENGINE_ROOT+'/base/source/platform/android/iab/google/java' } if (project.ext.MURL_ANDROID_IAB_STORE == "amazon") { srcDirs += project.ext.MURL_ENGINE_ROOT+'/base/source/platform/android/iab/amazon/java' } if (project.ext.MURL_ANDROID_IAB_STORE == "samsung") { srcDirs += project.ext.MURL_ENGINE_ROOT+'/base/source/platform/android/iab/samsung/java' } } aidl { if (project.ext.MURL_ANDROID_IAB_STORE == "google") { srcDirs += project.ext.MURL_ENGINE_ROOT+'/base/source/platform/android/iab/google/aidl' } if (project.ext.MURL_ANDROID_IAB_STORE == "samsung") { srcDirs += project.ext.MURL_ENGINE_ROOT+'/base/source/platform/android/iab/samsung/aidl' } }
and from:
dependencies { if (project.ext.MURL_ANDROID_IAB_STORE == "amazon") { compile files(project.ext.MURL_ENGINE_ROOT+'/base/source/platform/android/libs/in-app-purchasing-1.0.3.jar') } }
to:
dependencies { if (project.ext.MURL_ANDROID_IAB_STORE == "amazon") { compile files(project.ext.MURL_ENGINE_ROOT+'/base/source/platform/android/iab/amazon/libs/in-app-purchasing-1.0.3.jar') } }
All changes can also be found in the change log.
As always, if you encounter difficulties, find a bug or want to discuss development issues, head over to the Forum.
]]>A new Murl Engine Build 1.00.6747Beta is available for download.
Changes:
--prescale_divisor
" command line parameter to the
resource_packer
tool, which is supposed to replace the existing
(now deprecated) "--prescale_factor
" parameter. When specifying
"--prescale_factor 1
" together with "--check_config
", the
resource_packer
tool falsely includes all resources tagged with
a prescale factor, instead only those for factor 1.
For compatibility reasons, "--prescale_factor
" still exists and
behaves as before, but should be replaced with "--prescale_divisor
"
whenever possible.
armeabi
" target on Android
Improvements:
GetChildIndex()
, GetParentIndex()
and GetControllerIndex()
methods to Graph::INode
interface, to query the actual index of a
given child/parent node or controller
Graph::Controller
classes
Fixes:
Android::FileInterface
which caused failures when
repeatedly mapping/unmapping files
All changes can also be found in the change log.
As always, if you encounter difficulties, find a bug or want to discuss development issues, head over to the Forum.
]]>A new Murl Engine Build 1.00.6708Beta is available for download.
Changes:
Improvements:
Util::VideoSurfaceTools
New Features:
Graph::IndexedNodeLinkController
to link the index property
of e.g. a Graph::Switch
to a different one
Util::PixelDecompressor
)
Resource::KtxImage
)
cbTime
" shader constant buffer, with float uniforms
"uTimeSeconds
" and "uTimeFraction
"
Fixes:
All changes can also be found in the change log.
As always, if you encounter difficulties, find a bug or want to discuss development issues, head over to the Forum.
]]>A new Murl Engine Build 1.00.6624Beta is available for download. Added iOS build for base SDK 8.4 and deployment target 5.0 (Xcode 6.4, C99 / C++98) for backward compatibility. Android NDK has been updated to r14.
Changes:
Improvements:
Graph::ShaderParameters
and related nodes now also accept a Graph::IProgram
or Graph::IMaterial
as parameter source
Util::PixelConverter
LF32
-> L8
LF32
-> RGBA32
LF32
-> RGBF96
LF32
-> RGBAF128
Resource::XmlImage
input restrictions: Allow (but warn) about surfaces not having the same dimension as the first one; rescale them instead of generating an error
Graph::Light
(+ interface methods), usable via uLightSpotN.z uniform in shaders
Graph::ISubject
interface
Video::IRenderer
, Video::IView
and Video::IFrameBuffer
Audio::IRenderer
, Audio::IView
Video::Renderer
Graph::MultiCamera
and Graph::MultiCuller
Graph::IRoot
Color::ToUInt32Clamped()
Fixes:
Graph::Texture
Graph::View
Graph::FrameBuffer
Graph::ConstantBufferParameterGroup
Video::GlEs20::Texture
Empty()
methods in murl_index_base.h
and murl_map_base.h
Platform::Win32::FileInterface::CreateFolder()
All changes can also be found in the change log.
As always, if you encounter difficulties, find a bug or want to discuss development issues, head over to the Forum.
]]>A new Murl Engine Build 1.00.6529Beta is available for download. C++11 is enabled by default now. Android NDK has been updated to r13.
Changes:
Improvements:
Graph::FlatTextTexture
and Graph::TextGeometry
, and relaxed error
checking
Murl::Enum
getters by default
Graph::Aligner
: Treat multiple replications of an Instance child
as if they were direct children, to allow for easier alignment.
Set the "processInstances" attribute to false to revert to original
behavior.
New Features:
Resource::CsvDictionary
resources to import dictionary resources
from a given CSV file
Graph::ShaderParameters
, ShaderParameterGroup
and ShaderParameter
,
to allow for sourcing actual default uniform values directly from a given
shader node or resource
UInt
/SInt
vertex buffer attribute types
Fixes:
Graph::ResourceMeshGeometry
Graph::TextGeometry
Graph::TextGeometry::IsCharacterPrintable()
always returning false
when using system fonts
Graph::Aligner
not updating the layout when removing children
Graph::Matrix::Translate()
method
Graph::Vector
multiplication operator to act component-wise.
All changes can also be found in the change log.
As always, if you encounter difficulties, find a bug or want to discuss development issues, head over to the Forum.
]]>A new Murl Engine Build 1.00.6405Beta is available for download. This is a major update release with support for Android Studio and several improvements and fixes.
Android:
We added support for Android Studio with its Gradle build system, updated the Android NDK to version r11c and switched from GCC to the Clang build toolchain. GCC is deprecated since version 11 of the NDK in favor of Clang and so we also switched the Murl build scripts effectively with this release. If you experience problems with Clang, you can file bugs in the official NDK bug database. Android Studio support will be discussed in more detail in a separate blog post.
Improvements:
Graph::NinePatchPlaneGeometry
/NinePatchPlaneSequenceGeometry
:
enableCenterPatch
" attribute and interface methods to enable
or disable rendering of the center element (useful for transparent
frames)
Graph::TextGeometry
:
objectBoundingMode
" attribute(s) and interface methods for better control of alignment in a Graph::Aligner
node
Graph::ResourceMeshGeometry
:
Graph::TimeController
:
Graph::MultiTimeline
IAppConfiguration
:
SetTrackerTraceLevel()
method for better control over scene node warnings on init
SetMouseCoordinateClampingDisabled()
method to allow for reporting mouse coordinates outside of the render window
sourceStartTime
", "sourceStopTime
" and "destinationStartTime
"
attributes for explicit clip creation from an imported skeleton
ignore
" attribute for clips
defaultBlendWeights
" attribute for mesh elements
Resource::IObject
/IPackage
:
Resource::ICollection
/IPackage
:
basePath
" to "fileName
" in creation interfaces
Graph::ITracker
:
SetChildrenProcessingEnabled()
method
Resource::XmlDictionary
:
registerGlobally
" attribute to allow for scoping text resources either at package level (true
, default) or within the dictionary's namespace (false
)
Fixes:
Graph::PlaneSequenceGeometry
:
Graph::TextGeometry
:
Util::ExpressionEvaluator
:
Graph::FixedProgram
with both vertex
coloring and material coloring enabled
All changes can also be found in change log.
As always, if you encounter difficulties, find a bug or want to discuss development issues, head over to the Forum.
]]>The new Murl Engine Build 1.00.6320Beta is available for download. This is a major update release with support for Visual Studio 2015 and several improvements and fixes. Please note the Visual Studio deployment change.
Visual Studio 2015
Support for Visual Studio 2015 has been added. To keep the download package at a reasonable size we will, beginning with this release, only include the latest supported Visual Studio version in the archive. Therefore the download package will contain the Visual Studio libraries for Visual Studio 2015 only. We still support Visual Studio 2008, 2010 and 2013 but don't deliver libs for these versions per default. So if you need to work with an older Visual Studio version, please contact us via the forums or write us an email and we will provide you a separate download link.
Atlas Generator
graph_textures.xml
containing texture setup
package.xml
containing generated resources
Scene Converter
allowDynamicBatching
" attribute to
elements in config files
forceConstantKeys
" attribute to
elements in config files
depthOrder
" attribute to
elements in config files
element in config files for
better control of generated textures (matching the attributes in scene
graph):
useAlpha
useMipMaps
usePrescale
mipMapGenerationMode
pixelFormat
wrapModeX
wrapModeY
wrapModeZ
magFilter
minFilter
mipFilter
maxAnisotropy
sourceClipId
", "sourceStartTime
", "sourceStopTime
" and
"destinationStartTime
" attributes to
element in config files for
cloning animation clips
replaceWithMaterialSlot
" and "replaceWithParametersSlot
"
attributes to
elements for specifying separate slots for
material and parameters used
Improvements
flipX
" and "flipY
" attributes to Resource::Image
and derived
classes
Graph::IClipSequencer::Reset()
interface method
Graph::IClipSequencer::GetCurrentClip()
interface method
Graph::ITimeline::SetTimeShift() and SetTimeOffset()
methods
Graph::IAnimationTimeController::SetRotationBlendReference()
and
SetRotationBlendDirection()
methods
Resource::IAtlas
Graph::INinePatch
common property interface for
Graph:INinePatchPlaneGeometry
and (newly added)
Graph:INinePatchPlaneSequenceGeometry
Resource::IAtlas: Allow
different texture slot & reference size
per rectangle
Fixes
Graph::TextGeometry
outline font update bug when container
fitting & word wrapping are both enabled
Util::Timeline
: fixed NaN
for clips with zero duration
Graph::Timeline
to allow clipIndex
to be set without animation
resource (regression)
IEnums::Interpolation
enum missing deprecated hermite name strings
Graph::Timeline
Graph::Clip
when no blendable is specified
Resource::IAnimation
Graph::TextGeometry
not updating text from resource
scene graph node values
Graph::PlaneSequenceGeometry
(recentIndex)
Graph::GenericParameterGroup
and Graph::GenericParameters
init
with empty target
Graph::Light
bounding volume recalculation
All changes can also be found in change log.
As always, if you encounter difficulties, find a bug or want to discuss development issues, head over to the Forum.
]]>Two new Murl Engine tutorials are available. In the tutorials you will learn how to extend the feature set of the Murl Engine with your own custom control class. Both tutorials can be found in chapter four of the tutorials section.
If a required platform-dependent feature is not supported by the Murl Engine, a custom control can be used to add this feature. Tutorial #00: Custom Control shows with a fairly simple example, how you can implement your own custom controls. The second tutorial, Tutorial #01: Flurry Control, demonstrates how to integrate Flurry Analytics as custom control into your project.
]]>The new Murl Engine Build 1.00.6143Beta is available for download. This is an major update release with tvOS as new platform and several improvements and fixes.
The most important new features are:
New Platform Apple TV
MURL_TARGET_OS_TVOS
)
platformConfig->IsTargetClassMatching(IEnums::TARGET_CLASS_CONSOLE)
platformConfig->IsTargetDeviceMatching(IEnums::TARGET_DEVICE_APPLETV)
platformConfig->IsOperatingSystemMatching(IEnums::OPERATING_SYSTEM_TVOS)
IAudioInterface
IVideoInterface
IAppStoreControl
ICloudControl
IFileInterface
IGameCenterControl
IGameController
-> Input::IGameControllerDevice
IKeyboardControl
ILocation
-> Input::ILocationDevice
IMediaControl
IMouse
-> Input::IMouseDevice
IRawMouse
-> Input::IRawMouseDevice
IPreferencesControl
IRawButton
-> Input::IRawButtonDevice
ISystemDialogControl
ISystemFontControl
IWebControl
IUrlRequest
, no support for IEMail
IVirtualMouse
New Features
IAppConfiguration
SetDebugMouseEnabled()
IsDebugMouseEnabled()
HasDebugMouseEnabledChanged()
SetDebugMouseScaleFactor()
GetDebugMouseScaleFactor()
HasDebugMouseScaleFactorChanged()
ICustomControlable
AppOpenURL(String url, void* options)
IDeviceHandler
AddCloudControl(ICloudControl* cloudControl)
RemoveCloudControl(ICloudControl* cloudControl)
IEngineConfiguration
SetVirtualMouseEnable()
IsVirtualMouseEnabled()
SetVirtualRawMouseEnable()
IsVirtualRawMouseEnabled()
SetCloudControlEnable()
IsCloudControlEnabled()
IEnums::GameControllerControl
GAME_CONTROLLER_CONTROL_ACCELERATION
GAME_CONTROLLER_CONTROL_TOUCH_ORIENTATION
GAME_CONTROLLER_CONTROL_TOUCH_ABS_REL
IEnums::Gpu
GPU_POWERVR_GX
IEnums::OperatingSystem
OPERATING_SYSTEM_OSX_10_11
OPERATING_SYSTEM_IOS_9_0
OPERATING_SYSTEM_WINDOWS_8_1
OPERATING_SYSTEM_WINDOWS_10
OPERATING_SYSTEM_WEB
OPERATING_SYSTEM_WEB_LAST
OPERATING_SYSTEM_TVOS
OPERATING_SYSTEM_TVOS_9_0
OPERATING_SYSTEM_TVOS_LAST
IEnums::TargetClass
TARGET_CLASS_BROWSER
TARGET_CLASS_BROWSER_GENERIC
TARGET_CLASS_BROWSER_LAST
TARGET_CLASS_CONSOLE
TARGET_CLASS_CONSOLE_GENERIC
TARGET_CLASS_CONSOLE_LAST
IEnums::TargetDevice
TARGET_DEVICE_IPHONE_6S
TARGET_DEVICE_IPHONE_6S_PLUS
TARGET_DEVICE_IPAD_MINI_4
TARGET_DEVICE_IPAD_PRO
TARGET_DEVICE_IPOD_6G
TARGET_DEVICE_APPLETV
TARGET_DEVICE_APPLETV_4
TARGET_DEVICE_APPLETV_LAST
IGameController
SetConnected(Bool isConnected)
PostGravityEvent(Float gravX, Float gravY, Float gravZ)
PostAccelerationEvent(Float accelX, Float accelY, Float accelZ)
TakeTouchOrientationEnabled(Bool& isEnabled)
TakeTouchAbsoluteEnabled(Bool& isEnabled)
IKeyboardControl
WasClosed()
HasTextfield()
SetTitle(const String& title)
SetDescription(const String& description)
SetText(const String& text)
GetText()
IPreferencesControl
GetValue(const String& key, String& value)
GetData(const String& key, Data& value)
SetData(const String& key, const Data& value)
Remove(const String& key)
ICloudControl
ICloudRecord
IVirtualMouse
Graph::IBody
: ResolveCollisions()
methodGraph::IFrameBuffer
, Graph::FrameBuffer
sortOrder
" attribute and related interface methods to explicitly
specify a processing order between frame buffers
Input::IDeviceHandler
GetGameControllerDevice(UInt32 index = 0)
GetVirtualMouse()
Input::IGameControllerDevice
IsConnected()
GetGravity(AccelerationVector& gravity)
GetAcceleration(AccelerationVector& acceleration)
SetTouchOrientationEnabled(Bool isEnabled)
GetTouchOrientationEnabled(Bool& isEnabled)
SetTouchAbsoluteEnabled(Bool isEnabled)
GetTouchAbsoluteEnabled(Bool& isEnabled)
Logic::IDeviceHandler
IsGameControllerConnected(UInt32 deviceIndex)
GetGameControllerGravity(Input::AccelerationVector& gravity, UInt32 deviceIndex)
GetGameControllerAcceleration(Input::AccelerationVector& acceleration, UInt32 deviceIndex)
SetGameControllerTouchOrientationEnabled(Bool isEnabled, UInt32 deviceIndex)
GetGameControllerTouchOrientationEnabled(Bool& isEnabled, UInt32 deviceIndex)
SetGameControllerTouchAbsoluteEnabled(Bool isEnabled, UInt32 deviceIndex)
GetGameControllerTouchAbsoluteEnabled(Bool& isEnabled, UInt32 deviceIndex)
GetAppStoreControl()
GetPreferencesControl()
GetPreferenceValue(const String& key, String& value)
GetPreferenceData(const String& key, Data& value)
SetPreferenceData(const String& key, const Data& value)
PreferenceRemove(const String& key)
WasKeyboardClosed()
GetKeyboardControl()
IsCloudControlAvailable()
GetCloudControl()
GetVirtualMouse()
Output::IDeviceHandler
AddCloudControl(ICloudControl* cloudControl)
RemoveCloudControl(const ICloudControl* cloudControl)
GetCloudControl(UInt32 index = 0)
RawButtonCode
enumRAWBUTTON_SELECT
RAWBUTTON_PLAY_PAUSE
RAWBUTTON_ARROW_UP
RAWBUTTON_ARROW_DOWN
RAWBUTTON_ARROW_LEFT
RAWBUTTON_ARROW_RIGHT
DoubleBuffer
template classvoid ResetReadValue()
void ResetReadValue(const DataType& value)
void ResetWriteValue()
void ResetWriteValue(const DataType& value)
DataType& GetValue()
String
mapping:const Enum<IAppStoreControl::Status>& GetIAppStoreControlStatusEnum()
const Enum<IAppStoreProduct::Status>& GetIAppStoreProductStatusEnum()
const Enum<IAppStoreProduct::ProductType>& GetIAppStoreProductTypeEnum()
const Enum<IGameCenterControl::AuthenticationStatus>& GetIGameCenterAuthenticationStatusEnum()
const Enum<IGameCenterControl::LoadFriendsStatus>& GetIGameCenterLoadFriendsStatusEnum()
const Enum<IGameCenterControl::LeaderboardStatus>& GetIGameCenterLeaderboardStatusEnum()
const Enum<IGameCenterControl::AchievementStatus>& GetIGameCenterAchievementStatusEnum()
const Enum<IGameCenterControl::Error>& GetIGameCenterControlErrorEnum()
const Enum<IMusicPlayerControl::MusicPlayer>& GetIMusicPlayerEnum()
const Enum<IMusicPlayerControl::PlaybackState>& GetIMusicPlayerPlaybackStateEnum()
const Enum<IMusicPlayerControl::RepeatMode>& GetIMusicPlayerRepeatModeEnum()
const Enum<IMusicPlayerControl::ShuffleMode>& GetIMusicPlayerShuffleModeEnum()
Array::Array(InitListType initList)
Array::Add(InitListType initList)
Array::Insert(SInt32 index, InitListType initList)
Index::Index(InitListType initList)
Index::Add(InitListType initList)
ObjectArray::ObjectArray(InitListType initList)
ObjectArray::Add(InitListType initList)
ObjectArray::Insert(SInt32 index, InitListType initList)
ObjectIndex::ObjectIndex(InitListType initList)
ObjectIndex::Add(InitListType initList)
Array
, ObjectArray
Index
, ObjectIndex
Map
, ObjectMap
String
Queue
templateObjectQueue
templateQueue
typedef'sStringQueue
UInt8Queue
SInt8Queue
UInt16Queue
SInt16Queue
UInt32Queue
SInt32Queue
UInt64Queue
SInt64Queue
RealQueue
FloatQueue
DoubleQueue
BoolQueue
MURL_COMPILER_C98
MURL_COMPILER_C11
MURL_COMPILER_C14
IEnums::CompressionLevel
Util::Compresss()
supporting compression level
<ReferenceScaleTransform>
equivalent to Reference
with parent Scale
with parent Transform
<ReferenceScale>
equivalent to Reference
with parent Scale
<ScaleTransform>
equivalent to Scale
with parent Transform
Graph::ITrackerResult
and Graph::TrackerResult
for querying node traversal
issues
slip
" parameter and interface methods in Graph::Contact
and Graph::IContact
Graph::IIsland
interface and Graph::Island
node for separating physics
simulator instances
Util::ShaderBuilder
New Platform Features
ICloudControl
and IGameController
ICloudControl
and IGameController
API Changes
IGameCenterPlayer::IsFriend()
IGameCenterAchievementEntry::IsHidden()
Input::AccelerationVector
from Real
to Double
Input::AngularVelocityVector
from Real
to Double
Array::RemoveGet(SInt32 index)
Array::Swap(Array& other)
ObjectArray::Swap(ObjectArray& other)
MURL_COMPILER_GCC42
to MURL_COMPILER_GCC
Fixes
IAppStoreProduct
fixed mistaken GetReceiptData()
and GetReceiptSignature()
Graph::PlaneGeometry
: Fixed border size calculation
Graph::TextGeometry
:
Graph::GenericParameterGroup
: fixed a possible crash
Video::GlEs20::ShaderProgram
Graph::Light
Graph::TransformableAnimationTimeEvaluator
Util::Font::QueryTextSize()
Graph::ClipSequencer
Util::Attributes
and
Resource::NativeAttributes
for comma-separated values
Graph::ResourceMeshGeometry
duplicate skinning when referenced
Xcode debug data formatter
Xcode debug data formatter, see murl/common/xcode/readme.txt
Murl::Color
class
Murl::Data
/ Murl::MutableData
/ Murl::ConstData
class
Murl::Math::Vector
class
Murl::String
class
Murl::System::DateTime
class
Murl::System::Time
class
Murl::Util::File
class
All changes can also be found in change log.
As always, if you encounter difficulties, find a bug or want to discuss development issues, head over to the Forum.
]]>Also this year the GameStage Expo takes place in the Tabakfabrik Linz. We will also participate with our own stand and will present our latest games and demos. So, just swing by and have a look at our latest works.
The event takes place from 9th to 11th October in the Lösehalle and the Étage Lumière in the Tabakfabrik Linz. Virtual Reality and 3D technology are this years core topics. Apart from the game expo a special additional event is offered each day.
Event details:
Please visit the official website for further information.
]]>Murl Tools, a open source Visual Studio extension for VS2013 & VS2015 has been released. The extension adds some useful commands to the Solution Explorer of Visual Studio and has been created to improve the work flow with Murl Engine projects but is beneficial for every cross platform VisualC/C++ project where the source and data files are not stored inside the project folder.
The Murl Tools extension adds the following commands to the context menu of the Solution Explorer:
Duplicate File(s)
To create a copy of an existing file in the Solution Explorer you usually select the file and press CTRL-C and CTRL-V. While this is working for C# and VB projects, it does not work for VisualC/C++ projects.
The extension adds a Duplicate command to the context menu of the Solution Explorer. The command creates a copy of the selected file and adds it to project within the same filter.
Duplicate screenshot
Side note: If you want the CTR-C / CTRL-V feature in Visual Studio, you can vote for it here.
Refresh Folder
This command adds references for all missing files that exist in the folder (file system) but not in the selected filter (project). Note, that this command only makes sense when your filter corresponds to a folder in the file system.
Refresh screenshot
Remove/Delete Dialog
If someone selects one or more files in the solution explorer of a VisualC/C++ project and then presses the delete key, he usually gets a dialog where he can choose to remove or to delete the file(s). You can decide if only the file reference(s) should be removed from the project or if also the file(s) itself should be permanently deleted from the file system.
Unfortunately the dialog only shows up if the selected files are stored in the project folder which is not the case for e.g. cross platform projects where multiple projects/platforms share the same source code files.
The extension fixes this weird behavior and always displays a Remove/Delete dialog.
Remove/Delete dialog screenshot
Side note: If you want this feature fixed in Visual Studio, you can vote for it here.
The Murl Tools extension is licensed under the terms of the open source MIT License (MIT). The source code is hosted on GitHub.
]]>The new Murl Engine Build 1.00.5880Beta is available for download. This is an regular update release with several improvements and fixes.
API Changes
IAppStoreProduct::GetPurchaseSignature()
,
see the method documentation for platform specific data content.
Resource::IDictionary
, together with Resource::XmlDictionary
and
Resource::NativeDictionary
for grouping together multiple key/value
string pairs.
Resource::NativeImage
.
Improvements
Math::MinMax
template class.
ILoader::RemovePackage()
and ILoader::RemoveProcessor()
methods.
Util::PrintToString()
method (equivalent to System::CLib::PrintToString()
).
Graph::ITransformable
methods to read Euler angles:
GetRotationX()
, GetRotationY()
and GetRotationZ()
Graph::IAnchor::GetWorldPosition()
method
Graph::IInstance GetReplicationNode()
method
Color::StringFormat
enumeration for better control of how to convert
a color to a string via Util::StringToColor()
.
floor()
when
querying integer values from Murl::Color
.
Graph::IGenericParameter
.
Resource::IImage
.
srgb
" boolean attribute in scene converter <Texture>
element.
IEnums::IsPixelFormatStoringLinearColorValues()
function.
IEnums::DEPTH_SORT_MODE_VIEW_Z
enumeration value.
Util::ShaderBuilder
.
Util::IndentString()
function.
includeForCondition
"/"excludeForCondition
" attributes in Graph::Node
.
Graph::ITexture::SetAutoScaleFactor()
method for automatically resizing
a texture to a multiple of the current output surface resolution.
useMipMapGeneration
" attribute in Graph::FrameBuffer
to automatically
create a full MIP chain after rendering (texture must have "useMipMapping
" set to true
).
targetMipLevel
" attribute in Graph::FrameBuffer
to select the target
texture MIP level to render to (texture must have "useMipMapping
" set to true
).
Resource::XmlShader
parameterization.
IFeatureSet
: Allow to force features enabled/disabled, for debugging purposes.
Graph::IListener::SetMaxDistance()
.
Math::Cone
.
Fixes
Graph::Instance
now creates Graph::Container
nodes for replications.
Logic::ITimeframe::WasStarted()
is reported the tick after Start()
instead
of the same tick (which matches the behaviour of Logic::ITimeline::WasStarted()
).
Graph::GenericGeometry
when updating vertices
and/or indices
Util::ColorToString()
for hex strings.
Graph::NinePatchPlaneGeometry
problem when output size is smaller than
the sum of the corner sizes.
Util::EncodeXml()
.
timelineUnits
" attribute in Graph::TimeController
.
Graph::GenericParameters
and related
nodes.
Graph::GenericParameters
, Graph::GenericParameter
and
Graph::GenericParameterGroup
.
SInt32
uniform as a float in GLES2.0 renderer when setting a
custom uniform variable.
GenericResourceArrayTarget::Update()
method.
UNDEFINED
" strings for various enumerations in Murl::IEnums
.
Graph::TextGeometry
line offset for multi-line strings.
Graph::Template
attribute evaluation.
Graph::AudioSequence
when audio source has no stream.
All changes can also be found in change log.
As always, if you encounter difficulties, find a bug or want to discuss development issues, head over to the Forum.
]]>Creating Murl Engine scene graph XML files can be a long-winded task, especially for beginners who are new to the syntax. To facilitate the creation of XML files, we now provide a complete XML Schema that contains the description of all possible XML tags and attributes. In combination with a proper IDE you gain all the "Intellisense" code/content assist goodies like automatic code completion, context sensitive selection lists, hints, code validation and error highlighting.
XSD File
An XML Schema (also XSD, short for XML Schema Definition) describes the structure of an XML document and can be used to express a set of rules to which an XML document must conform in order to be valid. XSD is a W3C recommendation and is widely supported by IDEs and XML editors. A good starting tutorial can be found here: www.w3schools.com/schema/
We now provide one XSD file (murl_graph_nodes.xsd
), which describes the structure of all Murl Engine XML resource and configuration files:
The XSD file will be provided as part of the Murl Engine with all future releases. The file will then be located in the directory murl/common/xsd/
.
In the meantime you can also download the file from here.
All entities in the XSD are defined in the namespace: https://murlengine.com
Advantages
If your IDE provides an XML editor with XSD support you greatly benefit from automatic code completion and live validation. Let’s illustrate the advantages with a short example using Visual Studio.
We create an XML animation resource file and start a new tag with the <
character.
The editor automatically displays a list with all possible tags that are allowed in an XML animation resource file.
Context sensitive tag list
If we select one element in the list, we get additional information about that tag displayed to the right.
Info overlay
We select the desired tag and immediately get a list with all possible attributes for this tag; again with hints in an extra overlay window to the right.
The wavy line under the PositionKey
tag reminds us that we haven't specified all mandatory attributes yet.
Attribute list with info overlay
We select the desired attribute. If the possible attribute values are composed of a fixed set of values, like an enumeration, the desired value can again conveniently be selected from a list.
Value selection list for enumeration values
For other values we get a brief syntax check.
For example, in the screenshot below we set the angle to 90 degrees but forgot to specify the deg
/d
suffix.
Visual Studio is reminding us that the value is not valid according to the XSD and therefore draws a wavy line below that value.
Value syntax check
When we add the suffix d
, we get a document that passes the XSD validation and the wavy line disappears.
XSD validation passed
Installation
Typically two steps are necessary to benefit from XSD content assistance:
Step two is generally done by specifying the correct namespace in the root tag using the attribute xmlns
.
<Graph xmlns="https://murlengine.com"/> ... </Graph>
Step one depends on your editor:
Visual Studio
The simplest way in Visual Studio is to add the XSD file to your solution and exclude it from build (Properties > Exclude from Build).
Visual Studio Solution Explorer
Now you have full XML content assist functionality in Visual Studio.
Note: Future versions of the Dashboard will automatically add a reference to the XSD file when a new project is created.
Eclipse
Eclipse also provides a powerful XML Editor with XSD support. If it is not included in your installation, you can add it easily:
To add the XSD file to Eclipse follow these steps:
Now you should have full XML content assist functionality in Eclipse.
Eclipse XML Editor
Note: Press CTRL-SPACE
if the overlay does not show up automatically.
IntelliJ IDEA
Intellij IDEA also provides an XML Editor with XSD support. To add the XSD file follow these steps:
+
buttonNow the XML content assist functionality should also be available in Intellij IDEA.
Intellij IDEA XML Editor
For other IDEs and XML editors the method is similar.
Note: Xcode has only poor editing support for XML files and does not support XSD validation. You may have to use Eclipse or another XML editor to get XSD based content assist functionality on a Mac.
]]>A new multithreading tutorial is available. You can find the Tutorial #15: Multithreading in chapter one of the tutorials section.
Multithreading is known as concurrently executing multiple threads apparently at the same time.
Usually it is not necessary to create your own threads.
Anyway, if a time-consuming calculation needs to be done in the background, a separate thread can be spawned utilizing the System::Thread
class.
Additionally the Murl Engine provides the classes System::Semaphore
, System::Mutex
, System::Locker
and System::AtomicSInt32
to synchronize threads.
A new tutorial describing how to convert 3D models and import them into the Murl Engine is now available. You can find the Tutorial #01: Import 3D Model in chapter three of the tutorials section.
To be able to load a 3D model with the Murl Engine, it must first be converted into a Resource::Mesh
. The Murl Engine provides the two
tools Scene Converter and Scene Viewer
for this purpose. Usually the following steps are necessary, to be able to use a 3D model in an app:
3D models can be created in any 3D modeling software (e.g. Blender, Cinema 4d, 3ds Max, zBrush etc.). The model then needs to be exported in a proper file format for the Scene Converter.
The Scene Converter uses Assimp (Open Asset Import Library) and the Autodesk FBX SDK to read 3D model files and therefore supports many different file formats. A list with all supported Assimp file formats can be found here.
We recommend using the FBX file format because it provides good flexibility and usually causes less trouble.
]]>The new Murl Engine Build 1.00.5630Beta is available for download. This is an regular update release with several improvements and fixes.
API Changes
Graph::INamespace::UnregisterNode()
/UnregisterSubNamespace()
now require
an additional pointer to the actual object
Logic::ITouchArea
to Logic::IScrollProcessor
New Features
Improvements
Murl::Math::Interpolation()
e.g. a = Interpolation('EASE_IN', b)
Murl::Util::Rng::Seed()
, Rand()
, RandBool()
, RandSInt()
, RandReal()
, RandDouble()
Util::Rng RandDouble()
method.
String::GetUTF8Char()
and String::GetChar()
method.
IUrlRequest
.
Logic::ITouchArea
to Logic::IScrollProcessor
:Graph::FixedParameters
nodes now accept multiple parent parameters
nodes for modulation
Resource::IImage
, Resource::IAudio
and Resource::IVideo
can now hold
multiple data streams
Graph::INode
Graph::INode
Fixes
Graph::Template
not accepting user-defined attributes
Graph::Material
not updating depth offsets upon initialization
Graph::Transform
when using euler angles
Graph::FixedParameters
node
Util::GetNormalizedPath()
Util::Util::GetNormalizedPath()
MURL_IMAGE_CONVERTER
shell variable
Graph::IFactory
Graph::FrameBuffer
Graph::Anchor
update at very first frame
Graph::FlatTexture
and Graph::CubemapTexture
when
changing source image resources/video streams at runtime
Graph::IReference
nodes
All changes can also be found in change log.
As always, if you encounter difficulties, find a bug or want to discuss development issues, head over to the Forum.
]]>A new tutorial is available which explains the exact sequence in which the rendering occurs. You can find the Tutorial #14: Render Order in chapter one of the tutorials section.
Visible surface determination is usually done with the Z-buffer technique (also known as depth buffering). In this case the drawing order of the objects is irrelevant for the render result. However, the Z-buffer technique only works with opaque faces but not with transparent faces. Transparent, overlapping faces have to be drawn in the correct order sorted from back to front. This is because the drawing order has a significant impact to the final compound color.
Thus it is often wise to render the opaque geometries at first with Z-buffering enabled and the transparent geometries afterwards accessing the Z-buffer in read-only mode. Also for overlays, HUDs and various effects the render order often plays a vital role.
This tutorial describes the exact sequence in which the rendering occurs and shows ways to control the render order.
The drawing order of the renderer can be controlled in several hierarchy levels:
Spraylight, the company behind the Murl Engine, is now official Intel® Software Premier Elite Partner.
As a software partner, we have access to Intel's technical and marketing support centers and benefit from Intel's global network. Apart from access to Intel® processor based devices and Intel® tools and SDKs we also can take advantage of Intel®'s marketing and business support.
One first outcome of our cooperation is the publication of a white paper describing the Murl Engine in the Intel® Developer Zone. The article can be found here: Murl Engine Cross-Platform Development Tool with Android x86 Support
Being an Intel® software partner allows us to optimize the Murl Engine for Intel® based devices and guarantees optimal performance and compatibility for your Murl Engine apps. That's good news for us and the entire Murl Engine community.
]]>The new Murl Engine Build 1.00.5467Beta is available for download. This release introduces a new image converter tool and fixes several issues.
New Features:
Improvements:
Murl::
scope to factory object macros
IEnums::Feature
and IEnums::PixelFormat
Util::HasMatchPattern()
and Util::IsNameMatching()
method for evaluating wildcard patterns.
Fixes:
Graph::Body
from correctly updating its parent transform
Graph::ShaderProgram
Graph::NodeTarget
and similar classes
All changes can also be found in change log.
As always, if you encounter difficulties, find a bug or want to discuss development issues, head over to the Forum.
]]>The new Murl Engine Build 1.00.5358Beta is available for download. Among other new features, this release brings support for the new mathematical expression evaluator and will create apps with smaller binary sizes.
API Changes:
New Features:
<Output> <Image minSizeX="0" minSizeY="0" [minSize="0"]/>
attribute.
Util::Evaluator
), which is also used for parsing XML attributes in a graph resource and tools XML config files.
See blog post for further details.
IEngineConfiguration::GetDefaultGraphParameters()
, which can be used to specify custom global constants for scene graph attribute evaluation.
Improvements:
IAppConfiguration::SetMemoryWarning()
Graph::Button
up/down/hover/disabled
state can share same nodes
Graph::INode::GetPath()
method
Graph::INode::PrintTree()
parameters to include and exclude nodes by NodeFlags
Math::StaticMatrix::Zero()
and Math::StaticMatrix::Identity()
Math::Matrix operator==
and operator!=
Math::Quaternion operator==
and operator!=
Math::Rectangle IsEqual()
, operator==
and operator!=
Color operator==
and operator!=
Logic::Animation::SetIntermediateKeys()
method
Logic::IState::GetResourceText()
method
maxNumberOfStreamBuffers
attribute to Graph::AudioSequence
Fixes:
Graph::Light
allowDynamicBatching
XML attribute in Graph::CubeGeometry
exclude
and include
conditions for a resource in an XML package at the same time.
All changes can also be found in change log.
As always, if you encounter difficulties, find a bug or want to discuss development issues, head over to the Forum.
]]>Our latest addition to the Murl Engine is a practical mathematical expression evaluator. The evaluator allows you to specify a mathematical expression as parameter value in resource XML files. (updated 24.05.2015)
The ability to use mathematical expressions instead of fixed values is often very beneficial.
You can set up graph objects directly within XML graph resource files without the need of additional C++ code.
This is especially useful when you are working with instance replications.
For instance, the feature image shows an example where a mathematical expression is used to align some PlaneGeometry
objects along a heart shaped path.
To specify a mathematical expression, enclose the expression in curly braces. This is the same notation as with passed attribute values. Here is a simple example:
<PlaneGeometry id="plane_{replication}" posX="{replication*10}" posY="0"/>
Combining Expressions
A sequence of expressions can be defined by using a semicolon separated list. The last expression is assigned to the attribute, e.g.:
<PlaneGeometry posX="{R=400;r=100;b=65;t=replication*0.01;(R-r)*Sin(t)-b*Sin((R-r)/r*t)}" />
It is also possible to nest expressions which will result in a separate evaluation for each nested expression:
<PlaneGeometry posX="{{2*3}+6}}" />
Datatypes
The evaluator supports the following data types:
Double, SInt32, Bool, StringThe correct data type is determined automatically. An explicit type conversion can be done in functional notation:
<PlaneGeometry posX="{SInt32(replication*0.1)}" />
To specify a String
, enclose the characters in single quotes:
<Node id="{'ab'+String('c')+BoolToString(1)}" />
The result for the expression above would be:
abctrueConditional statements
The if
function can be used for conditional if/else expressions.
<PlaneGeometry posX="{if(replication > 10, 100, 0)}" />
A C++ equivalent for this expression would be:
if (replication > 10) { posX = 100; } else { posX = 0; }
Alternatively the switch
function can be used to create a conditional expression.
The switch
function expects a condition parameter followed by a number of case parameters.
The condition parameter is clamped to the range [0, number_of_case_parameters-1]. Example:
<PlaneGeometry posX="{switch(replication * 0.1, 100, 200, 50)}" />
In this example the condition parameter is clamped to the range [0,2]. Therefore 100 is assigned to instances 0 to 9, 200 to instances 10 to 19 and 50 to all others.
Equivalent C++ code for the expression above would be:
SInt32 condition = SInt32(replication * 0.1) if (condition < 0) { condition = 0; } switch(condition) { case 0: posX = 100; break; case 1: posX = 200; break; default: posX = 50; }
Random Number Generator
A global Random Number Generator (RNG) is provided to allow the usage of random numbers.
The RNG is always initialised with the same seed value and therefore is always generating the same sequence of numbers. The function Seed(value)
can be used to set a new seed value.
The function Seed()
without parameters uses the current system time as seed value.
<Instance graphResourceId="graph_plane" replications="{Seed(42);10}"/>
For example, RandSInt(start, end)
can be used to draw a new random number.
<PlaneGeometry posX="{replication*10}" posY="{RandSInt(-100,100)}" />
C++ Default Parameters
You can define global default parameters in the IApp::Configure()
method and read those parameters in your mathematical expression.
The method GetDefaultGraphParameters()
has been added to the IEngineConfiguration
class for that purpose.
Bool App::MyApp::Configure(IEngineConfiguration* engineConfig, IFileInterface* fileInterface) { IAttributes* defaultParameters = engineConfig->GetDefaultGraphParameters(); defaultParameters->AddAttribute("myPosParam","42"); … }
The new default parameter can be read as every other variable:
<PlaneGeometry posX="{myPosParam}" />
The following list contains all available operators, functions and constants.
The usage is the same as for the corresponding C++ equivalents.
For String
functions the first parameter needs to be the String
where the method should be applied.
Operators:
+, -, *, /, % (Addition, subtraction, multiplication, division, modulo) <<, >> (Shift operators) &, |, ^, ~ (Bitwise AND, OR, XOR, NOT) &&, ||, ^^, ! (Logical AND, OR, XOR, NOT) = (Assignment) ==, !=, <, <=, >, >= (Relational operators) # (Comment operator)
Constants:
E, PI, TWO_PI, HALF_PI, INV_PI, INV_TWO_PI, INV_HALF_PI, DEG_TO_RAD, RAD_TO_DEG, MM_TO_CM, CM_TO_MM, MM_TO_INCHES, CM_TO_INCHES, INCHES_TO_MM, INCHES_TO_CMConditional Functions:
if, switchMath Functions (Murl::Math):
Abs, Sgn, Min, Max, Clamp, IsNaN, IsInfinite, IsFinite, Exp, Log, Log2, Log10, Sqrt, Pow, Fmod, Sin, Cos, Tan, ArcSin, ArcCos, ArcTan, ArcTan2, SinHyp, CosHyp, TanHyp, ArcSinHyp, ArcCosHyp, ArcTanHyp, Floor, Ceil, Round, IsEqual, DegToRad, RadToDeg, MapAngle, AddAngle, SubAngle, Lerp, InterpolationString Functions (Murl::String):
GetLength, Trim, TrimLeft, TrimRight, Left, Right, Mid, ToLowerUTF8, ToUpperUTF8, GetLengthUTF8, Replace, Find, ReverseFind, FindFirstOf, FindFirstNotOf, StartsWith, EndsWith, CompareExplicit Type Conversion:
SInt32, Double, Bool, StringConversion Functions (Murl::Util):
StringToDouble, StringToSInt32, StringToBool, DoubleToString, SInt32ToString, BoolToStringRandom Number Generator (Murl::Util::Rng):
Seed, Rand, RandBool, RandSInt, RandReal, RandDouble
Note
Please note that the following characters should be escaped in XML files:
We created a bunch of new tutorials for you.
These cover the usage of Button
nodes, Aligner
nodes, FrameBuffer
nodes, system dialogs, camera movement and add-ons.
Tutorial #10: Buttons
By using a Button
node it is possible to create simple controls in order to interact with the user.
The Button
graph node itself does not contain any visible elements; it only defines an area within the scene which reacts on mouse clicks and touch events.
The Tutorial #10: Buttons demonstrates
with several examples how the Button
node can be used.
Tutorial #11: SystemDialog & WebControl
Usually dialogs are created in accordance to the app's design.
But in some situations real system dialogs are preferred.
The Tutorial #11: SystemDialog & WebControl shows how simple system dialogs can be created.
Additionally it shows how the WebControl
can be used to open a website in the default browser, how to send an email and how to perform a HTTP request.
Tutorial #12: Aligner
Aligner
nodes can be used to automatically align individual objects.
The Tutorial #12: Aligner explains the
usage of Aligner
nodes and shows additionally how the anchor point can be changed with the containerAlignmentX
and containerAlignmentY
attributes.
Tutorial #13: Framebuffer
Usually the whole scene is rendered to the back buffer and displayed directly.
Alternatively you can render parts of the scene to a off-screen texture by using the FrameBuffer
node (a.k.a. off-screen rendering).
The Tutorial #13: Framebuffer illustrates the usage.
Tutorial #00: Moving Camera
The first tutorial of the third chapter explains how the camera of a 3d scene can be moved. At first, a simple 3d scene with a skybox is created. Then three different methods for moving the camera are demonstrated.
Tutorial #00: Add-on Integration
The Murl Engine supports a number of add-ons, which can be used optionally. The Tutorial #00: Add-on Integration points out which add-ons are available, how an add-on can be added to a project and what other aspects you should pay attention to.
]]>The new Murl Engine Build 1.00.5225Beta is available for download. This new release includes support for Microsoft Visual Studio Community 2013 and the new Android NDK r10c.
Improvements:
Graph::Button
to allow dynamic setting of state children
New Features:
Logic::ITimeframe::WasStarted()
method
Fixes:
Math::Lerp()
fixed floating-point arithmetic error if startValue == endValue
Graph::TextGeometry
For an detailed overview on what's new, please read the change log.
As always, if you encounter difficulties, find a bug or want to discuss development issues, head over to the Forum.
]]>At the Connect() developer event last week in New York, Microsoft launched Visual Studio Community 2013, the free version of the IDE for small teams. To allow our developers to take advantage of the new version, the Murl Engine will start providing support for Visual Studio 2013 beginning with the next upcoming release.
Community Edition
Visual Studio Community 2013 is a new, free and fully featured edition of Visual Studio including full extensibility. Similar to the Express version of Visual Studio, the Community edition is free and can be used to create free or paid apps. Though, the Community edition is restricted to individual developers and small organizations (max five users). Microsoft's definition of a small organization in this regard is a company up to 250 PC's and less than $ 1 Million annual revenue (see also visual-studio-community#QnA). Nevertheless the Community edition is a great offer specifically for Indie developers.
Visual Studio 2013 Support
Therefore all future releases of the Murl Engine will provide support for VS2013 and will come with the required prebuild libraries. Of course, not only the Community edition is supported. Developers may also use Visual Studio Express 2013, Visual Studio Professional 2013 or any other Visual Studio version supporting the 2013 Toolset (ToolsVersion 12.0).
Upgrade Projects to VS2013
The new Dashboard command Project / Create Missing Project Files can be used to add VS2013 project files to an existing project.
Alternatively you can manually copy your VS2010 project files to an folder named VS2013 and use Visual Studio 2013 to upgrade the project files:
"C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\devenv.exe" mySolution.sln /upgrade
Visual Studio 2008 Support Discontinued
By introducing support for Visual Studio 2013 we will stop delivering prebuild libraries for Visual Studio 2008. The Murl Engine will still support VS2008 but we will just not include the prebuild libraries into the download package. If you really need to support Windows 2000 or Windows XP pre SP2, we will provide you the libraries separately. Just drop us an e-mail or use the forum.
]]>The new Murl Engine Build 1.00.5139Beta is available for download. This is a bug fix release with some fixes and minor improvements.
Improvements:
<Input> <Image rotate="CW|CCW"/>
attribute.<Input> <Image planeApplyAngleZ="yes"/>
attribute.<Input> <Image sequenceApplyAngleZ="yes"/>
attribute.<Output> <PlaneGraphXML applyAngleZ="yes"/>
attribute.<Output> <SequenceGraphXML applyAngleZ="yes">
attribute.Fixes:
Logic::TimeFrame::HasPassedTime()
not working at WasRunning()
state
Logic::TimeFrame::Reset()
set current time to zero.
For an detailed overview on what's new, please read the change log.
As always, if you encounter difficulties, find a bug or want to discuss development issues, head over to the Forum.
]]>The new Murl Engine Build 1.00.5068Beta is available for download. This is an regular update release with several improvements and fixes.
API Changes:
SetRotationComponent(DataType angle, DataType ax, DataType ay, DataType az)
to SetRotationComponentAxisAngle(DataType angle, DataType ax, DataType ay, DataType az)
New Features:
IEnums
:TARGET_DEVICE_IPAD_6
,TARGET_DEVICE_IPAD_MINI_3
IEnums::RotationOrder
enum:ROTATION_ORDER_ZYX
is defined only
Graph::Transform
class:angleX="0deg"
, angleY="0deg"
, angleZ="0deg"
, rotationOrder="ZYX"
Resource::XmlAnimation
class:<RotationKey time="0.0" angleX="0deg" angleY="0deg" angleZ="0deg" rotationOrder="ZYX"/>
Improvements:
Vector::IsZeroPosition()
method
Math::Lerp()
linear interpolation function template
Logic::Animation
template typedefs for UInt64
/ SInt64
affectDepthOrder
attribute to Graph::CloneTransform
and Graph::ResetTransform
nodes, with access methods in Graph::ICloneTransform
and Graph::IResetTransform
.
Murl::IPackage
is loaded. See methods AddGraphInstance()
, RemoveGraphInstance()
, HideGraphInstance()
, UnhideGraphInstance()
and equivalent methods for scripts like AddScriptInstance()
etc.
Graph::ITransformable
interface:Bool SetRotation(const Quaternion& q)
and Bool SetRotationXYZ(Real angleX, Real angleY, Real angleZ, IEnums::RotationOrder rotationOrder)
SetRotationComponentXYZ(DataType angleX, DataType angleY, DataType angleZ, IEnums::RotationOrder rotationOrder)
SetRotationComponent(DataType angle, DataType ax, DataType ay, DataType az)
to SetRotationComponentAxisAngle(DataType angle, DataType ax, DataType ay, DataType az)
Fixes:
Graph::Transform
animation attributes
For an detailed overview on what's new, please read the change log.
As always, if you encounter difficulties, find a bug or want to discuss development issues, head over to the Forum.
]]>Let your Murl Engine app go truly full-screen. This is a quick reminder how to enable Androids™ immersive full-screen mode for Murl Engine apps. (updated 07.09.2018)
Please note that the immersive full-screen mode was introduced with Android™ 4.4 (API Level 19). Hence enabling the mode will only have effect on devices with Android™ 4.4 or higher.
To enable immersive full-screen mode add mHideNavigationBarImmersiveStickyEnabled=true;
to the murl.configdata
meta-data in your Android Manifest file:
</activity> <meta-data android:name="murl.configdata" android:value="mHideNavigationBarImmersiveStickyEnabled=true;"/> </application>
You can also set the the parameter in the common Makefile projekt/common/gnumake/module_yourapp.mk
to automatically include the setting when the Manifest file is created:
Doing so will enable immersive mode and set the immersive sticky flag. This will have the following effects to your Android™ app:
LTR reminder bubble, immersive full-screen, semi-transparent system bars
Instead of hiding the navigation bar you can also just dim it by enabling the "low profile" mode.
This feature is supported since Android™ 4.0 (API level 14) and can be accomplished by setting the value mLowProfileNavigationBarEnabled=true;
</activity> <meta-data android:name="murl.configdata" android:value="mLowProfileNavigationBarEnabled=true;"/> </application>MURL_ANDROID_CONFIG_DATA := mLowProfileNavigationBarEnabled=true;
LTR normal mode, low profile mode, immersive full-screen mode
If both modes are enabled, immersive full-screen mode will prevail. This means that you will see the immersive full-screen mode on devices with Android™ 4.4 or higher and the low profile mode on devices with Android™ version greater or equal 4.0 and lesser 4.4.
</activity> <meta-data android:name="murl.configdata" android:value="mLowProfileNavigationBarEnabled=true;mHideNavigationBarImmersiveStickyEnabled=true;"/> </application>MURL_ANDROID_CONFIG_DATA := mLowProfileNavigationBarEnabled=true;mHideNavigationBarImmersiveStickyEnabled=true;
An even easier way to enable the immersive full-screen mode is the use of the Dashboard and the Android / Configure Project command. The command will open a dialog window, where you can conveniently specify the most important Android™ settings including the desired screen mode. All changes made in the dialog will then be applied to the common Makefile. You have to rebuild the Manifest file to apply the changes (delete Manifest file and start gradle sync).
Android / Configure Project Dialog
Further information about the screen modes can be found in the section Managing the System UI of the Android™ developer documentation.
]]>A new gallery page showcasing successful Apps and Demos has been added to the website.
For the launch we start with six apps and demos. You can find screenshots, info, download links and often videos for every app. Of course we want the gallery to grow and showcase your works. If you have developed a cool app with the Murl Engine and want to showcase it on our site, please write us an email or write into the forum.
]]>The new Murl Engine Build 1.00.4990Beta is available for download. This is an update release with support for iOS 8.
API Changes:
GetText()
methods in Resource::ICollection
and Resource::IPackage
now
return a text object instead of a char pointer. Use GetValue()
on
this text object to retrieve the actual string.
New Features:
ICustomControlable
.
CustomControlable
base class.
IPlatform
.
Improvements:
IsIndexValid()
method to container classes.
IFile
automatic data resize of empty data for Read(Data& data)
method.
Fixes:
Util::SplitString()
fixed adding empty array elements if acceptEmpty is false.
For an detailed overview on what's new, please read the change log.
As always, if you encounter difficulties, find a bug or want to discuss development issues, head over to the Forum.
]]>The GameStage Expo will make its debut from 12th to 14th September in the Tabakfabrik Linz.
Over an exhibition floor area of more than 4,000 m², the exhibition covers the entire range of the Austrian video and computer gaming scene. Numerous developers will present their latest projects.
A retro museum invites visitors to take a journey through the history of electronic gaming. More than 50 playable consoles, handhelds and home computers from the past 40 years of computer gaming history plus 20 classic arcade machines will bring the golden arcade gaming era to life. In line with this topic, a garage sale for classic video and computer games will take place on Saturday, September 13th.
We will also attend with our own stand and will present our latest games and demos. So, just swing by, have a look at our work and we will be happy to answer you any questions you might have. We are looking forward to seeing you there!
Event details:
Please visit the official website for further information.
]]>We created a new tutorial which explains the usage of the container classes and other important basics. You can find the Tutorial #09: Container & Basics in chapter one of the tutorials section.
Be warned, this tutorial is huge and covers the following topics:
Text Output, Strings
Container
Time
Miscellaneous
Utility Functions
Pointer
Android™ tablets and smartphones equipped with Intel Atom CPUs are getting more and more popular. Therefore the Murl Engine allows creating Android™ apps with native x86-support since version 1.00.4754Beta.
Short Summary:
Originally all Android™ devices were typically equipped with an ARM CPU. Since 2012 also Android™ devices with Intel x86 Atom CPUs are available. Some examples of Android™ devices running on Intel Architecture are: Samsung Galaxy Tab 3 10.1, Asus MemoPad FHD 10, Dell Venue 7/8, Motorola Razr I, Lenovo K900 or more recently the HP 7.
Intel developed a Binary Translator called Houdini which allows existing Android™ apps with native ARM code to run also on Android™ devices with Intel architecture. The Binary Translator reads native ARM code and on the fly translates it into equivalent x86 code.
Hence almost every ARM NDK application will run also on Android™ x86 devices without modification. However the NDK bridging technology is slower and may cause problems in certain cases. Therefore adding x86 support is in most cases the preferred option.
All upcoming releases of the Murl Engine will also provide precompiled libraries for Android™ x86 devices. The Android™ build scripts will automatically build and include also x86 Android™ code per default.
The parameter MURL_ANDROID_CPUS
can be used in the common Make file projekt/common/gnumake/module_yourapp.mk
to select the supported CPU architectures for your app. Example:
The specified values correspond to the values of the APP_ABI parameter of the Android™ NDK build environment (ABI is short for "Application Binary Interface").
armeabi ARM-based CPUs that support at least the ARMv5TE instruction set armeabi-v7a ARM-based CPUs that support ARM Architecture v7-a instruction set with Thumb-2 instructions und VFPv3-D16 hardware FPU. x86 x86-based CPUs. The NDK build uses the following gcc flags: -march=i686 -mtune=atom -mstackrealign -msse3 -mfpmath=sse -m32
The Murl Engine build scripts additionally add the parameter -mssse3
. This is safe because all x86 Android™ devices support SSSE3 (see also https://ph0b.com/improving-x86-support-of-android-apps-libs-engines). Further information about the different architectures can be found in the NDK documentation in the file docs/CPU-ARCH-ABIS.html
.
You can check the lib directory in your APK archive to verify that the correct libraries have been included. Remember that the .apk file is an archive file compressed with the zip format. You can e.g. rename it to .zip and view/extract the content with your favorite compression tool.
The performance gain resulting from the use of native x86 code compared to the use of the Binary Translator obviously depends on the type of app, the used features and furthermore on the version of the Binary Translator. To get a better feeling we did some simple benchmark testing with the Murl Engine. Please note that this simple tests are not suited to deduce a general conclusion about performance gain you would see in production code. Hence, you may wish to do your own testing.
An Asus Memo Pad FHD 10 was used as test device, which was generously lent to us by Intel. The tablet is equipped with a dual core 1.6 GHz Intel® Atom™ Z2560 CPU with an integrated PowerVR SGX544 GPU and has a 10.1 inch WUXGA display with a resolution of 1920 x 1200 pixel.
The test results with the Murl Engine show that on average the armeabi-v7a code runs 1.6 times slower and armeabi code runs 2.5 times slower than native x86 code. Detailed information about the performed tests can be found below.
The additional x86 files will of course increase the overall size of the APK file.
If the app size is a critical factor, you may want to consider splitting the app into individual APK files for every cpu architecture.
When doing so, please note that the version code of the x86 APK needs to be greater than the version code of the ARM APK
(parameter MURL_ANDROID_VERSION_CODE
in the common Make file).
x86 version code > armeabi-v7a version code > armeabi version code
Google Play will serve the compatible APK with the highest version number. Further information can be found in section Multiple APK Support of the Android™ developer documentation.
An Asus Memo Pad FHD 10 has been used to execute the tests. The values reflect the needed processing time. Hence greater values are worse than lesser values.
Summary
x86 | armeabi-v7a | armeabi | |
---|---|---|---|
GenerateData | 100% | 150% | 249% |
Calc UInt32 | 100% | 190% | 239% |
Sort Array | 100% | 174% | 208% |
Calc Pi | 100% | 149% | 367% |
Scenegraph | 100% | 131% | 180% |
GenerateData
Create 20,000,000 random values and store them in three initial empty containers (UInt32Array, FloatArray, DoubleArray).
Util::TT800 rng(42); UInt32Array uInt32Array; FloatArray floatArray; DoubleArray doubleArray; for (UInt32 i = 0; i < mMax; i++) { UInt32 val = rng.Rand(); uInt32Array.Add(val); floatArray.Add(Float(val)); doubleArray.Add(Double(val)); }
t [ms] | x86 | armeabi-v7a | armeabi |
---|---|---|---|
average value | 5837 | 8728 | 14517 |
relative standard deviation | 0.99% | 0.79% | 1.79% |
relative difference | 100% | 150% | 249% |
Calc UInt32
Calculate a UInt32 value from the 20,000,000 randomly generated values in the container.
UInt32 a = 0; UInt32 lastIndex = uInt32Array.GetCount() - 1; for (UInt32 i = 0; i < lastIndex; i++) { a += (uInt32Array[lastIndex-i] * uInt32Array[i]) / 2147483648; }
t [ms] | x86 | armeabi-v7a | armeabi |
---|---|---|---|
average value | 130 | 247 | 310 |
relative standard deviation | 0.00% | 2.34% | 0.00% |
relative difference | 100% | 190% | 238% |
Sort Array
Sort a UInt32Array with 2,000,000 random numbers using the quicksort algorithm.
Util::SortArray(uInt32Array, false);
t [ms] | x86 | armeabi-v7a | armeabi |
---|---|---|---|
average value | 1581 | 2753 | 3282 |
relative standard deviation | 0.46% | 0.76% | 1.09% |
relative difference | 100% | 174% | 208% |
Calc PI
Calculate the number Pi using the Leibniz formula with 40,000,000 summands.
Double quaterpi = 1; UInt32 divisor = 3; for (UInt32 i=0; i < mMax; i++) { quaterpi -= Double(1) / divisor; divisor += 2; quaterpi += Double(1) / divisor; divisor += 2; }
t [ms] | x86 | armeabi-v7a | armeabi |
---|---|---|---|
average value | 1933 | 2883 | 7093 |
relative standard deviation | 0.05% | 0.14% | 0.08% |
relative difference | 100% | 149% | 367% |
Scenegraph
Process a scene graph with 20,000 sprite objects which will be rendered on random positions.
SInt32 widthX = (state->GetAppConfiguration()->GetDisplaySurfaceSizeX() - 64) / 2; SInt32 widthY = (state->GetAppConfiguration()->GetDisplaySurfaceSizeY() - 64) / 2; Graph::IRoot* root = state->GetGraphRoot(); const Graph::INodeArray& spriteList = mSpriteGroup->GetChildren(); UInt32 count = spriteList.GetCount(); Util::TT800 rng; for (UInt32 i = 0; i < count; i++) { Graph::ITransform* node = (dynamic_cast<Graph::IPlaneGeometry*>(spriteList[i]))->GetTransformInterface(); node->SetPosition(rng.RandSInt(-widthX, widthX),rng.RandSInt(-widthY, widthY),0); }
t [ms] | x86 | armeabi-v7a | armeabi |
---|---|---|---|
average value | 129.1 | 169. | 233.0 |
relative standard deviation | 2.45% | 1.05% | 2.00% |
relative difference | 100% | 131% | 180% |
The new Murl Engine Build 1.00.4820Beta is available for download. This is a bug fix release.
Unfortunately there was a nasty bug in the last release which prevents a proper button detection if multiple cameras are used in an unordered way. The new release fixes this bug.
API Changes:
Resource::IShader
interface to allow for shaders of multiple
types and languages to be present in a single resource. Existing methods
take an additional shaderIndex
parameter to query a specific shader.
IEnums::ShaderLanguageVersion
enumeration, which was merged
into IEnums::ShaderLanguage
.
Graph::IShader
interface to allow returning video shader
objects based on type (fragment/vertex), if present. Changed the
Graph::Shader
class to allow referencing shader resources containing
both vertex and fragment shaders, and Graph::ShaderProgram
to allow
for referencing such a shader node via the common shaderId
attribute.
New Features:
Graph::IShader
and Graph::IProgram
, used in case a shader/program fails to compile or link.
Improvements:
Addons::Lua::IAddon
Added GetGlobal()
, SetGlobal()
methods
to enable data exchange from C++ to Lua and vice versa.
Fixes:
MURL_MODULE_PREBIULT_LIB_...
to MURL_MODULE_PREBUILT_LIB_...
Graph::Button
nodes with respect to
multiple cameras/input projections
For an detailed overview on what's new, please read the change log.
As always, if you encounter difficulties, find a bug or want to discuss development issues, head over to the Forum.
]]>The new Murl Engine Build 1.00.4754Beta is available for download.
Release Highlights:
For an detailed overview on what's new, please read the change log.
Please notice the following API changes:
Murl::IApp
class interface: Added 2nd parameter to
Configure(IEngineConfiguration* engineConfig, IFileInterface* fileInterface)
Murl::Logic::IState
class interface:
Renamed GetRecentTickDuration()
to GetCurrentTickDuration()
Murl::Logic::BaseProcessor
class interface:
Renamed GetEngineProcessor()
to GetProcessor()
Murl::ILoader
class interface: Added overload for
AddPackage()
with 3 parameters only.
Murl::Logic
interfaces:
typedef SharedPointer<GraphSoundObject> GraphSoundObjectPtr;
typedef SharedPointer<IAppGraph> IAppGraphPtr;
typedef SharedPointer<IAppProcessor> IAppProcessorPtr;
typedef SharedPointer<IAppStage> IAppStagePtr;
typedef SharedPointer<IAppStepable> IAppStepablePtr;
typedef SharedPointer<IAppTimeline> IAppTimelinePtr;
typedef SharedPointer<INodeObserver> INodeObserverPtr;
typedef SharedPointer<IObservableNode> IObservableNodePtr;
typedef SharedPointer<IProcessor> IProcessorPtr;
typedef SharedPointer<IStage> IStagePtr;
typedef SharedPointer<IStageProcessor> IStageProcessorPtr;
typedef SharedPointer<IStageTimeline> IStageTimelinePtr;
typedef SharedPointer<IStepable> IStepablePtr;
typedef SharedPointer<IStepableObserver> IStepableObserverPtr;
typedef SharedPointer<ITimeframe> ITimeframePtr;
typedef SharedPointer<ITimeline> ITimelinePtr;
typedef SharedPointer<ITouchArea> ITouchAreaPtr;
typedef SharedPointer<SoundFader> SoundFaderPtr;
Changed several interfaces to accept shared pointers instead of raw pointers.
To adjust existing code simply replace all *
by Ptr
,
e.g. IProcessor*
to IProcessorPtr
.
murl_addons_[name]_factory.h
, murl_addons_[name]_i_addon.h
.
Murl::Addons::[name]::Factory
, Murl::Addons::[name]::IAddon
.
Murl::Addons
interfaces:typedef SharedPointer<IAddon> IAddonPtr;
for namespace Murl::Addons::Facebook
,
Murl::Addons::Filepanel
, Murl::Addons::Openmax
and Murl::Addons::Vuforia
.
To adjust existing code simply replace all *
by Ptr
,
e.g. Addons::Facebook::IAddon*
to Addons::Facebook::IAddonPtr
.
Murl::IAppAddonRegistry
class interface methods to accept
IAddonPtr
shared pointers only.
Vuforia::DataSet
to Vuforia::Graph::DataSet
murl_logic_graph_sound_fader.h
to murl_logic_sound_fader.h
Murl::Util
to Murl::Math
namespace:
Abs()
, Min()
, Max()
, Clamp()
and IsEqual()
.
Murl::Util
string conversion methods StringToDouble()
and
StringToFloat()
to locale independent comma separator .
.
Murl::Enum
class interface: Changed GetEnumValue()
to
GetEnumValueByName()
, GetEnumName()
to GetEnumNameByValue()
, and
IsEnumAvailable()
to IsEnumValueAvailable()
. Added methods to query
values/names by index.
murl_enum.h
Graph::INode::AddController()
and related methods). In addition to specifying a single node controller
by e.g. controller.animationResourceId="..."
, it is possible to create
multiple controllers via XML by defining a trailing index after the
"controller" attribute part, e.g. controller.0.animationResourceId="..."
and controller.1.scriptResourceId="..."
As always, if you encounter difficulties, find a bug or want to discuss development issues, head over to the Forum.
]]>Since build version 1.00.3970Beta a first version of the Murl Engine tool "Dashboard" is provided.
The Dashboard is a tool to simplify the process of creating and maintaining project files across different platforms and provides some further helpful functions.
The command new project can be used to create a new Murl Engine project with the familiar directory structure and with project files for all supported platforms.
By using open IDE you can open the project in your favored IDE and immediately start your development.
If desired you can also directly start the Resource Packer tool to create resource packages from all the resource files in the individual *.murlres directories.
The update project feature updates all project files (Visual Studio 2008, Visual Studio 2010, Xcode iOS, Xcode OSX, Android ...) by automatically adding new source files and removing not existing ones.
The Android build command offers a fast and convenient method to create and test a Android build. After the build has finished, the final App will be automatically installed and started on a connected Android device. The creation of a signing key for release builds is also supported.
The tool can be found in the directory Dashboard.app in the Murl Engine package. A separate installation is not necessary. The only prerequisite is an installed Java runtime environment.
Further information can be found in the section Dashboard in the User's Guide documentation.
]]>Finally the long overdue Murl Engine Build 1.00.3970Beta is available.
The new version contains a lot of new and revised features which will be described in detail in subsequent news posts and tutorials. For an overview on what's new, please read the change log.
Please notice the API changes:
Graph::ISound
to Graph::IAudioSource
and Resource::ISound
to Resource::IAudio
. Graph::Sound
is still available, but deprecated. Use Graph::AudioSource
instead.IJoystick
to IGameController
interface, and related interfaces*pass*
" methods to "*stage*
" in Graph::IMaterial
etc.Graph::IController
to multiple different interfacesAs always, if you encounter difficulties, find a bug or want to discuss development issues, head over to the Forum.
]]>The event series Styrian Marketplace presented by the section UBIT presents innovative styrian products and services to a broad audience. On the upcoming event on October 22th Spraylight will present their award winning multimedia framework "Murl Engine". Further information also about other company presentations can be found on the event website.
Every company will present their product or service for about 15 minutes. Afterwards the presenters will be available for further discussions. Refreshments will be served.
Event Details:
For administrative reasons please register either online or with a email to office@ubit-stmk.at. The participation is free.
]]>For detailed info on what's new, please read the change log.
Please notice the API changes:
swappable
attribute for Graph::Node
to deprecated, introduced enableAutomaticSwapping
and enableManualSwapping
insteadCreateDecodedData()
and DestroyDecodedData()
to Prepare/Finish for IAudioStream and IVideoStreamSystem::Semaphore::Wait()
System::Time::Now()
to System::Time::GetNow()
, removed Since()
method and added GetTickCount()
mesh_converter to scene_converter
, introduced XML config files to improve automation of scene conversionAs always, if you encounter difficulties, find a bug or want to discuss development issues, head over to the Forum.
]]>Just as in the last four years, the Game Developers Conference™ Europe (GDC Europe) and the gamescom are again taking place as a common tandem event in Cologne, Germany. The GDC Europe, as the largest professionals-only developer conference in Europe, and the gamescom, as the largest European trade fair for interactive games and entertainment, are the most important events for gamers and game developers in Europe.
This year, the GDC Europe is held from August 19–21, 2013 in the Congress-Center Ost Koelnmesse in Cologne. The gamescom is taking place from August 21–25, 2013 at the same location. The business area, however, will only be open until August 23.
We will attend the GDC and this year we will have our own stand within the business area at gamescom, where we will present our latest games and demos. So, just swing by, have a look at our work and we will be happy to answer you any questions you might have. Of course you can also arrange a meeting with us at the GDC beforehand – contact us at office(at)murlengine.com. Our stand is located at the Austrian Pavilion within the business area, hall 4.2, stand B043-C042.
We are looking forward to seeing you there!
]]>For detailed info on what's new, please read the change log.
In addition to the new build the API reference is now provided as downloadable offline document as well:
As always, if you encounter difficulties, find a bug or want to discuss development issues, head over to the Forum.
]]>Spraylight and the project Murl Engine is one of the top five nominees in the category “standard software and cloud services” of the Constantinus Award 2013, Austria’s big IT and consulting award. A prominent panel of representatives from economy and media selected the nominees out of 144 entries total.
The announcement of the winner and the awarding of the price will take place during a glamorous award gala, which this year will be held at the Congress-Schladming in Styria. Also all nominated projects will be shown on presentation boards at the “Walk of Fame”. To receive a nomination to the Constantinus Award is already a great honor.
We also made a respectable Top 10 rank in the Audience Award but unfortunately we did not made it into the top 3 nominees. Nevertheless we want to thank you all for your support and your votes! Keep your fingers crossed for the awards ceremony on June 13.
]]>For detailed info on what's new, please read the change log.
As always, if you encounter difficulties, find a bug or want to discuss development issues, head over to the Forum.
]]>Among other improvements the Murl Engine now also supports Truetype and OpenType font rendering (in addition to the bitmap font rendering and the system font rendering). A detailed list of all changes can be found in the change log.
Please notice the API changes:
Murl::ISystemFont
to Murl::IFont
Graph::TextGeometry
and FlatTextTexture
,
and moved all respective methods to Graph::IFont
interface:systemFontId
","fontId
" -> "systemFontName
"systemFontSize
" -> "fontSize
"systemFontTextColor
" -> "textColor
"systemFontBackgroundColor
" -> "backgroundColor
"You should perform a search&replace operation on your user code in order to incorporate these changes.
As always, if you encounter difficulties, find a bug or want to discuss development issues, head over to the Forum.
]]>Please notice the following API changes:
Step()
/OnStep()
methods to ProcessTick()
/OnProcessTick()
in ALL locic interfaces and classes.Animate()
/OnAnimate()
methods to ProcessFrame()
/OnProcessFrame()
in ALL locic interfaces and classes.Identity()
to SetIdentity()
for Math::Matrix
.Minimum()
/Maximum()
/MinimumSelf()
/MaximumSelf()
to Min()
/Max()
/MinSelf()
/MaxSelf()
for Math::Vector
.Length()
/LengthSquared()
to GetLength()
/GetSquaredLength()
for Math::Vector
.GetLocalEventVelocity()
and GetLocalEventAcceleration()
for Graph::IButton
.GetLocalVelocity()
and GetLocalAcceleration()
for Graph::IMultiTouchable
.Graph::IButton::GetLocalEventDelta()
.Graph::IMultiTouchable::GetLocalDelta()
.You should perform a search&replace operation on your user code in order to incorporate these changes. A detailed list of all changes can be found in the change log.
We also included the project files and source code files of the tutorials into the murl package for your convenience. A separate download of the tutorials is no longer necessary.
As always, if you encounter difficulties, find a bug or want to discuss development issues, head over to the Forum.
]]>A detailed list about all changes can be found in the change log.
In addition we added several new chapters to the user's guide and adapted the style sheets from the support section for better readability.
As always, if you encounter difficulties, find a bug or want to discuss development issues, head over to the Forum.
]]>The 600 MByte sized package is made up of about 260,000 beautiful aligned lines of code (counted without comments and blank lines) and about 100 kg coffee as binder. The package is waiting to empower your ideas.
We are still in beta, so please be gentle if you find a bug on our website or in the framework. If you find a bug we would appreciate if you report the issue into our forum.
Have fun!
]]>