Wednesday, December 12, 2012

lua string to table

I couldn't find a clear way to do this... the entire bullshit that everyone always does is just reference the damn wiki. Which is about as clear as mud. I hate it when programmers assume you're already a programmer.

in anycase given a string like
myString = "this is a long string"
and you want to turn this into an array of letters
like myArray = {t,h,i,s, ,i,s, , a, ,l,o,n,g, ,s,t,r,i,n,g}
for reasons of being able to do things based on each letter.

you should do this:

myArray = {} -- make empty array
for i = 0, #myString do -- #myString is the length of the string
    local s = string.sub(myString,i,i) -- gets the character at location i in the string
   myArray[i] = s -- assigns the table[i] to the character which was returned to s
end


that's it... a clear example with, imagine that!

Tuesday, November 6, 2012

String^ to const char* C++/CX

So today I was looking to convert a textBox text field into a const char to use as an IP address to send data to. This wasn't exactly easy to find any info on so I had to write this post.

First I needed to get the String^ from the textBox xaml object like this
String^ s = IPAddress->Text;
this assumes that the textBox is named "IPAddress".
then make a size_t object and i'll call it i, this was needed to set the data size for the wcstombs_s function at the end. Not exactly sure what this is used for, but this is working, so if anyone has any good understanding of this function then please fill me in down in the comments below.

String^ s = IPAddress->Text;
size_t   i;
const wchar_t* cw = s->Data();
char *c= new char[s->Length()+1];
memset(c,0,s->Length()+1);
wcstombs_s(&i, c, (size_t)s->Length()+1,  s->Data(), (size_t)s->Length()+1 );
SomeClientFunction.SetIPAddress(c);

then I make the const wchar_t* pointer and use the s->Data() to satisfy that.
then i make a new char[] array with the length of the String^ this is pretty simple. so char[s->Length() + 1] is how that's done.
then I have to allocate the memory for the char*c using memset, pretty easy here.
then the weird wcstombs_s which is needed since wcstombs was depricated, so i needed to use the safe version of it to get past the WinRT checks. I guess this is a memory security thing.
now the new safe version of the function asks for the &i which im not sure what does, then you add in the target char array then set a size, then give it a source using s->Data(), then tell it how long that array is.
and that's that, worked for me!

I'll also note that my SomeClientFunction was expecting (const char * ip) in it's args.

I just use this blog to help remind me how I did things in general.

hope this helps someone.

edit:
So the &i is a returned value that's the size of the actual c in this case. Since c could actually be shorter than the original size allocated for it when using some other methods to create the size of c.

Friday, October 5, 2012

Dealing with create_task in WinRT using C++/CX


Getting into Windows8 C++/CX

Tutorials and introductions to C++/CX
http://msdn.microsoft.com/en-us/library/windows/apps/hh465045.aspx
from that link:
"When you use Windows Runtime objects, you're (typically) using C++/CX, which provides special syntax to create and access Windows Runtime objects in a way that enables C++ exception handling, delegates, events, and automatic reference counting of dynamically created objects. When you use C++/CX, the details of the underlying COM and Windows architecture are almost completely hidden from your app code. For more information, see C++/CX Language Reference. However, you can also program directly against the COM interfaces by using the Windows Runtime C++ Template Library."
"You're primarily programming against a new, easy-to-navigate, object-oriented API, the Windows Runtime, although Win32 is still available for some functionality."
Some functionality has me concerned as the threading and concurrency namespaces are useful for what we were doing in the previous C# version.
This continues into a tutorial about what the different components in a new project are. The partial ref and auto keyword are also mentioned in breif detail.
in the first paragraph of that page there were a couple of links to the C++/CX language reference including...
as a note the example shows Grid^ grid = ref new Grid(); the ^ is used when dealing with anything that uses ref new to create;
I guess this feels sort of like

int s = int(0);
int *i = &s;

