Irrlicht for IPHONE

If you are a new Irrlicht Engine user, and have a newbie-question, this is the forum for you. You may also post general programming questions here.
zhengxianfu
Posts: 16
Joined: Thu Apr 05, 2012 9:33 am

Irrlicht for IPHONE

Post by zhengxianfu »

I've already download the lastest code from trunk (Irrlicht 1.8) ,build and running the examples.

How can i switch to Iphone or ipad,does anyone test successfully?

I try to create another project and make libirrlicht.a into ,also try to switch base sdk and architecture .
It seems the CIrrDeviceMacOS only can build under mac os but not iphone or ipad, also there are lots of places which incude <opengl/opengl.h>

Did i miss something ?
:x
codetiger
Posts: 103
Joined: Wed May 02, 2012 9:24 am
Location: Chennai, India
Contact:

Re: Irrlicht for IPHONE

Post by codetiger »

For iPhone, you need to download OpenGL ES branch from Irrlicht SVN.

here is the link for GL ES branch in svn. You can download the latest version by clicking on "Download tarball"

http://irrlicht.svn.sourceforge.net/vie ... es/ogl-es/
IrrNaCl - Irrlicht Port for Google Chrome Native Client - Demo

Iyan 3D - Make your own 3d animation using your iOS Device
zhengxianfu
Posts: 16
Joined: Thu Apr 05, 2012 9:33 am

Re: Irrlicht for IPHONE

Post by zhengxianfu »

Thanks, merci beacoup.

1 ,Download from ogl-es branch ,i noticed that has already updated to 1.8.0 ,thanks all of them.
2, Add include and sources into iphone window-based project.
3, Remove the .cpp or .c files if there is compile or link error. Almost 20-30files should be removed .

I will try to run the examles tomorrow and report my progress.
Nadro
Posts: 1648
Joined: Sun Feb 19, 2006 9:08 am
Location: Warsaw, Poland

Re: Irrlicht for IPHONE

Post by Nadro »

Please use project which exist under "sources/Irrlicht/iOS" (of course in ogl-es branch). Currently only OGL ES1 driver works without problems. When You'll create a window pleasu use external window parameter ID, eg:

Code: Select all

...
AppDelegate* tDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
Param.DriverType = video::EDT_OGLES1;
Param.WindowId = tDelegate.window;
...
// AppDelegate code example:

// HPP file

Code: Select all

#import <UIKit/UIKit.h>
#import <CoreMotion/CoreMotion.h>
 
@class EAGLView;
 
@interface AppDelegate : NSObject <UIApplicationDelegate> 
{
    UIWindow* window;
    
    @public
    EAGLView* glView;
}
 
@property (nonatomic, retain) IBOutlet UIWindow* window;
@property (nonatomic, retain) IBOutlet EAGLView* glView;
 
@end
// MM file

Code: Select all

#import "AppDelegate.hpp"
#import "GApp.hpp"
 
static GameApp* App = new GameApp(); // global main app class.
 
@implementation AppDelegate
 
@synthesize window;
@synthesize glView;
 
- (void)applicationDidFinishLaunching:(UIApplication*)application 
{
    [NSTimer scheduledTimerWithTimeInterval:1.0/60 target:self selector:@selector(applicationWillUpdate) userInfo:nil repeats:YES];
 
    App->init("");
}
 
- (void) applicationWillUpdate
{
    App->update();
}
 
- (void)applicationWillResignActive:(UIApplication *)application 
{
 
}
 
- (void)applicationDidBecomeActive:(UIApplication *)application 
{
 
}
 
- (void)applicationWillTerminate:(UIApplication *)application 
{
 
}
 
- (void)dealloc 
{
    [window release];
    [glView release];
    [super dealloc];
}
 
@end
// XIB file "MainWindow.xib"

Code: Select all

