вторник, 30 июня 2009 г.

Song of the day :)



Замечательно поднимает настроение.


понедельник, 29 июня 2009 г.

DirectX + PhysX (English)


This is a lesson for English-speaking people and its just a copy of the same lesson on Russian language. First of all sorry for my bad English, but as I think, it is better to read this than text on Russian or text from Google translator.

I’ve wrote this translation in a cause of interest from other counties.


This lesson is about how to setup and work with PhysX with your DirectX based application and what problems you need to solve on this way. Also Ill give you information about how to create NxConvexMesh and NxTriangleMesh from DirectX mesh (.x) file data.


Introduction.


First of all read this. For this time everybody know physics engine named Nvidia PhysX (also Ageia PhysX some time ago), so Ill cut away briefing about it. One thing that you really need to understand PhysX is a free for you! But sources of it is not. If you don’t want to change PhysX core you can use it for free. All that you need is to insert some Nvidia logos in your product if it is commercial. More about licenses. Go here to download latest PhysX sdk.


About lesson.


There are some difficults for DirectX developers because there is no examples for DirectX in sdk (there is only one and bad example with dxut). Google can help you to find some few examples but they are for Ageia PhysX, and there are some troubles for newbie.

People in forums ofen answering like “Examples for DirectX and OpenGL are the same!”, but I say NO! They are wrong!)

What do you need? I am using MSVS C++ 2005 for coding, so you can try it too.


With what to start?


Try to run examples in sdk, to look how the magic makes -) Below you can see code of scene update.


 RenderCallback() {
...
gScene-gt;simulate(1.0f/60.0f);
...
}

Simply order of it looks like: making of scene object, making of physic object, translate objects to scene, then calling update in step.



Problems. Matrices.


First of all some words about VRD Visual Remote Debugger (also there is better program PVD PhysX Visual Debuger). With this utillites you can catch bugs in your program “on fly” and manipulate PhysX objects. It is really cool.

In VRD you can find some diffuculties because its using RHCS Right Hand Coordinate System, but in DX we are using LHCS, don’t forget it!

How to transform NxMat34 to D3DXMATRIX ? Ive searched answer for a long time -) But its really simple:


 //NxMat34 a;
a.getColumnMajor44( d3dMat );

And how to draw our graphic object at the right place, where PhysX object is? That’s simple too (if you know it!)):


 //NxActor* object; LPD3DXMESH* g_pObjectMesh;
D3DXMATRIX d3dMat;
taburet_object-gt;getGlobalPose().getColumnMajor44( d3dMat );
g_pd3dDevice-gt;SetTransform( D3DTS_WORLD, amp;matWorld );
g_pObjectMesh-gt;DrawSubset(0);


On this screenshots something wrong with matrices -)

VRD and your program, look for differences! ^_^

Problems. Meshes..


How to create mesh from model file? For newbies it is very strong problem cause many of them don’t really know how its works, many of them using DirecX meshes to forget about buffersindexestriangles so do I -) Thanks to Chillypacman, from Nvidia forum for help in understanding how it works and functions that are really work!)

In example we will use type vector (из namespace std).


So the magic functions are:

1. Function for getting array of vertices from LPD3DXMESH


 vectorlt;floatgt; GetVertices(LPD3DXMESH *g_pMesh )
{ vectorlt;floatgt; vertices; DWORD stride = D3DXGetFVFVertexSize((*g_pMesh)-gt;GetFVF()); BYTE* vbptr = NULL; (*g_pMesh)-gt;LockVertexBuffer(0, (LPVOID*)amp;vbptr); int ii = -1; for(int i = 0; i lt; (*g_pMesh)-gt;GetNumVertices(); i++) { ii++; D3DXVECTOR3* pos = (D3DXVECTOR3*)vbptr; vertices.push_back(pos-gt;x); vertices.push_back(pos-gt;y); vertices.push_back(pos-gt;z); vbptr += stride; } (*g_pMesh)-gt;UnlockVertexBuffer(); return vertices;
}