where when a pointer is used you need to use a reference operator to get the value at the address of a pointer.
in my test i wrote the following.

auto grid = ref new Grid();//this is the same as Grid^
grid->Width = 600;
grid->Height = 500;
auto red = ref new SolidColorBrush(Colors::Red);
grid->Background = red;
if(grid->Parent == nullptr)
{
LayoutRoot->Children->Append(grid);
}

One important thing is that Colors::Red is not Colors->Red. As -> points to properties of a class and :: points to static members of a class.
"In the most basic sense, a ref class is a COM object that implements the IInspectable interface and whose lifetime is managed by a smart pointer."
"The partial keyword tells the compiler that the declaration of this class is continued in another code file."
good to know, sort of nice you can break up a big source file into a few small ones.

"If you, the programmer, have to add variables or functions to the MainPage class, do so in MainPage.xaml.h and MainPage.xaml.cpp." As you normally would.
"If the XAML editor has to add variables or other boilerplate code, it does so in the *.g.h and *.g.hpp files."

I've got to find where the .g. files are hiding in our project, I'm pretty sure I saw them somewhere, but i'll check if adding things into these files will allow for better cross talk between the C++ and C++/CX stuff.

"In general, you can safely ignore the *.g.* files. That's why Solution Explorer hides them by default."
Hey, hiding them by default? What if we, the programmer, need to edit the xaml?? WTF. Weird I can't find these files. oh well, moving on...
further down in the post there's a special include for

#include <ppltasks.h>

I didn't catch this include before, wasn't in any documentation other than the tutorial. Things like this can't be missed so I think something that important should be a bit more highlighted.

auto grid = ref new Grid();
grid->Width = 600;
grid->Height = 500;
auto red = ref new SolidColorBrush(Colors::Red);
grid->Background = red;

create_task([grid]{
grid->Height = 100; //this throws an error
}).then([grid]{});

if(grid->Parent == nullptr)
{
LayoutRoot->Children->Append(grid);
}

In the previous test code I found that this throws an error when trying to execute anything inside of the lambda in the create_task function. The red squiggle under the [grid] says a local lambda is not allowed in a member function of a WinRT class. Not sure why that is.
expanding on the create_task function. In

I created the following code to stick a wait timer.
auto i = 0.5;

create_task([this, i]{
auto thispage = this;
        thispage->Dispatcher->RunAsync(
CoreDispatcherPriority::Normal,
ref new DispatchedHandler([thispage,i]()
       {
thispage->GridControlElement->Opacity = i;
       }));
wait(SomeRandomInteger); //a static global variable.
}).then([this, i]{
auto thispage = this;
        thispage ->Dispatcher->RunAsync(
CoreDispatcherPriority::Normal,
ref new DispatchedHandler([thispage]()
        {
thispage->GridControlElement->Opacity = 1.0;
        }));
});

So this is scoped as the page that the create_task lives within. It's then passed through the lambda into the create_task function I also added an number value to see how that will work when passed into the [this,i] part of the create_task.

Then I created another auto so that this can be used as thispage. so now the create_task has access to elements on the page. so then we can create a new DispatchedHandler and pass along another referenced task.

Elements in the thispage reference can be accessed and modified asynchronously from the rest of the UI.
So after some amount of time while the wait is running, the UI element will be mostly translucent. then after the timer is up it goes back to being fully opaque.

all the while the wait is running the rest of the interface is doing just fine.

Adding this into a touch event...

http://msdn.microsoft.com/en-us/library/windows/apps/hh699871.aspx
from that link:
"Visual C++ component extensions (C++/CX) is a set of extensions to the C++ language that enable the creation of Windows Store apps and Windows Runtime components in an idiom that is as close as possible to modern C++. Use C++/CX to write Windows Store apps and components in native code that easily interact with Visual C#, Visual Basic, and JavaScript, and other languages that support the Windows Runtime. In those rare cases that require direct access to the raw COM interfaces, or non-exceptional code, you can use the Windows Runtime C++ Template Library (WRL)." and "Windows Store DirectX games and graphics-intensive apps. For more information, see Create your first Windows Store app using DirectX." the DirectX + Xaml are the core of what we're doing. also, that page has a "quick reference" for the other components for C++/CX