<?xml version="1.0" encoding="UTF-8"?>
<archive type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="7.10">
    <data>
        <int key="IBDocument.SystemTarget">528</int>
        <string key="IBDocument.SystemVersion">11D50d</string>
        <string key="IBDocument.InterfaceBuilderVersion">2182</string>
        <string key="IBDocument.AppKitVersion">1138.32</string>
        <string key="IBDocument.HIToolboxVersion">568.00</string>
        <object class="NSMutableDictionary" key="IBDocument.PluginVersions">
            <string key="NS.key.0">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
            <string key="NS.object.0">1181</string>
        </object>
        <object class="NSArray" key="IBDocument.IntegratedClassDependencies">
            <bool key="EncodedWithXMLCoder">YES</bool>
            <string>IBUIWindow</string>
            <string>IBUICustomObject</string>
            <string>IBUIView</string>
            <string>IBProxyObject</string>
        </object>
        <object class="NSArray" key="IBDocument.PluginDependencies">
            <bool key="EncodedWithXMLCoder">YES</bool>
            <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
        </object>
        <object class="NSMutableDictionary" key="IBDocument.Metadata">
            <string key="NS.key.0">PluginDependencyRecalculationVersion</string>
            <integer value="1" key="NS.object.0"/>
        </object>
        <object class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
            <bool key="EncodedWithXMLCoder">YES</bool>
            <object class="IBProxyObject" id="841351856">
                <string key="IBProxiedObjectIdentifier">IBFilesOwner</string>
                <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
            </object>
            <object class="IBProxyObject" id="191355593">
                <string key="IBProxiedObjectIdentifier">IBFirstResponder</string>
                <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
            </object>
            <object class="IBUICustomObject" id="664661524">
                <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
            </object>
            <object class="IBUIWindow" id="380026005">
                <reference key="NSNextResponder"/>
                <int key="NSvFlags">1316</int>
                <object class="NSMutableArray" key="NSSubviews">
                    <bool key="EncodedWithXMLCoder">YES</bool>
                    <object class="IBUIView" id="773737154">
                        <reference key="NSNextResponder" ref="380026005"/>
                        <int key="NSvFlags">1298</int>
                        <string key="NSFrameSize">{320, 480}</string>
                        <reference key="NSSuperview" ref="380026005"/>
                        <reference key="NSWindow"/>
                        <reference key="NSNextKeyView"/>
                        <object class="NSColor" key="IBUIBackgroundColor">
                            <int key="NSColorSpace">5</int>
                            <bytes key="NSCMYK">MSAxIDEgMQA</bytes>
                            <object class="NSColorSpace" key="NSCustomColorSpace">
                                <int key="NSID">3</int>
                            </object>
                            <characters key="NSComponents">1 1 1 1 1</characters>
                        </object>
                        <bool key="IBUIClearsContextBeforeDrawing">NO</bool>
                        <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
                    </object>
                </object>
                <object class="NSPSMatrix" key="NSFrameMatrix"/>
                <string key="NSFrameSize">{320, 480}</string>
                <reference key="NSSuperview"/>
                <reference key="NSWindow"/>
                <reference key="NSNextKeyView" ref="773737154"/>
                <object class="NSColor" key="IBUIBackgroundColor">
                    <int key="NSColorSpace">1</int>
                    <bytes key="NSRGB">MSAxIDEAA</bytes>
                </object>
                <bool key="IBUIClearsContextBeforeDrawing">NO</bool>
                <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
                <bool key="IBUIVisibleAtLaunch">YES</bool>
            </object>
        </object>
        <object class="IBObjectContainer" key="IBDocument.Objects">
            <object class="NSMutableArray" key="connectionRecords">
                <bool key="EncodedWithXMLCoder">YES</bool>
                <object class="IBConnectionRecord">
                    <object class="IBCocoaTouchOutletConnection" key="connection">
                        <string key="label">delegate</string>
                        <reference key="source" ref="841351856"/>
                        <reference key="destination" ref="664661524"/>
                    </object>
                    <int key="connectionID">4</int>
                </object>
                <object class="IBConnectionRecord">
                    <object class="IBCocoaTouchOutletConnection" key="connection">
                        <string key="label">glView</string>
                        <reference key="source" ref="664661524"/>
                        <reference key="destination" ref="773737154"/>
                    </object>
                    <int key="connectionID">9</int>
                </object>
                <object class="IBConnectionRecord">
                    <object class="IBCocoaTouchOutletConnection" key="connection">
                        <string key="label">window</string>
                        <reference key="source" ref="664661524"/>
                        <reference key="destination" ref="380026005"/>
                    </object>
                    <int key="connectionID">10</int>
                </object>
            </object>
            <object class="IBMutableOrderedSet" key="objectRecords">
                <object class="NSArray" key="orderedObjects">
                    <bool key="EncodedWithXMLCoder">YES</bool>
                    <object class="IBObjectRecord">
                        <int key="objectID">0</int>
                        <object class="NSArray" key="object" id="0">
                            <bool key="EncodedWithXMLCoder">YES</bool>
                        </object>
                        <reference key="children" ref="1000"/>
                        <nil key="parent"/>
                    </object>
                    <object class="IBObjectRecord">
                        <int key="objectID">2</int>
                        <reference key="object" ref="380026005"/>
                        <object class="NSMutableArray" key="children">
                            <bool key="EncodedWithXMLCoder">YES</bool>
                            <reference ref="773737154"/>
                        </object>
                        <reference key="parent" ref="0"/>
                    </object>
                    <object class="IBObjectRecord">
                        <int key="objectID">-1</int>
                        <reference key="object" ref="841351856"/>
                        <reference key="parent" ref="0"/>
                        <string key="objectName">File's Owner</string>
                    </object>
                    <object class="IBObjectRecord">
                        <int key="objectID">3</int>
                        <reference key="object" ref="664661524"/>
                        <reference key="parent" ref="0"/>
                    </object>
                    <object class="IBObjectRecord">
                        <int key="objectID">8</int>
                        <reference key="object" ref="773737154"/>
                        <reference key="parent" ref="380026005"/>
                    </object>
                    <object class="IBObjectRecord">
                        <int key="objectID">-2</int>
                        <reference key="object" ref="191355593"/>
                        <reference key="parent" ref="0"/>
                    </object>
                </object>
            </object>
            <object class="NSMutableDictionary" key="flattenedProperties">
                <bool key="EncodedWithXMLCoder">YES</bool>
                <object class="NSArray" key="dict.sortedKeys">
                    <bool key="EncodedWithXMLCoder">YES</bool>
                    <string>-1.CustomClassName</string>
                    <string>-1.IBPluginDependency</string>
                    <string>-2.CustomClassName</string>
                    <string>-2.IBPluginDependency</string>
                    <string>2.IBAttributePlaceholdersKey</string>
                    <string>2.IBPluginDependency</string>
                    <string>3.CustomClassName</string>
                    <string>3.IBPluginDependency</string>
                    <string>8.CustomClassName</string>
                    <string>8.IBPluginDependency</string>
                </object>
                <object class="NSArray" key="dict.values">
                    <bool key="EncodedWithXMLCoder">YES</bool>
                    <string>UIApplication</string>
                    <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
                    <string>UIResponder</string>
                    <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
                    <object class="NSMutableDictionary">
                        <bool key="EncodedWithXMLCoder">YES</bool>
                        <reference key="dict.sortedKeys" ref="0"/>
                        <reference key="dict.values" ref="0"/>
                    </object>
                    <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
                    <string>AppDelegate</string>
                    <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
                    <string>EAGLView</string>
                    <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
                </object>
            </object>
            <object class="NSMutableDictionary" key="unlocalizedProperties">
                <bool key="EncodedWithXMLCoder">YES</bool>
                <reference key="dict.sortedKeys" ref="0"/>
                <reference key="dict.values" ref="0"/>
            </object>
            <nil key="activeLocalization"/>
            <object class="NSMutableDictionary" key="localizations">
                <bool key="EncodedWithXMLCoder">YES</bool>
                <reference key="dict.sortedKeys" ref="0"/>
                <reference key="dict.values" ref="0"/>
            </object>
            <nil key="sourceID"/>
            <int key="maxID">11</int>
        </object>
        <object class="IBClassDescriber" key="IBDocument.Classes">
            <object class="NSMutableArray" key="referencedPartialClassDescriptions">
                <bool key="EncodedWithXMLCoder">YES</bool>
                <object class="IBPartialClassDescription">
                    <string key="className">AppDelegate</string>
                    <string key="superclassName">NSObject</string>
                    <object class="NSMutableDictionary" key="outlets">
                        <bool key="EncodedWithXMLCoder">YES</bool>
                        <object class="NSArray" key="dict.sortedKeys">
                            <bool key="EncodedWithXMLCoder">YES</bool>
                            <string>glView</string>
                            <string>window</string>
                        </object>
                        <object class="NSArray" key="dict.values">
                            <bool key="EncodedWithXMLCoder">YES</bool>
                            <string>EAGLView</string>
                            <string>UIWindow</string>
                        </object>
                    </object>
                    <object class="NSMutableDictionary" key="toOneOutletInfosByName">
                        <bool key="EncodedWithXMLCoder">YES</bool>
                        <object class="NSArray" key="dict.sortedKeys">
                            <bool key="EncodedWithXMLCoder">YES</bool>
                            <string>glView</string>
                            <string>window</string>
                        </object>
                        <object class="NSArray" key="dict.values">
                            <bool key="EncodedWithXMLCoder">YES</bool>
                            <object class="IBToOneOutletInfo">
                                <string key="name">glView</string>
                                <string key="candidateClassName">EAGLView</string>
                            </object>
                            <object class="IBToOneOutletInfo">
                                <string key="name">window</string>
                                <string key="candidateClassName">UIWindow</string>
                            </object>
                        </object>
                    </object>
                    <object class="IBClassDescriptionSource" key="sourceIdentifier">
                        <string key="majorKey">IBProjectSource</string>
                        <string key="minorKey">./Classes/AppDelegate.h</string>
                    </object>
                </object>
            </object>
        </object>
        <int key="IBDocument.localizationMode">0</int>
        <string key="IBDocument.TargetRuntimeIdentifier">IBCocoaTouchFramework</string>
        <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencies">
            <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS</string>
            <integer value="528" key="NS.object.0"/>
        </object>
        <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencyDefaults">
            <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS</string>
            <real value="1296" key="NS.object.0"/>
        </object>
        <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
            <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3</string>
            <integer value="3000" key="NS.object.0"/>
        </object>
        <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
        <int key="IBDocument.defaultPropertyAccessControl">3</int>
        <string key="IBCocoaTouchPluginVersion">1181</string>
    </data>
