Der neue Murl Engine Build 2023.2b steht zum Download bereit.
Bug Fixes
Alle Änderungen können auch im Change Log gefunden werden.
Abschließend noch unser obligatorischer Hinweis: Wenn du Schwierigkeiten mit dem Build hast, einen Bug findest oder sonstige entwicklungsrelevante Themen diskutieren möchtest, verwende unseren Bug Tracker oder schreibe uns ein Email.
]]>Der neue Murl Engine Build 2023.2a steht zum Download bereit.
Bug Fixes
Alle Änderungen können auch im Change Log gefunden werden.
Abschließend noch unser obligatorischer Hinweis: Wenn du Schwierigkeiten mit dem Build hast, einen Bug findest oder sonstige entwicklungsrelevante Themen diskutieren möchtest, verwende unseren Bug Tracker oder schreibe uns ein Email.
]]>Der neue Murl Engine Build 2023.2 steht zum Download bereit.
Build Environment
Bug Fixes
General
Werkbank
Alle Änderungen können auch im Change Log gefunden werden.
Abschließend noch unser obligatorischer Hinweis: Wenn du Schwierigkeiten mit dem Build hast, einen Bug findest oder sonstige entwicklungsrelevante Themen diskutieren möchtest, verwende unseren Bug Tracker oder schreibe uns ein Email.
]]>Der neue Murl Engine Build 2023.1 steht zum Download bereit.
Build Environment
Improvements
IEnums::LANGUAGE_ARABIC
Bug Fixes
Alle Änderungen können auch im Change Log gefunden werden.
Abschließend noch unser obligatorischer Hinweis: Wenn du Schwierigkeiten mit dem Build hast, einen Bug findest oder sonstige entwicklungsrelevante Themen diskutieren möchtest, verwende unseren Bug Tracker oder schreibe uns ein Email.
]]>Der neue Murl Engine Build 2022.1 steht zum Download bereit.
Build Environment
Improvements
Murl::Array
and Murl::String
Bug Fixes
Alle Änderungen können auch im Change Log gefunden werden.
Abschließend noch unser obligatorischer Hinweis: Wenn du Schwierigkeiten mit dem Build hast, einen Bug findest oder sonstige entwicklungsrelevante Themen diskutieren möchtest, verwende unseren Bug Tracker oder schreibe uns ein Email.
]]>Der neue Murl Engine Build 2022.1 steht zum Download bereit.
Build Environment
General
New Features
Improvements
Bug Fixes
<= 0
ANR: IabHelper$a.onServiceConnected<>
Graph::Aligner
not visible under certain circumstances
MurlGLThread.RequestExitAndWait
Alle Änderungen können auch im Change Log gefunden werden.
Abschließend noch unser obligatorischer Hinweis: Wenn du Schwierigkeiten mit dem Build hast, einen Bug findest oder sonstige entwicklungsrelevante Themen diskutieren möchtest, verwende unseren Bug Tracker oder schreibe uns ein Email.
]]>Der neue Murl Engine Build 2021.2 steht zum Download bereit.
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
Alle Änderungen können auch im Change Log gefunden werden.
Abschließend noch unser obligatorischer Hinweis: Wenn du Schwierigkeiten mit dem Build hast, einen Bug findest oder sonstige entwicklungsrelevante Themen diskutieren möchtest, verwende unseren Bug Tracker oder schreibe uns ein Email.
]]>Der neue Murl Engine Build 2021.1 steht zum Download bereit.
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
)
Alle Änderungen können auch im Change Log gefunden werden.
Abschließend noch unser obligatorischer Hinweis: Wenn du Schwierigkeiten mit dem Build hast, einen Bug findest oder sonstige entwicklungsrelevante Themen diskutieren möchtest, verwende unser Forum.
]]>Der neue Murl Engine Build 2020.2 steht zum Download bereit.
Build Environment:
New Features:
API Changes:
Murl::IUrlRequest
Improvements:
std::make_shared
analog for Murl::SharedPointer
.
Bug Fixes:
Alle Änderungen können auch im Change Log gefunden werden.
Abschließend noch unser obligatorischer Hinweis: Wenn du Schwierigkeiten mit dem Build hast, einen Bug findest oder sonstige entwicklungsrelevante Themen diskutieren möchtest, verwende unser Forum.
]]>Der neue Murl Engine Build 2020.1 steht zum Download bereit.
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
Alle Änderungen können auch im Change Log gefunden werden.
Abschließend noch unser obligatorischer Hinweis: Wenn du Schwierigkeiten mit dem Build hast, einen Bug findest oder sonstige entwicklungsrelevante Themen diskutieren möchtest, verwende unser Forum.
]]>Der neue Murl Engine Build 2019.2 steht zum Download bereit.
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
Alle Änderungen können auch im Change Log gefunden werden.
Abschließend noch unser obligatorischer Hinweis: Wenn du Schwierigkeiten mit dem Build hast, einen Bug findest oder sonstige entwicklungsrelevante Themen diskutieren möchtest, verwende unser Forum.
]]>Der neue Murl Engine Build 2019.1.7666 steht zum Download bereit.
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
Alle Änderungen können auch im Change Log gefunden werden.
Abschließend noch unser obligatorischer Hinweis: Wenn du Schwierigkeiten mit dem Build hast, einen Bug findest oder sonstige entwicklungsrelevante Themen diskutieren möchtest, verwende unser Forum.
]]>Der neue Murl Engine Build 2018.3.7623 steht zum Download bereit.
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
Alle Änderungen können auch im Change Log gefunden werden.
Abschließend noch unser obligatorischer Hinweis: Wenn du Schwierigkeiten mit dem Build hast, einen Bug findest oder sonstige entwicklungsrelevante Themen diskutieren möchtest, verwende unser Forum.
]]>Der neue Murl Engine Build 2018.2.7478 steht zum Download bereit.
Build Environment:
New Features:
Bug Fixes:
MurlGLView.onApplyWindowInsets()
GetKeys()
behavior in IKeyboardDevice on Android
Platform::Android::KeyboardControl::SetText()
method
Alle Änderungen können auch im Change Log gefunden werden.
Abschließend noch unser obligatorischer Hinweis: Wenn du Schwierigkeiten mit dem Build hast, einen Bug findest oder sonstige entwicklungsrelevante Themen diskutieren möchtest, verwende unser Forum.
]]>Der neue Murl Engine Build 2018.1.7420 steht zum Download bereit.
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
Alle Änderungen können auch im Change Log gefunden werden.
Abschließend noch unser obligatorischer Hinweis: Wenn du Schwierigkeiten mit dem Build hast, einen Bug findest oder sonstige entwicklungsrelevante Themen diskutieren möchtest, verwende unser Forum.
]]>Der neue Murl Engine Build 1.00.6944Beta steht zum Download bereit.
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 Änderungen:
Die sourceSets und Amazon lib Abhängigkeiten in der build.gradle Datei müssen angepasst werden:
Von:
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/*' } }
auf:
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' } }
und von:
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') } }
auf:
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') } }
Alle Änderungen können auch im Change Log gefunden werden.
Abschließend noch unser obligatorischer Hinweis: Wenn du Schwierigkeiten mit dem Build hast, einen Bug findest oder sonstige entwicklungsrelevante Themen diskutieren möchtest, verwende unser Forum.
]]>Der neue Murl Engine Build 1.00.6747Beta steht zum Download bereit.
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
Alle Änderungen können auch im Change Log gefunden werden.
Abschließend noch unser obligatorischer Hinweis: Wenn du Schwierigkeiten mit dem Build hast, einen Bug findest oder sonstige entwicklungsrelevante Themen diskutieren möchtest, verwende unser Forum.
]]>Der neue Murl Engine Build 1.00.6708Beta steht zum Download bereit.
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:
Alle Änderungen können auch im Change Log gefunden werden.
Abschließend noch unser obligatorischer Hinweis: Wenn du Schwierigkeiten mit dem Build hast, einen Bug findest oder sonstige entwicklungsrelevante Themen diskutieren möchtest, verwende unser Forum.
]]>Der neue Murl Engine Build 1.00.6624Beta steht zum Download bereit. Ein separater iOS Build für das Base-SDK 8.4 und Deployment Target 5.0 (Xcode 6.4, C99 / C++98) wurde hinzugefügt. Update auf Android NDK 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()
Alle Änderungen können auch im Change Log gefunden werden.
Abschließend noch unser obligatorischer Hinweis: Wenn du Schwierigkeiten mit dem Build hast, einen Bug findest oder sonstige entwicklungsrelevante Themen diskutieren möchtest, verwende unser Forum.
]]>Der neue Murl Engine Build 1.00.6529Beta steht zum Download bereit. Dieser Release beinhaltet unter anderem standardmäßigen Support für C++11 und das neue Android NDK 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.
Alle Änderungen können auch im Change Log gefunden werden.
Abschließend noch unser obligatorischer Hinweis: Wenn du Schwierigkeiten mit dem Build hast, einen Bug findest oder sonstige entwicklungsrelevante Themen diskutieren möchtest, verwende unser Forum.
]]>Der neue Murl Engine Build 1.00.6405Beta steht zum Download bereit. Das Update bringt Unterstützung für Android Studio sowie zahlreiche Verbesserungen und Fixes.
Android
Android builds können jetzt auch mit der Android Studio IDE und Gradle erstellt werden. Das Android NDK wurde auf Version r11c upgedated und die Build-Toolchain von GCC auf Clang umgestellt. GCC wird seit Version 11 als "deprecated" eingstuft und Clang ist offiziell die neue NDK Build-Toolchain. Daher haben wir auch die Murl Engine Skripte mit diesem Release auf Clang umgestellt. Bei Problemen mit Clang, kannst du Bugs in der offiziellen NDK bug database eintragen. Mehr Details zur Unterstützung von Android Studio folgen in einem eigenen 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
Alle Änderungen können auch im Change Log gefunden werden.
Abschließend noch unser obligatorischer Hinweis: Wenn du Schwierigkeiten mit dem Build hast, einen Bug findest oder sonstige entwicklungsrelevante Themen diskutieren möchtest, verwende unser Forum.
]]>Der neue Murl Engine Build 1.00.6320Beta steht zum Download bereit. Das Update bringt Unterstützung für Visual Studio 2015 sowie zahlreiche Verbesserungen und Fixes. Bitte beachte die Änderungen beim Visual Studio Deployment.
Visual Studio 2015
Unterstützung für die Visual Studio 2015 IDE wurde hinzugefügt. Um die Größe des Download-Pakets in einem vernünftigen Rahmen zu halten, werden beginnend mit diesem Release nur mehr die Bibliotheken der aktuellsten Visual Studio Version in das Archiv gepackt. Daher beinhaltet das Download-Paket nur Visual Studio Bibliotheken für Visual Studio 2015. Wir unterstützen weiterhin Visual Studio 2008, 2010 und 2013, allerdings werden standardmäßig keine libs für diese Versionen ausgeliefert. Wenn du mit einer älteren Visual Studio Version arbeiten möchtest, kontaktiere uns bitte über das Forum oder schreib uns eine Email und wir stellen dir einen separaten Download-Link zur Verfügung.
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
Alle Änderungen können auch im Change Log gefunden werden.
Abschließend noch unser obligatorischer Hinweis: Wenn du Schwierigkeiten mit dem Build hast, einen Bug findest oder sonstige entwicklungsrelevante Themen diskutieren möchtest, verwende unser Forum.
]]>Zwei neue Murl Engine Tutorials sind verfügbar. In den Tutorials zeigen wir, wie das Featuer-Set der Murl Engine mit einer eigenen "Custom Control" Klasse erweitert werden kann. Beide Tutorials kannst du in Kapitel 4 der Tutorials Sektion finden.
Sollte ein benötigtes Plattform-Feature von der Murl Engine nicht angeboten werden, so kann dies in einem Custom-Control implementiert werden. Tutorial #00: Custom Control zeigt mit einem einfachen Beispiel, wie eigene Controls implementiert werden können. Das zweite Tutorial, Tutorial #01: Flurry Control, zeigt wie der Analysedienst Flurry Analytics als Custom Control in dein Projekt integriert werden kann.
]]>Der neue Murl Engine Build 1.00.6143Beta steht zum Download bereit. Dieses Update bringt tvOS als neue Plattform sowie zahlreichen Verbesserungen und Fixes.
Die wichtigsten Neuerungen sind:
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
Alle Änderungen können auch im Change Log gefunden werden.
Abschließend noch unser obligatorischer Hinweis: Wenn du Schwierigkeiten mit dem Build hast, einen Bug findest oder sonstige entwicklungsrelevante Themen diskutieren möchtest, verwende unser Forum.
]]>Auch heuer findet wieder die GameStage Expo in der Tabakfabrik Linz statt. Auch wir sind mit einem eigenen Stand vertreten und werden neben der Murl Engine auch die neuesten Spiele und Demos präsentieren. Also schaut vorbei!
Die Veranstaltung findet vom 9. bis zum 11. Oktober in der Lösehalle und der Étage Lumière der Tabakfabrik Linz statt. Virtual Reality und 3D-Technologie sind das diesjährige Schwerpunktsthema. Zusätzlich zur Spielemesse gibt es an jedem Tag ein spezielles Zusatzprogramm.
Veranstaltungsdetails:
Weitere Infos gibt es auf der offiziellen Webseite.
]]>Murl Tools, eine open-source Visual-Studio-Extension für VS2013 & VS2015 wurde veröffentlicht. Die Extension fügt dem Solution-Explorer einige nützliche Befehle hinzu und wurde erstellt, um den Workflow mit Murl Engine Projekten zu verbessern. Die Murl Tools Extension ist aber für jedes cross-plattform VisualC/C++ Projekt nützlich, bei dem die Quelldateien nicht innerhalb des Projektverzeichnisses gespeichert werden.
Die Murl Tools Extension fügt folgende Befehle dem Kontextmenü des Solution Explorer hinzu:
Duplicate File(s)
Um eine Kopie einer existierenden Datei im Solution Explorer zu erstellen, wird normalerweise die Datei selektiert und mit CTRL-C und CTRL-V kopiert. Während das problemlos für C# oder VB-Projekte funktioniert, geht das bei VisualC/C++ Projekten nicht.
Die Extension fügte dem Kontextmenü des Solution Explorer den Befehl Duplicate hinzu. Der Befehl erzeugt eine Kopie der selektierten Datei und fügt die neue Datei dem Projekt innerhalb desselben Filters hinzu.
Duplicate screenshot
Randnotiz: Wenn du das CTRL-C / CTRL-V Feature in Visual Studio haben möchtest, kannst du hier dafür abstimmen.
Refresh Folder
Dieser Befehl fügt fehlende Referenzen für Dateien hinzu, die im Verzeichnis (Filesystem) existieren aber nicht im selektierten Filter (Projekt). Beachte, dass dieser Befehl nur dann Sinn macht, wenn die Filter-Hierarchie im Projekt und die Verzeichnis-Hierarchie im Filesystem übereinstimmen.
Refresh Screenshot
Remove/Delete Dialog
Wenn eine oder mehrere Dateien eines VisualC/C++ Projekts im Solution Explorer selektiert sind und dann die Entfernen-Taste gedrückt wird, erscheint normalerweise ein Remove/Delete Dialog. Damit kann entschieden werden, ob lediglich die Datei-Referenz im Projekt entfernt werden soll oder ob die Datei permanent im Filesystem gelöscht werden soll.
Leider wird dieser Dialog nur angezeigt, wenn die selektierten Dateien im Projektverzeichnis gespeichert sind, was z.B. bei cross-plattform Projekten, wo sich mehrere Projekte die selben Quelldaten teilen, nicht der Fall ist.
Die Extension korrigiert dieses eigenartige Verhalten und zeigt immer einen Remove/Delete Dialog an.
Remove/Delete dialog screenshot
Randnotiz: Wenn du möchtest, dass dieses Problem in Visual Studio behoben wird, kannst du hier dafür abstimmen.
Die Murl Tools Extension ist unter der open source MIT License (MIT) lizensiert. Der Quellcode ist auf GitHub gehosted.
]]>Der neue Murl Engine Build 1.00.5880Beta steht zum Download bereit. Das ist ein normaler Update Release mit zahlreichen Verbesserungen und 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.
Alle Änderungen können auch im Change Log gefunden werden.
Abschließend noch unser obligatorischer Hinweis: Wenn du Schwierigkeiten mit dem Build hast, einen Bug findest oder sonstige entwicklungsrelevante Themen diskutieren möchtest, verwende unser Forum.
]]>Das Erstellen von Murl Engine XML-Dateien kann manchmal etwas langwierig sein, speziell für Anfänger, die mit dem Syntax noch nicht vertraut sind. Um den Umgang zu vereinfachen, stellen wir nun ein komplettes XML Schema bereit, das die Beschreibung für all XML-Tags und Attribute beinhaltet. In Kombination mit einer geeigneten IDE profitieren Nutzer von allen "Intellisense" Code/Content-Assist Goodies wie automatischer Code-Vervollständigung, kontextabhängigen Auswahllisten, Tipps, Code-Validierung und Fehlerhervorhebung.
XSD Datei
Ein XML Schema (auch XSD, kurz für XML Schema Definition) beschreibt die Struktur eines XML-Dokuments und kann verwendet werden, um Regeln festzulegen, die ein gültiges XML-Dokument einhalten muss. XSD ist eine Empfehlung des W3C und wird von vielen IDEs und XML-Editoren unterstützt. Ein gutes Einstiegs-Tutorial zum Thema gibt es hier: www.w3schools.com/schema/
Wir stellen nun eine XSD-Datei (murl_graph_nodes.xsd
) zur Verfügung, welche die Struktur aller Murl Engine XML Ressource und Konfigurations Dateien beschreibt:
Die XSD-Datei wird als Teil der Murl Engine bei allen zukünftigen Versionen mit ausgeliefert und ist dann im Verzeichnis murl/common/xsd/
zu finden.
Bis zum nächsten Release kann die Datei auch von hier heruntergeladen werden.
Alle Entitys der XSD-Datei sind im Namensbereich https://murlengine.com
definiert.
Vorteile
Wenn die verwendete IDE einen XML-Editor mit XSD Unterstützung beinhaltet, profitieren Nutzer von der automatischen Code-Vervollständigung und Code-Validierung. Zur Veranschaulichung erstellen wir ein kleines Beispiel in Visual Studio.
Wir erzeugen eine XML Animation Resource Datei und starten ein neues Element mit dem <
Zeichen.
Der Editor zeigt automatisch eine Liste mit allen möglichen Elementen, die in einer XML Animation Resource Datei erlaubt sind.
Kontextabhängige Element Liste
Wenn wir ein Element in der Liste auswählen, werden daneben weitere Informationen über dieses Element angezeigt.
Info Overlay
Wir wählen das gewünschte Element aus und bekommen sofort eine Liste mit allen Attributen, die in diesem Element erlaub sind; wieder mit Tipps in einem eigenen Overlay-Fenster daneben.
Die gewellte Linie unter dem Element PositionKey
erinnert uns daran, dass bisher noch nicht alle erforderlichen Attribute für das Element definiert wurden.
Attributs-Liste mit Info Overlay
Wir wählen das gewünschte Attribut. Wenn sich die möglichen Attribut-Werte aus einer Liste von festen Werten zusammensetzen, wie beispielsweise bei Enumerationen, kann der gewünschte Wert bequem aus einer Auswahlliste gewählt werden.
Auswahlliste für Enumerations-Werte
Für andere Werte gibt es eine einfache Syntaxüberprüfung.
Im Beispiel wurde der Winkel mit 90 Grad angegeben, allerdings wurde die Endung deg
bzw. d
vergessen.
Visual Studio erinnert uns daran, dass dieser Wert gemäß der XSD-Datei nicht gültig ist und zeichnet daher eine gewellte Linie unter den Wert.
Syntaxüberprüfung für Werte
Wenn wir die Endung d
anhängen, erhalten wir ein Dokument welches die XSD Validierung besteht und die gewellte Linie verschwindet.
XSD Validierung OK
Installation
Üblicherweise sind zwei Schritte notwendig, um eine XSD basierte Unterstützung (Content-Assist) nutzen zu können.
Schritt zwei wird normalerweise durch Spezifizierung des Namensbereichs im Wurzel-Element erledigt. Dafür dient das Attribut xmlns
.
<Graph xmlns="https://murlengine.com"/> ... </Graph>
Schritt eins ist abhängig vom jeweiligen XML Editor.
Visual Studio
Der einfachste Weg in Visual Studio ist das Hinzufügen der XSD-Datei zur Solution. Die XSD-Datei muss auch noch vom Build ausgeschlossen werden (Properties > Exclude from Build).
Visual Studio Solution Explorer
Damit steht die XML Content-Assist Funktion in Visual Studio zur Verfügung.
Hinweis: Zukünftige Versionen des Dashboards werden für neue Projekte automatisch eine Referenz auf die XSD-Datei anlegen.
Eclipse
Eclipse bietet ebenfalls einen mächtigen XML Editor mit XSD-Unterstützung. Wenn dieser nicht installiert ist, kann er einfach nachinstalliert werden:
Um die XSD-Datei zu Eclipse hinzuzufügen, sind folgende Schritte notwendig:
Damit sollte die XML Content-Assist Funktion auch in Eclipse zur Verfügung stehen.
Eclipse XML Editor
Hinweis: Drücke STRG-LEERTASTE
, wenn das Ovelay nicht automatisch aufscheint.
IntelliJ IDEA
Intellij IDEA verfügt ebenfalls über einen XML Editor mit XSD Unterstützung. Um die XSD-Datei hinzuzufügen, sind folgende Schritte notwendig:
+
Button)Damit sollte die XML Content-Assist Funktion auch mit Intellij IDEA funktionieren.
Intellij IDEA XML Editor
Für andere IDEs und XML-Editoren ist die Vorgangsweise ähnlich.
Hinweis: Xcode bietet lediglich notdürftige Unterstützung für XML-Dateien und bietet keine Unterstützung für XSD-Validierung. Daher muss auf Eclipse oder einen anderen geeigneten XML-Editor zurückgegriffen werden, um eine XSD basierte Content-Assist Funktion am Mac nutzen zu können.
]]>Ein neues Multithreading Tutorial ist verfügbar. Du kannst das Tutorial #15: Multithreading im Kapitel 1 der Tutorials Sektion finden.
Wenn mehrere, nebenläufige Threads gleichzeitig ausgeführt werden, spricht man von Multithreading.
Normalerweise besteht keine Notwendigkeit eigene Threads zu erzeugen.
Wenn aber doch einmal eine längere Berechnung im Hintergrund ausgeführt werden soll, kann dafür mit der Klasse System::Thread
ein eigener Thread aufgespannt werden.
Für die Synchronisation stellt die Murl Engine noch die Klassen System::Semaphore
, System::Mutex
, System::Locker
und System::AtomicSInt32
zur Verfügung.
Ein neues Tutorial ist verfügbar, welches beschreibt wie 3D-Modelle konvertiert und in die Murl Engine importiert werden können. Du kannst das Tutorial #01: 3D-Modelle importieren im Kapitel 3 der Tutorials Sektion finden.
Um ein 3D-Modell mit der Murl Engine laden zu können, muss dieses zuerst in eine Resource::Mesh
umgewandelt werden.
Die Murl Engine stellt dafür die beiden Tools Scene Converter und Scene Viewer zur Verfügung. Üblicherweise sind folgende Schritte notwendig, um ein 3D-Modell in einer App verwenden zu können:
3D-Modelle können in jeder beliebigen 3D-Grafiksoftware (z.B. Blender, Cinema 4d, 3ds Max, zBrush etc.) erstellt werden. Für den Scene Converter muss das Modell in einem geeigneten Dateiformat exportiert werden.
Der Scene Converter verwendet Assimp (Open Asset Import Library) bzw. das Autodesk FBX SDK zum Laden der Modelle und kommt daher mit vielen Dateiformaten zurecht. Eine Liste der unterstützen Assimp Formate findet sich hier.
Wir empfehlen das FBX Fileformat zu verwenden, da es flexibel ist und es damit üblicherweise wenige Probleme beim Konvertieren gibt.
]]>Der neue Murl Engine Build 1.00.5630Beta steht zum Download bereit. Das ist ein normaler Update Release mit zahlreichen Verbesserungen und 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
Alle Änderungen können auch im Change Log gefunden werden.
Abschließend noch unser obligatorischer Hinweis: Wenn du Schwierigkeiten mit dem Build hast, einen Bug findest oder sonstige entwicklungsrelevante Themen diskutieren möchtest, verwende unser Forum.
]]>Ein neues Tutorial ist verfügbar, welches genau erklärt in welcher Reihenfolge das Rendering passiert. Du kannst das Tutorial #14: Zeichenreihenfolge im Kapitel 1 der Tutorials finden.
Die Bestimmung der sichtbaren Flächen in einer Szene erfolgt normalerweise nach dem Z-Buffer Verfahren (auch Depth Buffer, Tiefenpuffer). Dabei ist die Zeichenreihenfolge der Objekte für das Ergebnis unerheblich. Allerdings funktioniert das Z-Buffer Verfahren nur mit opaken Flächen und nicht mit transparenten Flächen. Transparente, sich überdeckende Flächen müssen sortiert von hinten nach vorne gezeichnet werden, da die Zeichenreihenfolge einen entscheidenden Einfluss auf die resultierende Mischfarbe hat.
Daher ist es oft sinnvoll, zuerst die opaken Geometrien mit Z-Buffer zu zeichnen und danach die transparenten Geometrien, wobei aber nur mehr lesend auf den Z-Buffer zugegriffen wird. Auch für Overlays, HUDs und verschiedene Effekte ist die Zeichenreihenfolge wichtig.
Dieses Tutorial beschreibt in welcher Abfolge das Rendering genau passiert und welche Möglichkeiten es gibt, um die Zeichenreihenfolge zu beeinflussen.
In folgenden Ebenen kann Einfluss auf die Zeichenreihenfolge des Renderers genommen werden:
Spraylight, das Unternehmen hinter der Murl Engine, ist jetzt offiziell Intel® Software Premier Elite Partner.
Als Software Partner haben wir Zugriff auf technische Ressourcen von Intel® und profitieren von Intels globalem Netzwerk. Abgesehen vom Zugriff auf Hardware mit Intel®-Prozessoren, Intel® Software Tools und SDKs, profitieren wir auch von Intels Marketing- und Business-Support.
Ein erstes Ergebnis der Zusammenarbeit ist die Veröffentlichung eines White-Papers über die Murl Engine in der Intel® Developer Zone. Den englischen Artikel gibt es hier: Murl Engine Cross-Platform Development Tool with Android x86 Support
Die Partnerschaft ermöglicht es uns die Murl Engine für Intel® Geräte zu optimieren und garantiert eine optimale Performance und Kompatibilität für eure Murl Engine Apps. Großartige Neuigkeiten also für uns und die ganze Murl Engine Community.
]]>Der neue Murl Engine Build 1.00.5467Beta steht zum Download bereit. Dieser Release beinhaltet erstmals das Image-Converter-Tool und bringt zahlreiche Fixes und Verbesserungen.
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
Alle Änderungen können auch im Change Log gefunden werden.
Abschließend noch unser obligatorischer Hinweis: Wenn du Schwierigkeiten mit dem Build hast, einen Bug findest oder sonstige entwicklungsrelevante Themen diskutieren möchtest, verwende unser Forum.
]]>Der neue Murl Engine Build 1.00.5358Beta steht zum Download bereit. Neben zahlreichen Neuerungen bringt dieser Release Unterstützung für den mathematischen Evaluator und erzeugt kleinere App-Binärpakete.
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.
Alle Änderungen können auch im Change Log gefunden werden.
Abschließend noch unser obligatorischer Hinweis: Wenn du Schwierigkeiten mit dem Build hast, einen Bug findest oder sonstige entwicklungsrelevante Themen diskutieren möchtest, verwende unser Forum.
]]>Unser neuestes Murl Engine Feature ist ein praktischer Evaluator für mathematische Ausdrücke. Der Evaluator ermöglicht es, mathematische Ausdrücke als Parameter in Ressource XML Dateien zu verwenden. (Update am 24.02.2015)
Die Möglichkeit, mathematische Ausdrücke anstelle von festen Werten anzugeben, ist oft sehr nützlich.
Graphen-Objekte können so direkt konfiguriert werden, ohne dass zusätzlicher C++ Code notwendig ist.
Das ist vor allem dann praktisch, wenn mit Replikationen von Instanzen gearbeitet wird.
Das Feature-Bild zeigt ein Beispiel, bei dem ein mathematischer Ausdruck dazu verwendet wurde, um mehrere PlaneGeometry
-Objekte entlang einer herzförmigen Kurve auszurichten.
Ein mathematischer Ausdruck wird definiert, indem der Ausdruck in geschwungene Klammern gesetzt wird. Das ist dieselbe Notation wie für übergebene Attribute. Hier ein einfaches Beispiel:
<PlaneGeometry id="plane_{replication}" posX="{replication*10}" posY="0"/>
Ausdrücke kombinieren
Eine Folge von Ausdrücken kann durch eine mit Strichpunkt getrennte Liste definiert werden. Der letzte Ausdruck wird dem Attribut zugewiesen.
<PlaneGeometry posX="{R=400;r=100;b=65;t=replication*0.01;(R-r)*Sin(t)-b*Sin((R-r)/r*t)}" />
Einzelne Ausdrücke können auch ineinander verschachtelt werden, was zu einer separaten Auswertung für jeden verschachtelten Ausdruck führt.
<PlaneGeometry posX="{{2*3}+6}}" />
Datentypen
Der Evaluator unterstützt die folgenden Datentypen:
Double, SInt32, Bool, StringDer richtige Datentyp wird automatisch bestimmt. Eine explizite Typkonvertierung kann in funktionaler Notation angegeben werden.
<PlaneGeometry posX="{SInt32(replication*0.1)}" />
Für die Angabe eines Strings
muss die Zeichenkette in einfache Hochkommas gesetzt werden:
<Node id="{'ab'+String('c')+BoolToString(1)}" />
Das Ergebnis des obigen Ausdrucks wäre:
abctrueBedingte Ausdrücke
Die if
Funktion kann verwendet werden, um bedingte if/else Ausdrücke zu erstellen.
<PlaneGeometry posX="{if(replication > 10, 100, 0)}" />
Ein äquivalenter C++ Code für diesen Ausdruck wäre:
if (replication > 10) { posX = 100; } else { posX = 0; }
Alternativ kann auch die switch
Funktion für bedingte Ausdrücke verwendet werden.
Die switch
Funktion erwartet einen Bedingungsparameter gefolgt von einer Reihe von Fallparametern.
Der Bedingungsparameter wird auf den Bereich [0, Anzahl_der_Fallparamter-1] beschränkt.
Beispiel:
<PlaneGeometry posX="{switch(replication * 0.1, 100, 200, 50)}" />
Bei diesem Bespiel wird der Bedingungsparameter auf den Bereich [0,2] beschränkt. Daher ergibt sich der Wert 100 für die Instanzen 0 bis 9, 200 für die Instanzen 10 bis 19 und 50 für alle anderen Instanzen.
Ein äquivalenter C++ Code für diesen Ausdruck wäre:
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; }
Zufallszahlen
Ein globaler Zufallszahlengenerator (RNG) steht für die Verwendung von Zufallszahlen zur Verfügung.
Der RNG wird beim Start immer mit dem gleichen Seedwert initialisiert, weshalb er immer die gleiche Reihe an Zufallszahlen liefert. Durch den Aufruf von Seed(value)
kann ein neuer Seedwert gesetzt werden.
Ein Aufruf von Seed()
ohne Parameter verwendet die aktuelle Systemzeit als Seedwert.
<Instance graphResourceId="graph_plane" replications="{Seed(42);10}"/>
Mit z.B. RandSInt(start, end)
kann eine neue Zufallszahl gezogen werden.
<PlaneGeometry posX="{replication*10}" posY="{RandSInt(-100,100)}" />
C++ Default-Parameter
Ein globaler Default-Parameter kann in der IApp::Configure()
Methode
definiert und dann in den mathematischen Ausdrücken ausgewertet werden.
Dafür wurde der IEngineConfiguration
Klasse die Methode GetDefaultGraphParameters()
hinzugefügt.
Bool App::MyApp::Configure(IEngineConfiguration* engineConfig, IFileInterface* fileInterface) { IAttributes* defaultParameters = engineConfig->GetDefaultGraphParameters(); defaultParameters->AddAttribute("myPosParam","42"); … }
Der neue Default-Parameter kann wie jede andere Variable gelesen werden:
<PlaneGeometry posX="{myPosParam}" />
Die folgende Liste beinhaltet alle verfügbaren Operatoren, Funktionen und Konstanten.
Die Verwendung ist gleich wie in C++.
Für String
-Funktionen muss der erste Parameter der String
sein, auf den die Methode angewendet werden soll.
Operatoren:
+, -, *, /, % (Addition, subtraction, multiplication, division, modulo) <<, >> (Shift operators) &, |, ^, ~ (Bitwise AND, OR, XOR, NOT) &&, ||, ^^, ! (Logical AND, OR, XOR, NOT) = (Assignment) ==, !=, <, <=, >, >= (Relational operators) # (Comment operator)
Konstanten:
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_CMBedingte Funktionen:
if, switchMath-Funktionen (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-Funktionen (Murl::String):
GetLength, Trim, TrimLeft, TrimRight, Left, Right, Mid, ToLowerUTF8, ToUpperUTF8, GetLengthUTF8, Replace, Find, ReverseFind, FindFirstOf, FindFirstNotOf, StartsWith, EndsWith, CompareExplizite Typkonvertierung:
SInt32, Double, Bool, StringKonvertierungs-Funktionen (Murl::Util):
StringToDouble, StringToSInt32, StringToBool, DoubleToString, SInt32ToString, BoolToStringZufallszahlen (Murl::Util::Rng):
Seed, Rand, RandBool, RandSInt, RandReal, RandDouble
Hinweis:
Bitte beachte, dass die folgenden Zeichen in XML-Dateien als XML-Entities definiert werden sollten:
Wir haben für euch eine ganze Reihe von neuen Tutorials erstellt. Diese behandeln unter anderem die Themen Buttons, Aligner-Knoten, System-Dialoge, Framebuffer, Kamerabewegung und Add-ons.
Tutorial #10: Buttons
Mit dem Button
-Knoten können einfache Steuerelemente für die Interaktion mit dem Benutzer erstellt werden.
Dabei enthält der Graphenknoten Button
selbst keine sichtbaren Elemente, sondern definiert lediglich einen Bereich in der Szene, der auf Mausklicks oder Touch-Ereignisse reagieren kann.
Das Tutorial #10: Buttons zeigt anhand verschiedener Beispiele,
wie Button
-Knoten verwendet und animiert werden können.
Tutorial #11: SystemDialog & WebControl
Normalerweise werden Dialoge passend zum grafischen Design der App gestaltet.
In manchen Situationen ist aber der Einsatz von echten System-Dialogen gewünscht.
Das Tutorial #11: SystemDialog & WebControl zeigt wie einfache System-Dialoge erstellt werden können.
Außerdem wird gezeigt, wie mit Hilfe des WebControl
s Webseiten im Standard-Browser geöffnet, Emails versendet und HTTP POST sowie HTTP GET Aufrufe durchgeführt werden können.
Tutorial #12: Aligner
Aligner
-Knoten können verwendet werden, um einzelne Objekte automatisiert auszurichten.
Das Tutorial #12: Aligner erklärt die Verwendung von Aligner
-Knoten
und zeigt zusätzlich wie Ankerpunkte für die Positionierung mit den Attributen containerAlignmentX
und containerAlignmentY
angepasst werden können.
Tutorial #13: Framebuffer
Normalerweise wird die gesamte Szene direkt in den Backbuffer gerendert und direkt angezeigt.
Mit dem FrameBuffer
Knoten kann auch ein "Offscreen-Rendering" durchgeführt werden,
bei dem ein Teil der Szene in eine Textur gerendert werden kann.
Das Tutorial #13: Framebuffer zeigt wie das geht.
Tutorial #00: Bewegliche Kamera
Im ersten Tutorial des dritten Kapitels wird gezeigt, wie die Kamera in einer 3D-Szene bewegt werden kann. Zunächst wird im (Tutorial #00: Bewegliche Kamera) eine simple 3D-Szene mit Skybox erstellt. Danach werden drei verschiedene Methoden gezeigt, um die Kamera innerhalb der virtuellen Welt zu bewegen.
Tutorial #00: Add-on Integration
Die Murl Engine unterstützt eine Reihe von Add-ons, die optional verwendet werden können. Das Tutorial #00: Add-on Integration erklärt welche Add-ons es gibt, wie man ein Add-on einbindet und worauf dabei geachtet werden sollte.
]]>Der neue Murl Engine Build 1.00.5225Beta steht zum Download bereit. Dieser Release beinhaltet unter anderm Support für Microsoft Visual Studio Community 2013 und das neue 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
Eine detaillierte Übersicht aller Neuerungen ist wie immer im Change Log zu finden.
Abschließend noch unser obligatorischer Hinweis: Wenn du Schwierigkeiten mit dem Build hast, einen Bug findest oder sonstige entwicklungsrelevante Themen diskutieren möchtest, verwende unser Forum.
]]>Letzte Woche hat Microsoft auf der Connect() Entwickler-Konferenz in New York Visual Studio Community 2013 vorgestellt, eine kostenlose IDE für kleine Entwicklerteams. Damit unsere Entwickler die neue Version auch nutzen können, wird die Murl Engine beginnend mit dem nächsten Release auch Visual Studio 2013 unterstützen.
Community Edition
Visual Studio Community 2013 ist eine neue, kostenlose und vollausgestattete Version von Visual Studio inklusive voller Erweiterbarkeit. Ähnlich wie bei der Express Version von Visual Studio, kann die Community Version kostenlos für die Entwicklung von kommerziellen Anwendungen verwendet werden. Allerdings ist die Community Version beschränkt auf individuelle Entwickler und kleinere Firmen (bis zu 5 Nutzer). Unter Microsofts Definition einer kleinen Firma in diesem Zusammenhang fallen Firmen mit bis zu 205 PCs und weniger als 1 Million USD Umsatz (siehe auch visual-studio-community#QnA). Nichtsdestotrotz ist die Community Version ein tolles Angebot, im speziellen für Indie Entwickler.
Visual Studio 2013 Unterstützung
Daher werden alle zukünftigen Versionen der Murl Engine auch eine Unterstützung für VS2013 beinhalten und mit den erforderlichen Bibliotheken ausgeliefert werden. Natürlich wird nicht nur die Community Version unterstützt. Entwickler können genauso Visual Studio Express 2013, Visual Studio Professional 2013 oder irgendeine andere Version von Visual Studio verwenden, sofern das 2013 Toolset (ToolsVersion 12.0) unterstützt wird.
Projekt Upgrade für VS2013
Das neue Dashboard Kommando Project / Create Missing Project Files kann verwendet werden, um VS2013 Projektdateien für ein existierendes Projekt zu generieren.
Alternativ besteht auch die Möglichkeit, die VS2010 Projektdateien in einen neuen Ordner mit dem Namen VS2013 zu kopieren und Visual Studio 2013 für das Upgrade zu verwenden:
"C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\devenv.exe" mySolution.sln /upgrade
Visual Studio 2008 Support eingestellt
Gleichzeitig mit der Einführung der Visual Studio 2013 Unterstützung, wird der Support für Visual Studio 2008 eingestellt. Die Murl Engine unterstützt zwar weiterhin auch VS2008, allerdings werden die Bibliotheken für Visual Studio 2008 nicht mehr mit ausgeliefert. Falls jemand immer noch Windows 2000 oder Windows XP pre SP2 unterstützen muss/möchte, können wir die Bibliotheken gesondert zur Verfügung stellen. Sende uns in diesem Fall einfach eine E-Mail oder kontaktiere uns über das Forum.
]]>Der neue Murl Engine Build 1.00.5139Beta steht zum Download bereit. Das ist ein Bug-Fix Release mit Fehlerbehebungen und einigen Verbesserungen.
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.
Eine detaillierte Übersicht aller Neuerungen ist wie immer im Change Log zu finden.
Abschließend noch unser obligatorischer Hinweis: Wenn du Schwierigkeiten mit dem Build hast, einen Bug findest oder sonstige entwicklungsrelevante Themen diskutieren möchtest, verwende unser Forum.
]]>Der neue Murl Engine Build 1.00.5068Beta steht zum Download bereit. Das ist ein normaler Update Release mit einigen Verbesserungen und Fehlerbehebungen.
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
Eine detaillierte Übersicht aller Neuerungen ist wie immer im Change Log zu finden.
Abschließend noch unser obligatorischer Hinweis: Wenn du Schwierigkeiten mit dem Build hast, einen Bug findest oder sonstige entwicklungsrelevante Themen diskutieren möchtest, verwende unser Forum.
]]>Nutze das gesamte Display für deine Murl Engine App. Dieses Posting beschreibt, wie Androids™ Immersive Full-Screen Modus bei Murl Engine Apps genutzt werden kann. (updated 07.09.2018)
Achtung, der Immersive Full-Screen Modus wurde erst mit Android™ 4.4 (API Level 19) eingeführt. Daher funktioniert der Modus nur bei Android™ Geräten mit Version 4.4 oder höher. Bei Geräten mit niedrigerer Android™ Version hat eine Aktivierung keine Auswirkung.
Der Immersive Full-Screen Modus kann mit dem murl.configdata
meta-data Parameter und dem Wert mHideNavigationBarImmersiveStickyEnabled=true;
im Android Manifest File aktiviert werden:
</activity> <meta-data android:name="murl.configdata" android:value="mHideNavigationBarImmersiveStickyEnabled=true;"/> </application>
Du kannst den Wert auch im common Makefile projekt/common/gnumake/module_yourapp.mk
setzten, damit die Einstellung automatisch beim Erzeugen des Manifest Files includiert wird.
Damit wird der Immersive Modus aktiviert und das "Immersive Sticky Flag" gesetzt. Das hat folgende Auswirkungen auf deine Android™ App:
VLNR Reminder Bubble, Immersive Full-Screen, Halb-Transparente Systembars
Alternativ kann auch der "Low Profile" Modus verwendet werden.
Dabei wird die Navigationbar lediglich gedimmt.
Dieses Feature gibt es seit Android™ 4.0 (API level 14) und kann mit dem Wert mLowProfileNavigationBarEnabled=true;
aktiviert werden.
</activity> <meta-data android:name="murl.configdata" android:value="mLowProfileNavigationBarEnabled=true;"/> </application>MURL_ANDROID_CONFIG_DATA := mLowProfileNavigationBarEnabled=true;
VLNR Normaler Modus, Low Profile Modus, Immersive Full-Screen Modus
Wenn beide Modi (Low Profile und Immersive Full-Screen) aktiviert sind, wird bevorzugt der Immersive Full-Screen Modus verwendet. Das bedeutet, dass auf Geräten mit Android™ 4.4 oder größer der Immersive Full-Screen Modus verwendet wird und auf Geräten mit einer Android™ Version größer oder gleich 4.0 und kleiner 4.4 der Low Profile Modus verwendet wird.
</activity> <meta-data android:name="murl.configdata" android:value="mLowProfileNavigationBarEnabled=true;mHideNavigationBarImmersiveStickyEnabled=true;"/> </application>MURL_ANDROID_CONFIG_DATA := mLowProfileNavigationBarEnabled=true;mHideNavigationBarImmersiveStickyEnabled=true;
Noch einfacher kann der Immersive Full-Screen Modus mit dem Dashboard und dem Kommando Android / Configure Project aktiviert werden. Das Kommando öffnet ein Dialogfenster, in dem die wichtigsten Android™ Einstellungen inklusive Screen-Modus bequem konfigurierte werden können. Alle Änderungen die im Dialog gemacht wurden, werden in das common Makefile übernommen. You have to rebuild the Manifest file to apply the changes (lösche das Manifest file und starte gradle sync).
Android / Configure Projekt Dialog
Weitere Informationen zu den Screen Modi können im Abschnitt Managing the System UI der Android™ Developer Dokumentation gefunden werden.
]]>Die Webseite wurde um eine Galerie-Seite erweitert, auf der erfolgreiche Apps vorgestellt werden.
Den Anfang machen sechs Apps bzw. Demos. Zu jeder App könnt Ihr Screenshots, Infos, Downloadlinks und zum Teil auch Videos finden. Die Galerie soll natürlich weiter wachsen und Eure Werke präsentieren. Wenn Ihr also eine tolle App mit der Murl Engine entwickelt habt und diese auf der Galerie Seite listen möchtet, so schreibt uns ein Email oder meldet Euch im Forum.
]]>Der neue Murl Engine Build 1.00.4990Beta steht zum Download bereit. Das ist ein Update Release mit Unterstützung für 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.
Eine detaillierte Übersicht aller Neuerungen ist wie immer im Change Log zu finden.
Abschließend noch unser obligatorischer Hinweis: Wenn du Schwierigkeiten mit dem Build hast, einen Bug findest oder sonstige entwicklungsrelevante Themen diskutieren möchtest, verwende unser Forum.
]]>Vom 12. bis zum 14. September findet erstmals die GameStage Expo in der Tabakfabrik Linz statt.
Auf über 4.000 m² Ausstellungsfläche wird ein bisher einzigartiger Überblick der österreichischen Videospiel und Computerspielszene geboten. Zahlreiche Entwickler aus der österreichischen Spieleszene präsentieren ihre aktuellsten Projekte.
Die Retroausstellung ermöglicht eine Zeitreise in die Geschichte des jüngsten elektronischen Unterhaltungsmediums. Über 50 spielbare Konsolen, Handhelds und Heimcomputer aus den letzten 40 Jahren Computerspielgeschichte, sowie 20 original Arcadeautomaten lassen die goldene Spielhallenzeit lebendig werden. Passend zu diesem Schwerpunkt wird am Samstag dem 13. September die Retrobörse für klassische Video und Computerspiele stattfinden.
Auch wir sind mit einem eigenen Stand vertreten und werden neben der Murl Engine auch die neuesten Spiele und Demos präsentieren. Natürlich stehen wir auch für Gespräche und Fragen zur Verfügung. Schaut einfach vorbei!
Veranstaltungsdetails:
Weitere Infos gibt es auf der offiziellen Webseite.
]]>Wir haben für euch ein neues Tutorial erstellt, welches den Umgang mit Container-Klassen und weitere grundlegende Funktionen genau erläutert. Das Tutorial #09: Container & Basics könnt ihr im Tutorials Bereich unter Kapitel eins finden.
Achtung, dieses Tutorial ist sehr umfangreich und behandelt folgende Themen:
Textausgabe, Strings
Container
Zeit
Sonstiges
Hilfsfunktionen
Zeiger
Android™ Tablets und Smartphones mit Intel Atom CPUs erfreuen sich immer größerer Beliebtheit. Daher bietet die Murl Engine seit Version 1.00.4754Beta auch die Möglichkeit, Android Apps mit nativer x86-Unterstützung zu erstellen.
Kurz zusammengefasst:
In der Vergangenheit waren Android™ Geräte typischerweise mit einer ARM CPU ausgestattet. Seit dem Jahr 2012 gibt es aber auch Android™ Geräte mit Intel x86 Atom CPUs auf dem Markt. Einige bekannte Vertreter von Android™ Geräten mit Intel CPUs sind: Samsung Galaxy Tab 3 10.1, Asus MemoPad FHD 10, Dell Venue 7/8, Motorola Razr I, Lenovo K900 oder das HP 7.
Damit bestehende Apps mit nativen ARM Code auch auf Android™ Geräten mit Intel x86 Architektur lauffähig sind, wurde von Intel ein "Binär-Übersetzer" (Binary Translator, BT) namens "Houdini" entwickelt. Dieser Binary Translator liest die nativen ARM Befehle und übersetzt sie on-the-fly in äquivalenten x86 Code.
Daher laufen die meisten ARM NDK Applikationen ohne Änderungen auch auf x86 Android™ Geräten. Allerdings kann diese "NDK Bridging Technology" auch Probleme und Geschwindigkeitseinbußen mit sich bringen. Daher sind eigene Android™ x86 Bibliotheken in den meisten Fällen empfehlenswert.
Alle zukünftigen Releases der Murl Engine beinhalten auch die vorkompilierten Bibliotheken für Android™ x86. Die Android™ Build-Umgebung erzeugt und inkludiert standardmäßig auch den Android™ x86 Code.
Mit dem Parameter MURL_ANDROID_CPUS
im Common-Make-file projekt/common/gnumake/module_yourapp.mk
können explizit die zu unterstützenden CPU Architekturen angegeben werden. Beispiel:
Die angegebenen Werte entsprechen dem APP_ABI Parameter der Android™ NDK Build Umgebung (ABI steht für "Application Binary Interface").
armeabi ARM-basierende CPUs, die zumindest das ARMv5TE instruction set unterstützen. armeabi-v7a ARM-basierende CPUs, die das ARM v7-a instruction set mit Thumb-2 Befehlen und VFPv3-D16 Hardware FPU unterstützen. x86 x86-basierende CPUs. Der Build erfolgt mit folgenden gcc flags: -march=i686 -mtune=atom -mstackrealign -msse3 -mfpmath=sse -m32
Die Murl Engine Build Skripten aktivieren für x86 zusätzlich den Parameter -mssse3
. Dies ist möglich, da alle x86 Android™ Geräte SSSE3 unterstützen (siehe auch https://ph0b.com/improving-x86-support-of-android-apps-libs-engines). Weitere Informationen über die verschiedenen Architekturen können in der NDK Dokumentation unter docs/CPU-ARCH-ABIS.html
nachgelesen werden.
Um zu überprüfen, ob die richtigen Bibliotheken inkludiert wurden, genügt ein Blick in das lib Verzeichnis des APK Archivs. Bekanntermaßen sind .apk Dateien gezippte Archive, die z.B. einfach in .zip Dateien umbenannt und mit einem beliebigen Komprimierungs-Tool entpackt werden können.
Wie groß der Geschwindigkeitsvorteil bei Verwendung von x86 Code gegenüber dem Binary Translator tatsächlich ist, hängt logischerweise von der Art der Anwendung, den verwendeten Features und nicht zuletzt von der Version des Binary Translators ab. Um ein besseres Gefühl zu bekommen, haben wir ein paar simple Benchmarks mit der Murl Engine durchgeführt. Bitte zu beachten, dass es sich dabei lediglich um einfache Tests handelt und sich davon keine allgemeine Aussage über die Leistungssteigerung ableiten lässt. Gegebenenfalls sollten eigene Tests durchgeführt werden.
Als Testgerät wurde ein Asus Memo Pad FHD 10 verwendet, das uns freundlicherweise von Intel zur Verfügung gestellt wurde. Das Tablet ist mit einer Dual-Core 1,6 GHz Intel® Atom™ Z2560 CPU mit integrierter PowerVR SGX544 GPU ausgestattet und hat ein 10.1 Zoll WUXGA Display mit einer Auflösung von 1920 x 1200 Pixeln.
Unsere Tests mit der Murl Engine zeigten, dass armeabi-v7a Code im Durchschnitt um den Faktor 1.6 langsamer läuft (bzw. um den Faktor 2.5 bei armeabi Code). Je nach Benchmark lagen die Werte zischen 130% und 190% (bzw. zwischen 180% und 370% für armeabi). Genauere Informationen zu den durchgeführten Tests sind weiter unten zu finden.
Natürlich erhöhen die zusätzlichen x86 Dateien den Gesamtspeicherplatz des APK-Archivs. Wenn die Speichergröße ein kritischer Faktor ist, kann die APK-Datei auch gesplittet werden, sodass für jede CPU Architektur ein eigens APK-Archiv existiert. Dabei ist zu beachten, dass die Versionsnummern der x86 APK-Datei größer der Versionsnummer der ARM Version sein muss (Parameter MURL_ANDROID_VERSION_CODE
im Common-Make-file).
x86 version code > armeabi-v7a version code > armeabi version code
Der Play-Store liefert dann die APK mit der höchsten Versionsnummer die noch kompatibel ist aus. Weitere Informationen dazu können in der Android™ Developer Dokumentation unter Multiple APK Support nachgelesen werden.
Die Tests wurden mit dem Asus Memo Pad FHD 10 durchgeführt. Die angegebenen Werte sind ein Maß für die benötigte Rechenzeit. Höhere Werte sind schlechter als niedrige Werte.
Übersicht
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
Erzeugen von 20.000.000 zufälligen Werten und Speicherung in drei anfänglich leeren Containern (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 |
---|---|---|---|
Mittelwert | 5.837 | 8.728 | 14.517 |
Rel. Standardabweichung | 0,99% | 0,79% | 1,79% |
Rel. Differenz | 100% | 150% | 249% |
Calc UInt32
Berechnung einer Zahl aus den erzeugten 20.000.000 zufälligen UInt32 Werten.
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 |
---|---|---|---|
Mittelwert | 130 | 247 | 310 |
Rel. Standardabweichung | 0,00% | 2,34% | 0,00% |
Rel. Differenz | 100% | 190% | 238% |
Sort Array
Sortiere ein UInt32Array mit 2.000.000 zufälligen Zahlen mittels Quicksort.
Util::SortArray(uInt32Array, false);
t [ms] | x86 | armeabi-v7a | armeabi |
---|---|---|---|
Mittelwert | 1.581 | 2.753 | 3.282 |
Rel. Standardabweichung | 0,46% | 0,76% | 1,09% |
Rel. Differenz | 100% | 174% | 208% |
Calc PI
Berechne die Zahl PI nach der Leibniz-Reihe mit 40.000.000 Summanden.
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 |
---|---|---|---|
Mittelwert | 1.933 | 2.883 | 7.093 |
Rel. Standardabweichung | 0,05% | 0,14% | 0,08% |
Rel. Differenz | 100% | 149% | 367% |
Scenegraph
Szenegraphprocessing eines Szenengraphen mit 20.000 Sprite Objekten, die an zufälligen Positionen gerendert werden.
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 |
---|---|---|---|
Mittelwert | 129,1 | 169,6 | 233,0 |
Rel. Standardabweichung | 2,45% | 1,05% | 2,00% |
Rel. Differenz | 100% | 131% | 180% |
Der neue Murl Engine Build 1.00.4820Beta steht zum Download bereit. Dabei handelt es sich um einen Bug-Fix Release.
Leider hat sich im letzten Release ein Fehler eingeschlichen, der die korrekte Button-Detektion bei der Verwendung von mehreren Kameras in unsortierter Reihenfolge verhindert. Der neue Release korrigiert diesen Fehler.
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
Eine detaillierte Übersicht aller Neuerungen ist wie immer im Change Log zu finden.
Abschließend noch unser obligatorischer Hinweis: Wenn du Schwierigkeiten mit dem Build hast, einen Bug findest oder sonstige entwicklungsrelevante Themen diskutieren möchtest, verwende unser Forum.
]]>Der neue Murl Engine Build 1.00.4754Beta steht zum Download bereit.
Release Highlights:
Eine detaillierte Übersicht aller Neuerungen ist wie immer im Change Log zu finden.
Bitte die folgenden API Änderungen beachten:
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="..."
Abschließend noch unser obligatorischer Hinweis: Wenn du Schwierigkeiten mit dem Build hast, einen Bug findest oder sonstige entwicklungsrelevante Themen diskutieren möchtest, verwende unser Forum.
]]>Mit dem Build 1.00.3970Beta wird auch eine erste Version des Murl Engine Tools "Dashboard" mit ausgeliefert.
Das Dashboard ist eine Anwendung, die das Erstellen und Warten von Projektdateien über verschiedene Plattformen erleichtert und weitere hilfreiche Funktionen zur Verfügung stellt.
Beispielsweise kann mit New Project einfach ein neues Murl Engine Projekt mit der gewohnten Verzeichnisstruktur und Projektdateien für alle unterstützten Plattformen erzeugt werden.
Mit der Funktion Open IDE kann dann das neue Projekt einfach in der gewünschten IDE geöffnet und mit der Entwicklung gestartet werden.
Auf Wunsch kann auch der Resource Packer gestartet werden, um aus den Ressourcen-Dateien in den *.murlres Verzeichnissen Ressourcen-Pakete erzeugen zu lassen.
Das Update Projekt Feature bringt wieder alle Projekte (Visual Studio 2008, Visual Studio 2010, Xcode iOS, Xcode OSX, Android ...) auf Stand, indem automatisch alle neuen Source Code Files hinzugefügt und nicht mehr vorhandene Files entfernt werden.
Mit Android Build kann schnell und komfortabel eine Android App erzeugt und getestet werden. Die fertige App wird nach dem Build automatisch auf ein angeschlossenens Android Gerät installiert und gestartet. Auch das Erzeugen eines Signatur Schlüssel für einen Android Release Build wird unterstützt.
Das Programm ist im Murl Engine Paket im Verzeichnis Dashboard.app zu finden und muss nicht extra installiert werden. Einzige Voraussetzung ist ein installiertes Java Runtime Environment.
Weitere Informationen können im Abschnitt Dashboard in der User's Guide Dokumentation gefunden werden.
]]>Der längst überfällige Murl Engine Build 1.00.3970Beta steht endlich zum Download bereit.
Die neue Version beinhaltet eine Menge an neuen Funktionen und Features die noch in weiteren Blog Posts und Tutorials detailliert beschrieben werden. Eine Übersicht aller Neuerungen ist wie immer im Change Log zu finden.
Bitte die folgenden API Änderungen beachten:
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 interfacesAbschließend noch unser obligatorischer Hinweis: Wenn du Schwierigkeiten mit dem Build hast, einen Bug findest oder sonstige entwicklungsrelevante Themen diskutieren möchtest, verwende unser Forum.
]]>Der Styrian Marketplace ist eine Veranstaltungsreihe der Fachgruppe UBIT, bei der innovative steirische Produkte und Dienstleistungen einer breiten Öffentlichkeit präsentiert werden. Bei der kommenden Ausgabe am 22. Oktober wird Spraylight das preisgekrönte Multimedia Framework "Murl Engine" vorstellen. Informationen dazu und über die weiteren Firmenvorstellungen finden sich auf der Veranstaltungs-Webseite der WKO.
Für die Präsentationen sind pro Unternehmen jeweils 15 Minuten vorgesehen. Im Anschluss besteht die Möglichkeit zu vertiefenden Gesprächen bei "Würstel und Bier". Lasst euch diesen Networking Event nicht entgehen.
Veranstaltungsdetails:
Aus organisatorischen Gründen bitte direkt bei der WKO anmelden - entweder online oder per E-Mail unter office@ubit-stmk.at. Die Teilnahme an der Veranstaltung ist kostenlos.
]]>Detaillierte Informationen über alle Neuerungen sind wie immer im Change Log zu finden.
Bitte die folgenden API Änderungen beachten:
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 conversionAbschließend noch unser obligatorischer Hinweis: Wenn du Schwierigkeiten mit dem Build hast, einen Bug findest oder sonstige entwicklungsrelevante Themen diskutieren möchtest, verwende unser Forum.
]]>Wie schon in den vergangenen vier Jahren findet auch heuer wieder die Game Developers Conference™ Europe (GDC Europe) und die gamescom als gemeinsame Tandemveranstaltung in Köln statt. Die GDC Europe als größte Entwicklerkonferenz in Europa und die gamescom als größte europäische Messe für interaktive Spiele und Unterhaltung bilden das wichtigste europäische Event für Spieler und Spieleentwickler.
Dieses Jahr findet die GDC Europe vom 19. bis 21. August 2013 im Congress-Centrum Ost Koelnmesse in Köln statt. Die gamescom findet anschließend vom 21. bis 25. August 2013 am selben Gelände statt, wobei der Businessbereich nur bis zum 23. August geöffnet hat.
Auch wir werden wieder an der GDC teilnehmen und sind heuer erstmals mit einem eigenen Stand im Businessbereich der gamescom vertreten, an dem wir die neuesten Spiele und Demos präsentieren werden. Natürlich stehen wir euch auch jederzeit für Gespräche und Fragen zur Verfügung. Ihr seid herzlich eingeladen, bei unserem Messestand vorbeizuschauen oder vereinbart einfach schon im Vorhinein ein Treffen mit uns auf der GDC unter office(at)murlengine.com. Unser Stand befindet sich im Österreicher Pavillon im Businessbereich, Halle 4.2, Stand B043-C042.
Wir freuen uns auf euch!
]]>Detaillierte Informationen über alle Neuerungen sind wie immer im Change Log zu finden.
Neben dem neuen Build steht die API Referenz jetzt auch als downloadbare Offline Dokumentation zur Verfügung:
Abschließend noch unser obligatorischer Hinweis: Wenn du Schwierigkeiten mit dem Build hast, einen Bug findest oder sonstige entwicklungsrelevante Themen diskutieren möchtest, verwende unser Forum.
]]>Spraylight zählt mit dem Projekt Murl Engine zu den Top-5 Nominierten in der Kategorie „Standardsoftware und Cloud Services“ beim Constantinus Award 2013, Österreichs größtem IT und Beraterpreis. Die Nominierung erfolgte durch eine hochkarätige Fachjury, die sich jedes Jahr erneut aus namhaften Vertretern aus Wirtschaft und Medien zusammensetzt. Insgesamt standen heuer 144 Projekte zur Auswahl.
Die Bekanntgabe der Sieger und Verleihung der Awards erfolgt bei einer glanzvollen Constantinus Award Gala, die heuer im Congress-Schladming in der Steiermark stattfindet. Da eine Nominierung zum Constantinus Award schon eine Auszeichnung für sich ist, werden dort auch alle nominierten Projekte in Form von eigenen Schautafeln auf der „Straße der Sieger“ präsentiert.
Beim Publikumspreis haben wir mit einer Top-10 Platzierung ein respektables Ergebnis geschafft, sind aber leider nicht unter den Top-3 Nominierten. Wir möchten uns aber trotzdem bei Allen für Ihre Unterstützung und das fleißige Voten bedanken! Bitte haltet uns für die Preisverleihung am kommenden Donnerstag, dem 13. Juni die Daumen.
]]>Detaillierte Informationen über alle Neuerungen findest du im Change Log.
Abschließend noch unser obligatorischer Hinweis: Wenn du Schwierigkeiten mit dem Build hast, einen Bug findest oder sonstige entwicklungsrelevante Themen diskutieren möchtest, verwende unser Forum.
]]>Neben anderen Verbesserungen wird jetzt auch das Rendering von Truetype und OpenType Fonts unterstützt (zusätzlich zum Rendering von Bitmap Fonts und System Fonts). Die vollständige Liste aller Neuerungen findest du im Change Log.
Achtung, unbedingt die folgenden API Änderungen beachten:
Murl::ISystemFont
zu Murl::IFont
Graph::TextGeometry
und FlatTextTexture
sowie Verschiebung
der zugehörigen Methoden in das Graph::IFont
Interface:systemFontId
","fontId
" -> "systemFontName
"systemFontSize
" -> "fontSize
"systemFontTextColor
" -> "textColor
"systemFontBackgroundColor
" -> "backgroundColor
"Der User-Code muss entsprechend den API Änderungen angepasst werden. Eine einfache Search&Replace Operation sollte in den meisten Fällen ausreichend sein.
Abschließend noch unser obligatorischer Hinweis: Wenn du Schwierigkeiten mit dem Build hast, einen Bug findest oder sonstige entwicklungsrelevante Themen diskutieren möchtest, verwende unser Forum.
]]>Achtung, unbedingt die folgenden API Änderungen beachten:
Step()
/OnStep()
wurden umbenannt auf ProcessTick()
/OnProcessTick()
für alle Logik Interfaces und Klassen.Animate()
/OnAnimate()
wurden umbenannt auf ProcessFrame()
/OnProcessFrame()
für alle Logik Interfaces und Klassen.Identity()
wurde umbenannt auf SetIdentity()
für Math::Matrix
.Minimum()
/Maximum()
/MinimumSelf()
/MaximumSelf()
wurden umbenannt auf Min()
/Max()
/MinSelf()
/MaxSelf()
für Math::Vector
.Length()
/LengthSquared()
wurden umbenannt auf GetLength()
/GetSquaredLength()
für Math::Vector
.GetLocalEventVelocity()
und GetLocalEventAcceleration()
für Graph::IButton
wurden entfernt.GetLocalVelocity()
und GetLocalAcceleration()
für Graph::IMultiTouchable
wurden entfernt.Graph::IButton::GetLocalEventDelta()
.Graph::IMultiTouchable::GetLocalDelta()
.Der User-Code muss entsprechend den API Änderungen angepasst werden. Eine einfache Search&Replace Operation sollte in den meisten Fällen ausreichend sein. Die vollständige Liste aller Neuerungen findest du im Change Log.
Die Projektdateien und der Quellcode der Tutorials wurden zur einfacheren Handhabung in das Murl Download Paket integriert. Ein separater Download der Tutorials ist nun nicht mehr nötig.
Abschließend noch unser obligatorischer Hinweis: Wenn du Schwierigkeiten mit dem Build hast, einen Bug findest oder sonstige entwicklungsrelevante Themen diskutieren möchtest, verwende unser Forum.
]]>Weitere Details findest du im Change Log.
Zusätzlich haben wir der User's Guide einige neue Kapitel hinzugefügt und die Stylesheets vom Support Bereich adaptiert, um eine bessere Lesbarkeit zu gewährleisten.
Abschließend noch unser obligatorischer Hinweis: Wenn du Schwierigkeiten mit dem Build hast, einen Bug findest oder sonstige entwicklungsrelevante Themen diskutieren möchtest, verwende unser Forum.
]]>Das 600 MByte große Gesamtpaket setzt sich aus rund 260.000 bildschön ausgerichteten Zeilen Code (gezählt ohne Kommentare & Leerzeilen) und etwa 100 kg Kaffee als Bindemittel zusammen und wartet darauf euren Ideen zum Erfolg zu verhelfen.
Wir sind noch in der Beta Phase und für jeden konstruktiven Hinweis dankbar. Bitte um Nachsicht sollte auf der Homepage oder im Framework noch der eine oder andere Fehler zu finden sein. Wenn euch also etwas auffällt, bitte meldet es in unserem Forum.
Viel Spaß!
]]>