2. Function for getting array of indices:


 vectorlt;shortgt; GetIndices(LPD3DXMESH *g_pMesh)
{ LPVOID * ppData; DWORD stride = sizeof(short); BYTE* ibptr = NULL; short* indices = new short[(*g_pMesh)-gt;GetNumFaces() * 3]; vectorlt;shortgt; copy; (*g_pMesh)-gt;LockIndexBuffer(0, (LPVOID*)amp;indices); for(int i = 0; i lt; (*g_pMesh)-gt;GetNumFaces() * 3; i++) { copy.push_back(indices[i]); } (*g_pMesh)-gt;UnlockIndexBuffer(); return copy;
}

Before we continue lets speak about what Triangle Mesh and Convex Mesh is.

First object used only for static geometry and you cane use it for walls in your engine, but you need to know that Nvidia advice is to avoid of using it, its better to use simple objects like box everywhere you can.

Second object type is simple rounded mesh with maximum of 256 vertices that can be used for both static and dynamic objects. Its can be generated automatically ore loaded from file formats like Collada.



Now we can return to magic functions:


2. Function for generation of NxTriangleMesh:


 NxActor* GenTriangleMesh(NxVec3 pos, vectorlt;shortgt; indices, vectorlt;floatgt; vertices )
{ int NumVerticies = vertices.size() / 3; int NumTriangles = indices.size() / 3; //Create pointer for vertices NxVec3* verts = new NxVec3[NumVerticies]; int ii = -1; for(int i = 0; i lt; NumVerticies; i++) { ++ii; verts[i].x = vertices[ii]; verts[i].y = vertices[++ii]; verts[i].z = vertices[++ii]; } //Create pointer for indices NxU16 *tris = new NxU16[indices.size()]; for(int i = indices.size() - 1; i gt;= 0; i--) tris[i] = i; // Build physical model NxTriangleMeshDesc TriMeshDesc; TriMeshDesc.numVertices = NumVerticies; TriMeshDesc.numTriangles = NumTriangles; TriMeshDesc.pointStrideBytes = sizeof(NxVec3); TriMeshDesc.triangleStrideBytes = 3*sizeof(NxU16); TriMeshDesc.points = verts; TriMeshDesc.triangles = tris; TriMeshDesc.flags = NX_MF_16_BIT_INDICES ;//| NX_MF_FLIPNORMALS ; NxTriangleMeshShapeDesc ShapeDesc; NxInitCooking(); // Cooking from memory MemoryWriteBuffer buf; bool status = NxCookTriangleMesh(TriMeshDesc, buf); ShapeDesc.meshData = g_pPhysicsSDK-gt;createTriangleMesh(MemoryReadBuffer(buf.data)); NxActorDesc actorDesc; actorDesc.shapes.pushBack(amp;ShapeDesc); actorDesc.globalPose.t = pos; NxActor* act = g_pScene-gt;createActor(actorDesc); delete[] verts; delete[] tris; return act;
}

3. Function for generation of NxConvexMesh:


 NxActor* GenConvexMesh(const NxVec3amp; pos, vectorlt;floatgt; vertices, const NxReal density)
{ int i = 0; NxActorDesc actorDesc; NxBodyDesc bodyDesc; int numVertices = vertices.size() / 3; NxVec3* verts = new NxVec3[numVertices]; int ii = -1; for(int i = 0; i lt; numVertices; i++) { ++ii; verts[i].x = vertices[ii]; verts[i].y = vertices[++ii]; verts[i].z = vertices[++ii]; } // Create descriptor for convex mesh NxConvexMeshDesc convexDesc; convexDesc.numVertices = numVertices; convexDesc.pointStrideBytes = sizeof(NxVec3); convexDesc.points = verts; convexDesc.flags = NX_CF_COMPUTE_CONVEX; NxActorDesc actorDesc; NxInitCooking(); MemoryWriteBuffer buf; bool status = NxCookConvexMesh(convexDesc, buf); NxConvexShapeDesc* convexShapeDesc = new NxConvexShapeDesc(); convexShapeDesc-gt;localPose.t = NxVec3(0,0,0); convexShapeDesc-gt;materialIndex = 0; convexShapeDesc-gt;meshData = g_pPhysicsSDK-gt;createConvexMesh(MemoryReadBuffer(buf.data)); actorDesc.shapes.pushBack(convexShapeDesc); NxBodyDesc bodyDesc; if(!stat) { actorDesc.body = amp;bodyDesc; actorDesc.density = 1; } else actorDesc.body = NULL; actorDesc.globalPose.t = NxVec3(0, 0, 0); actorDesc.name = "boo"; NxActor* actor = g_pScene-gt;createActor(actorDesc); return actor;
}