</archive>
for update game loop I use following trick:

Code: Select all

while(true)
{
NSAutoreleasePool* tPool = [[NSAutoreleasePool alloc] init];
while(CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.002f, TRUE) == kCFRunLoopRunHandledSource);
[tPool release];
 
if(!device->run())
break;
...
}
You can clean up upper code eg. glView. I hope it helps :) I used similar code in my app and works properly with latest OGL ES branch :)
Library helping with network requests, tasks management, logger etc in desktop and mobile apps: https://github.com/GrupaPracuj/hermes
zhengxianfu
Posts: 16
Joined: Thu Apr 05, 2012 9:33 am

Re: Irrlicht for IPHONE

Post by zhengxianfu »

I am newbie to ios development.So please forgive me the naive questions.

I shift to sources/Irrlicht/iOS, and build libirrlicht.a successfully,but there is no application or ui class.so i start a new project add reference to libirrlicht.a.

Where does the class GameApp come from ? if create a new c++ class ,add init/update method ,but i cannot using those code to init.

Code: Select all

 
(AppDelegate*)[[UIApplication sharedApplication] delegate];
Param.DriverType = video::EDT_OGLES1;
Param.WindowId = tDelegate.window;
 
I noticed that after application launches,start a new timer call applicationWillUpdate ,but where should i put those code,it is a while loop.