A collection of links to various C++/CX documentation dealing with the new extensions for WinRT

http://blogs.msdn.com/b/vcblog/archive/2012/08/29/cxxcxpart00anintroduction.aspx
http://sridharpoduri.com/2012/08/13/programming-windows-8-applications-using-c-cxan-update-on-the-book/

Thursday, October 4, 2012

Timers in windows8 using c++


Just getting a basic timer in c++ isn't as easy as in C#.
So I'm stepping myself through this and documenting my findings.
I just want to start a timer on a touch event to fade out a control when the finger leaves the screen.
So to do this I want that control to wait for a few seconds before going back to it's home position.
I could use wait, but then the rest of the screen locks up till after the wait.
Since I want to use multi touch features this is bad.
The best way to do this *I think* is concurrency and the call function, but finding a good example for this has been really hard.

http://msdn.microsoft.com/en-us/library/dd504870.aspx I started here to get a start on the concurrency run time.
Also writing a windows 8 metro app in WPF, so that's adding some little hitches here and there with various features that I can and can't use.
Also can't use 3rd party libs like boost.asio which is because the client doesn't like those things, doh.
Google for running multuple tasks and I get to
this link http://msdn.microsoft.com/en-us/library/dd728065.aspx.
In here was the following code snippet...

int wmain()
{
// Create a call object that prints a single character to the console.
call<wchar_t> report_progress([](wchar_t c) {
wcout << c;
});
// Create a timer object that sends the dot character to the  
// call object every 100 milliseconds.
timer<wchar_t> progress_timer(100, L'.', &report_progress, true);
wcout << L"Performing a lengthy operation";
// Start the timer on a separate context.
progress_timer.start();
// Perform a lengthy operation on the main context.
perform_lengthy_operation();
// Stop the timer and print a message.
progress_timer.stop();
wcout << L"done.";
}