Looks like this functions are the most common searched functions.


Problems with Cooking.h and Stream.h


Those headers are using in PhysX examples, but they are in different versions, and there are same problems with them, so I am giving you header (CookingStream.h) modified by my friend ASD (asddev.3dn.ru), his file is a mix of those two files and works pretty good.

You can find it in archive to lesson.


Additional:


How to use VRD (or PVD) in your program? Its simple indeed, copy this code in header where your PhysX initializing:


 #define SAMPLES_VRD_HOST "localhost"
#define SAMPLES_VRD_PORT NX_DBG_DEFAULT_PORT
#define SAMPLES_VRD_EVENTMASK NX_DBG_EVENTMASK_EVERYTHING
int gAppData;
void vrd_init()
{ NxRemoteDebugger* pRemDeb = g_pPhysicsSDK-getFoundationSDK().getRemoteDebugger(); pRemDeb-connect(SAMPLES_VRD_HOST, SAMPLES_VRD_PORT, SAMPLES_VRD_EVENTMASK); if (pRemDeb-isConnected()) { pRemDeb-createObject(gAppData, NX_DBG_OBJECTTYPE_GENERIC,"AppData", NX_DBG_EVENTMASK_EVERYTHING); pRemDeb-writeParameter("Info text", gAppData, true,"Info", NX_DBG_EVENTMASK_EVERYTHING); pRemDeb-createObject(gAppData+1, NX_DBG_OBJECTTYPE_VECTOR,"AVector", NX_DBG_EVENTMASK_EVERYTHING); pRemDeb-writeParameter(NxVec3(0, 0, 0), gAppData+1, true,"Origin", NX_DBG_EVENTMASK_EVERYTHING); pRemDeb-writeParameter(NxVec3(1, 1, 1), gAppData+1, true,"Extent", NX_DBG_EVENTMASK_EVERYTHING); pRemDeb-addChild(gAppData, gAppData+1, NX_DBG_EVENTMASK_EVERYTHING); // Tells our application that we have created the VRD object // and that it is ok to set information in it gAppData = 1; }
}

After PhysX initialization call vrd_init();. Now if you ran VRD before your program starts, your program will automatically be connected to VRD.


What is in the archive?


My sample based on example for Ageia NovodeX (first name of PhysX) from CodeSampler.com, there are few things that you need to change in their lesson:

1. from project properties you must remove Physics.lib. Also you need to copy PhysXLoader.lib,nxcooking.lib,NxCharacter.lib to project folder and too connect library’s use:



 #pragma comment(lib, "physxloader.lib")
#pragma comment(lib, "nxcooking.lib")
#pragma comment(lib, "NxCharacter.lib")


2. In compilation you may see error in function initNovodeX() where you need to remove those lines:

sceneDesc.broadPhase = NX_BROADPHASE_COHERENT;

sceneDesc.collisionDetection = true;

So everything will run now!

Screenshot from my example.


P.S.


So there is a point where my lesson ends -) Enjoy it!

Thanks to ASD and Chillypacman for their help again. You can also see Chillypacmans solution HERE