Code: Select all

 
while(true)
{
NSAutoreleasePool* tPool = [[NSAutoreleasePool alloc] init];
while(CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.002f, TRUE) == kCFRunLoopRunHandledSource);
[tPool release];
 
if(!device->run())
break;
...
}
 
So can you tell me the step in order to run my first example :D ?
Nadro
Posts: 1648
Joined: Sun Feb 19, 2006 9:08 am
Location: Warsaw, Poland

Re: Irrlicht for IPHONE

Post by Nadro »

You have to prepare Your own class similar to GameApp where You initialize engine in init and next code put into update. What about:

Code: Select all

while(CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.002f, TRUE) == kCFRunLoopRunHandledSource);
You need it in Your game loop code.
Library helping with network requests, tasks management, logger etc in desktop and mobile apps: https://github.com/GrupaPracuj/hermes
zhengxianfu
Posts: 16
Joined: Thu Apr 05, 2012 9:33 am

Re: Irrlicht for IPHONE

Post by zhengxianfu »

thanks Nadro.
Finally ,i get the syndey show in the ios simulator.
But , the logic of "beginScene" and "endScene " is in timer,are you sure it's the only way?
codetiger
Posts: 103
Joined: Wed May 02, 2012 9:24 am
Location: Chennai, India
Contact:

Re: Irrlicht for IPHONE

Post by codetiger »

Meanwhile, does the texture show up? Coz, I found a bug in opengl es 2.0 shaders. If you are using ES 1.1, you should see texture. Let me know if you want to try 2.0, I can give you simple solution to fix the shader problem.
IrrNaCl - Irrlicht Port for Google Chrome Native Client - Demo

Iyan 3D - Make your own 3d animation using your iOS Device
zhengxianfu
Posts: 16
Joined: Thu Apr 05, 2012 9:33 am

Re: Irrlicht for IPHONE

Post by zhengxianfu »

to codetiger
I just test es1.0 , the texture doesn't show up at first ,it is the problem of size (not power of 2),change to another texture.
Monday i will try es2.0. What kind of problem may i encouter?
I've encountered that the texutre doesn't show up under android (es2.0) ,is it the same problem?
codetiger
Posts: 103
Joined: Wed May 02, 2012 9:24 am
Location: Chennai, India
Contact:

Re: Irrlicht for IPHONE

Post by codetiger »

Yes, it's the Sam problem. The reason being useTexture array is always false in vsh and fsh. Hiding if(useTexture[0]) line in both shader will tempararily fix the problem
IrrNaCl - Irrlicht Port for Google Chrome Native Client - Demo

Iyan 3D - Make your own 3d animation using your iOS Device
Nadro
Posts: 1648
Joined: Sun Feb 19, 2006 9:08 am
Location: Warsaw, Poland

Re: Irrlicht for IPHONE

Post by Nadro »

You can disable a repeat in timer or just use performSelectorOnMainThread eg:

Code: Select all

[NSTimer scheduledTimerWithTimeInterval:0.0 target:self selector:@selector(applicationWillUpdate) userInfo:nil repeats:NO];
or use following code instead of upper code:

Code: Select all

[self performSelectorOnMainThread:@selector(applicationWillUpdate) withObject:nil waitUntilDone:NO];
I use second option in my game and works properly :)

Thanks a lot codetiger for found this bug :) It fixed problems with OGL ES2 on iOS too.
Library helping with network requests, tasks management, logger etc in desktop and mobile apps: https://github.com/GrupaPracuj/hermes
fmx

Re: Irrlicht for IPHONE

Post by fmx »

All this looks really messy
the way I update my engine within XCode loop is to just call my engine's Update and Render functions in the XCode sample template's update function, after removing all the original drawing and vertex-buffer code.
Much faster and easier to update each time Apple releases a new version of XCode and makes changes to their API or guidelines (which happens quite frequently actually)