This looked pretty helpful. There's the call and the timer functions that look pretty good.
Unfortunately in report_progress([] (wchar_t c) {...} there's a lambda and I get the following error

Error: a local lambda is not allowed in a member function of a WinRT class.

damn.

So now what? Dig around more for timer class in WinRT and I find
http://social.msdn.microsoft.com/Forums/en-US/winappswithnativecode/thread/fd9c3010-484b-4881-88c8-765473fd5b1e
What's going on here?

Instead of SetTimer(), you should use Windows::UI::Xaml::DispatcherTimer.
See the MSDN article here: http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.dispatchertimer.aspx.

Okay, so lets go there.
http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.dispatchertimer.aspx.
and...

Server Error in '/' Application.
The resource cannot be found.Description: HTTP 404. The resource you are looking for (or one of its dependencies) could have been removed, had its name changed, or is temporarily unavailable.  Please review the following URL and make sure that it is spelled correctly. Requested URL: /en-us/library/windows/apps/windows.ui.xaml.dispatchertimer.aspx.

Crap, so look up xaml dispatch timer and get to  http://msdn.microsoft.com/en-us/library/windows/apps/xaml/windows.ui.xaml.dispatchertimer
I think im getting closer. This is looking a bit better, something that seems to be useful, finally.
I just used this in C# for the previous version of the interface I was building in C#, perfect!
I think I can use this. The example is in C# so i need to find a C++ example,
get to this http://social.msdn.microsoft.com/Forums/en-US/winappswithnativecode/thread/edff3bf2-4223-49fe-b66b-119702458700
The thread goes through a few iterations. I get to what I think is really close but get stuck at.

timer->Tick += ref new  Windows::Foundation::EventHandler<Object^>(this, &DispatcherTimer_Tick); 

I get an error:

object not needed for the specified function

So I delete "this" and the following "," and that seems to do the trick.
No more errors...
So I start my vars with...

Windows::UI::Xaml::DispatcherTimer ^SomeTimer;

and then add in a way to count ticks...

int Ticks;

and when the xaml page is initialized i add in

XAMLPage()
{
InitializeComponent();
//other init stuff...
SomeTimer = ref new DispatcherTimer;
SomeTimer->Tick += ref new  Windows::Foundation::EventHandler<Object^>( &Timer_Tick); 
TimeSpan t;
t.Duration=1;
SomeTimer->Interval = t;
}

Then I precede the page initialization with my Timer_Tick function that looks something like...

void Timer_Tick(Platform::Object^ sender, Platform::Object^ e)
{
OutputDebugString(L"TIMER!!!");
Ticks++;
if(Ticks>10)
SomeTimer->Stop();
}

so after 10 ticks the timer stops.

I'm far from a super c++ programmer, and mostly a C# or unrealscript game programmer guy.
I've been doing this stuff for a while and I learn fast, and that's pretty important.
I do these little process blog entries to help myself out.
It's like a breadcrumb trail I can follow to avoid backtracking.
Hope this helps someone.

Tuesday, September 11, 2012

Working in Windows 8

So the first weird thing that's bugging me is the mix of windows desktop and windows8 metro apps. When i alt tab i get all of the different apps running. Chrome has two versions, one for wen i use the metro icon to launch it, then another when i launch it from the task bar in the desktop. With a few different desktop apps and a single metro app running you can do this weird split desktop thing. I'm not sure that it makes a whole lot of sense just yet. Especially since you can use both sides at the same time.

Really weird. This is going to need some more development time by everyone involved. The apps need to have a sort of scrunched up in a margin mode so they can remain useful. Something to think about when making a metro app I guess.



The little column on the right is some other app... since it's all white, i don't know what it is...

Thursday, May 24, 2012

FarseerPhysicsXNA, just getting things to work.

So almost all of their documentation on codeplex.com refer to version 2.0, and using 3.0 a lot of functions seem to have been changed. Also, they forgot that a part of a release is documentation, so imo, they're far from done.

DebugView, why doesnt debugview work?
oh because their example refers to their sample project. Which would be great, if I had started with their project.

So now i have to either incorporate my project into their project or take parts of their overly complex sample project and incorporate it into mine.

Damnit.

Monday, May 14, 2012

xna file updates in windows phone 7.1

getting models to load into the content
So i managed to get the model into the phone at least once, but from there on out when I update the fbx the model doesn't get updated. Having this issue is pretty annoying. Even more awkward, if I load in a different model, nothing is displayed at all, but the load function doesn't error. So what's going on? Is the model too big, too small, not enough documentation on how the fbx should be setup for me to figure out what's wrong with the model.
so

Debug.WriteLine("mesh info>> " + ball.Meshes.Count.ToString());

tells me that

mesh info>> 0

So even more annoying is that Visual Studio doesn't always like to re-process the model into it's xnb when the file is updated. I think it's deciding that the fbx's time stamp hasn't changed enough for it to bother. Annoying so i have to use an A and B to keep switching between the two so it'll pick a different file altogether to load to force it to load the model as a new model.

So it's running fine, I'm just finding that visual studio has a bad habbit of ignoring file updates when building the xnb files from the fbx files. annoying to say the least.

Interestingly enough though a primitive that's 1000 units across seems to be about the correct size to take up most of the center of the screen on the phone. 100 units is a small object on the screen. but my camera was 5000 units away, moving it to about 1000 units away from the origin made a big difference but the object is also a bit more distorted with perspective.

In anycase, if you're having issues with models updating then try changing the name of the file you're loading. seems like the file doesn't always update. when the fbx is changed.

rxokita's shared items