Thanks to Nvidia for free PhysX!

And… sorry for my bad English again)


Wow, and archive!! - dx9_novodex_simple_derivedbycrol

суббота, 27 июня 2009 г.

Morning Flat – Индикатор пробоя утреннего флэта.


Morning Flat Индикатор пробоя утреннего флэта в свободном доступе здесь.



Параметры:


StartHour час начала утреннего флэта


EndHour час окончания утреннего флэта


TargetLevel целевой уровень сетки Фибоначчи, взятый от ширины канала утреннего флэта


© ChartMaster


Posted in Обзор индикаторов

пятница, 26 июня 2009 г.

Введение.


Это сообщение появилось здесь, ибо я так захотел. Публиковаться тут будут мои сумасшедшие идей касательно рекламы и финансовой сферы. Это все для души, но если, кто заинтересуется моими разработками, то прошу на чашку чая и на подписание контракта.


Всем удачи. С уважением, Алекс.

среда, 24 июня 2009 г.

ПОСЛЕДНИЙ ДИКТОР РЕСПУБЛИКИ НЕМЦЕВ ПОВОЛЖЬЯ, Продолжение

...Придя по заданию редакции к Якобу Шмалю, я вспомнила, что уже видела этого человека. Три года назад он, только что переселившийся в ФРГ из Уфы, выступал на литературном вечере для переселенцев, читал один из своих рассказов. Шмаль – автор опубликованной в 1995 году в Москве на немецком языке книги «Чаша выпита до дна» - удивил своей простотой и скромностью. В нем не было ничего от «мэтра»: ни царственного величия, ни усталой снисходительности к нашей, как всегда, пестрой во всех отношениях аудитории. Он ни словом не обмолвился, что его книгу прочитали и отметили многие люди. С ней знакомы и читатели Германии. Он показал мне отзыв на книгу, который получил еще находясь в Уфе. (Текст привожу в переводе на русский язык):
«Федеративная Республика Германия, канцлер ФРГ,
Господину Якобу Шмалю, Башкортостан, Уфа, ул.Правды 34:

Многоуважаемый господин Шмаль!
Я получил книгу Ваших воспоминаний «Чаша выпита до дна», которую вы мне любезно прислали. Ваша книга – потрясающий документ, который дает впечатляющее описание судеб российских немцев в Советском Союзе, особенно в период сталинской диктатуры. Этим Вы внесли свой вклад в то, чтобы не померкла память о жертвах насилия и войны. Одновременно Ваша книга – проникновенная заключительная речь адвоката в защиту человечности и примирения между народами. Вы сами, несмотря на тяжелые удары судьбы, никогда не теряли своих убеждений. Я желаю Вам, чтобы Ваша честная позиция нашла заслуженную поддержку.
С пожеланиями радости и успеха в Вашем дальнейшем творчестве.

Гельмут Коль