And also

Code: Select all

NSAutoreleasePool* tPool = [[NSAutoreleasePool alloc] init];
while(CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.002f, TRUE) == kCFRunLoopRunHandledSource);
[tPool release];
This shouldn't compile, automatic reference counting means that [... release] commands would signal errors at the very least.
unless you intentionally disabled it?
Nadro
Posts: 1648
Joined: Sun Feb 19, 2006 9:08 am
Location: Warsaw, Poland

Re: Irrlicht for IPHONE

Post by Nadro »

Of course I disabled ARC ;) I don't like this feature.

This is depend on Your preferences. For example thanks to upper code my game doesn't need special design for run on iOS (only few lines required changes compared to a code for PC - Win, Lin, Mac). The second profit is that, that I don't care about Apple changes in API etc. because I use more low level API functions, which don't change :) I really don't like a platform specific templates.

Of course I commented only game loop code, because I know that an initialization code need clean-up, but current iOS port is still under development and that why require these messy tricks. Of course we'll fix it in future.
Library helping with network requests, tasks management, logger etc in desktop and mobile apps: https://github.com/GrupaPracuj/hermes
fluke9
Posts: 6
Joined: Sat Aug 04, 2012 12:13 pm

Re: Irrlicht for IPHONE

Post by fluke9 »

Hi there, i am also using the ogl-es branch for an iPhone game and realized that ES2.0 does not work correctly like described in that post.

However commenting out useTexture[0] in the shaders is NOT the solution !
I guess it went unnoticed by many because the error message for the "Cannot find uniform" is a widestring and outputted garbled in the debugwindow. ;)

The Problem lies deeper, it just does not get the uniforms correctly form the shader because arrays are represented by some drivers with an additional [0] to the name.
To find the uniform useTexture you have to look after useTexture and useTexture[0].

I fixed that (code below) and it renders just fine now, however the performance is really really bad.
30fps with 20k polys and GL ES 1.0 versus
5fps with GL ES 2.0 now :(

Anyone got an idea here ?! :roll:


Here is the hack to fix both issues :

In COGLES2SLMaterialRenderer.cpp replace the block beginning with:

Code: Select all

 
for ( int i = 0; i < UniformCount; ++i )
        {
            int j;
            for ( j = 0; j < num; ++j )
            {
                if ( names[j] == UniformStringTable[i] )
                    break;
 
...
 
with :

Code: Select all

 
        for ( int i = 0; i < UniformCount; ++i )
        {
            int j;
            for ( j = 0; j < num; ++j )
            {
                if ( names[j] == UniformStringTable[i] )
                    break;
 
                // XXX: hack, also search for name[0]
                core::stringc tempname = UniformStringTable[i];
                
                if ( names[j] == tempname + "[0]" )
                    break;
                
            }
            if ( j < num )
            {
                UniformInfo.push_back( uni[j] );
            }
            else
            {
                // XXX: hack
                //wchar_t buf[512];
                //swprintf( buf, 512, L"Unable to find uniform : %S", UniformStringTable[i] );
                
                char buf[512];
                sprintf( buf,  "Unable to find uniform : %s", UniformStringTable[i] );
                
                os::Printer::log( buf, ELL_WARNING );
                SUniformInfo blank;
                blank.location = -1;
                blank.type = GL_INVALID_ENUM;
                UniformInfo.push_back( blank );
            }
        }
 
hendu
Posts: 2600
Joined: Sat Dec 18, 2010 12:53 pm

Re: Irrlicht for IPHONE

Post by hendu »

Is that even legal (= compliant with GL ES standard)?

edit: It's not. Buggy drivers yay!

http://www.opengl.org/discussion_boards ... n-OpenGLES
http://www.khronos.org/opengles/sdk/doc ... cation.xml

The spec says _both_ "foo" and "foo[0]" refer to the first array element. And seems some mobile drivers only do one and some only the other. Sigh..
Post Reply