Якоб Шмаль не дожил до своего 80-летия год, а тогда, когда я беседовала с ним в его берлинской квартире, ему было 77. Несмотря на груз лет, пять лагерей и две сложнейшие операции на сердце, этот человек с ясным, открытым взглядом голубых глаз не производил впечатления старого человека, напротив, он был очень бодрым и активным. Последний диктор Республики немцев Поволжья, журналист, писатель, а также вальщик леса, молотобоец, табельщик, возчик, сплавщик, нормировщик управления буровых работ, инженер, начальник отдела труда и зарплаты...
Он родился в 1923 году в селе Гримм на берегу Волги. Гримм, которому недавно исполнилось 240 лет, в начале 20-х годов был крупным (около 1000 дворов) поселком, как бы сейчас сказали городского типа – ухоженным и благополучным. В селе работали МТС, государственная мельница, четыре школы и даже завод «Рекорд», производивший станки и бытовую технику. Повальное раскулачивание и сильнейший голод в Поволжье в 1932-1933 годах привели к гибели сотен жителей поселка. Его население заметно поредело. Но вскоре, благодаря усердному труду и хозяйскому отношению к делу, Гримм поднялся на ноги. Село, как и Республика немцев Поволжья в целом, было оснащено передовой по тем временам сельскохозяйственной техникой, поэтому урожайность здесь была значительно выше, чем в соседних ненемецких хозяйствах.
Якоб учился в гриммской образцовой средней школе, широко известной своими традициями в республике. В ней преподавали замечательные педагоги – мастера своего дела, которые привили Якобу любовь к родному языку и литературе. Кстати, слушая его рассказы о своей жизни, я не могла не заметить, что почти каждый эпизод он иллюстрировал образцами из классической немецкой поэзии, особенно стихотворениями и балладами горячо любимого им Шиллера. Читал он совершенно свободно и по памяти. Как проникновенно и торжественно он декламировал: звонко, четко, в пружинящем ритме лились чеканные строки! «Конечно, - подумала я – чувствуется опыт диктора». Однако, дело не только в профессии, но и в большом чувстве, которое он пронес через всю свою жизнь, как и любовь к «малой родине» - Гримму, и которое помогло ему выстоять, не сломаться, выжить в тяжелые годы депортации, трудармии и спецпоселения.
В 11 лет Якоб лишился отца. Будучи старшим сыном в семье, начал работать на сельхозучастке, чтобы помочь матери растить младших детей. В десятом классе начал сотрудничать с газетами разных кантонов республики. В 1939 году был зачислен в штат редакции газеты «Большевик» в Энгельсе. «Я не был отличником, - вспоминал Шмаль, - но языком владел лучше всех в классе, как говорится, чувствовал родную речь. Учителя всегда отмечали мои сочинения». Может быть, именно поэтому, выдержав невероятно сложный конкурс, был принят в Радиокомитет Немецкой республики диктором. Было ему в ту пору чуть больше 16 лет. Работая в Энгельсе, начал осваивать русский язык. Мечтал стать артистом или дипломатом...
Война оборвала успешно начавшуюся карьеру. Осенью 1941 года Шмаля в числе первых депортировали в Сибирь. За день до этого он в последний раз вышел в эфир – с передачей о подвиге красноармейца Генриха Гофмана. Уроженец Поволжья Гофман попал в плен к фашистам и был ими зверски замучан. После этой передачи радиостанция Немецкой республики на Волге замолчала. Как выяснилось позже, навсегда.
Долгих десять дней состав с вагонами, предназначенными для перевозки скота, а теперь забитый до отказа людьми, тянулся на восток. По приезде в далекий Канск все 2338 человек, находившиеся в составе, были выброшены прямо на вокзале под открытое небо. Ночевать пришлось в парке под проливным дождем. А наутро начались торги: колхозники выбирали себе дармовую рабочую силу. Естественно, брали те семьи, где было много молодых и крепких рук, малодетные семьи и пожилые люди ждали решения своей участи до позднего вечера. Несмотря на унизительную процедуру «работорговли», Шмаль сохранил теплое чувство к людям, приютившим вынужденных переселенцев в колхозе «Красное озерко». Деревенька поразила своей ужасающей бедностью. Тем не менее, все ее жители отнеслись к немцам столь радушно, что их сердца начали оттаивать. Пока сооружали себе какое-то подобие жилища на опушке леса, Шмаль, примкнув в пути к одной из семей земляков, жил вместе с ними у одной супружеской пары. «Сын хозяев воевал на фронте с немцами, фашистами, врагами, а они относились к нам, немцам-квартирантам по-человечески, с уважением и сочуствием. Никогда не забуду этих гостеприимных, добрых людей!» – говорил Шмаль.

вторник, 23 июня 2009 г.

воскресенье, 21 июня 2009 г.

Rob Hefferan


Совершенно изумительные рисунки Роба.


De034De025De024De018fDe002De001


Posted in Мастера Tagged: рисунки, Rob Hefferan