Author Topic: Utilities from a Tiranas  (Read 990 times)

0 Members and 1 Guest are viewing this topic.

Offline Nikolas - WS3D Developer

  • Programmer
  • Global Moderator
  • Marquess
  • *
  • Posts: 880
  • Reputation 61
Re: Utilities from a Tiranas
« Reply #105 on: August 07, 2018, 07:48:34 PM »
wNodeSetRenderFromIdentity
Quote
render mesh ignoring its transformation.
Culling is unaffected.

wNodeGetJointById
Quote
Get a pointer to a joint in the mesh (if the mesh is a bone based mesh).

With this method it is possible to attach scene nodes to joints for example possible to attach a weapon to the left hand of an animated model.
 Please note that the joint returned by this method may not exist before this call and the joints in the node were created by it.

Returns:
    Pointer to the scene node which represents the joint with the specified name. Returns 0 if the contained mesh is not an skinned mesh or the id of the joint could not be found.

wNodeGetJointsCount
Quote

Gets joint count.

Returns:
    Amount of joints in the mesh.

wNodeSetJointSkinningSpace
Quote
How the relative transformation of the bone is used.

Там есть структура:
Code: [Select]
type wBoneSkinningSpace as UInt32
Enum
wBSS_LOCAL =>[b] local skinning, standard [/b]
wBSS_GLOBAL =>[b] global skinning [/b]
wBSS_COUNT
end enum

wNodeGetJointSkinningSpace-возвращает режим скиннинга нода с прикрепленным к нему анимированным мешем.

-------------------------------
wMeshSetVerticesSingleColor
Тут надо пояснить.
Процедура устанавливает цвет вершин (вертексов) данного меша mesh.
iFrame-номер фрейма анимации данного меша. Обычно берется 0.
verticesColor-собственно цвет для окраски вершин.
groupCount. Этот параметр равен нулю, то окрашены будут ВСЕ вершины меша, точнее, все вершины мешбуффера данного меша с индексом iMeshBuffer
(у меша может быть сколь угодно много мешбуфферов, потому как в один мешбуффер не может поместиться более 65536 вершин, это предел)
Если параметр groupCont!=0,  тогда окрашиваются все вертексы, номера которых лежат в диапазоне от startPos до endPos.

--------------------------------------
wBspGetVarGroupVariableSize
group-указатель на так называемую ГРУППУ ПЕРЕМЕННЫХ. Таких групп в "листе сущностей"  (Entity List) данной bsp-карты может быть много.
Каждая группа может иметь несколько переменных (Variables).
Данная функция возвращает число таких переменных у данной ГРУППЫ ПЕРЕМЕННЫХ.

wBspGetVariableValueAsVec
-считывает значение "переменной" variable в 3d-вектор.
Примечание: для доступа к данной "переменной" из ГРУППЫ ПЕРЕМЕННЫХ следует воспользоваться функцией wBspGetVariableFromVarGroup

wBspGetVariableValueAsFloat
-считывает значение "переменной" variable как вещественное число.

----------------------------
wVideoGetSoundNode-возвращает указатель на звуковой нод (wSound) из загруженного видео (тип wVideo). Может пригодиться, если, например потребуется отрегулировать громкость воспроизведения видеоклипа. Не рекомендуется использовать в данном случае функции типа wSoundSetPitch и подобные (может привести к рассинхронизации видео и звука).

wVideoUpdate-процедура обновления видео. Обязательна к использованию в игровом цикле.

wVideoGetFramePosition-возвращает номер проигрываемого в данный момент "кадра" или фрейма видеоклипа.

wVideoGetTimePosition -возвращает время, прошедшее от начала воспроизведения.

wVideoGetFrameSize-возвращает размер воспроизводимого видеоклипа (высота и ширина).

wVideoGetQuality-возвращает:
Quote
Nominal quality setting, 0-63

---------------------------
wDecalsClear-удаляет все декали из сцены и делает невозможным появление новых

wDecalsDestroyAll-удаляет все декали из сцены.

wDecalsCombineAll-соединяет все текущие декали сцены в ОДИН (распространяется только на декали, имеющие "бесконечное" время жизни).

Пожалуй, на сегодня с меня хватит....
Под лежачий камень мы всегда успеем...

Offline Vuvk

  • Friends
  • Baron (-ess)
  • *
  • Posts: 344
  • Reputation 34
  • Lokemundux Desco Domus Shaantitus
Re: Utilities from a Tiranas
« Reply #106 on: August 08, 2018, 07:47:32 AM »

Quote
(у меша может быть сколь угодно много мешбуфферов, потому как в один мешбуффер не может поместиться более 65536 вершин, это предел)
Это уточнение натолкнуло меня на мысль, что нужно бы на досуге код загрузчика воксельных моделей подшаманить, чтобы обойти ограничение по загрузке больших моделей, разделив общее количество вершин на мешбуфферы.

Crudux Cruo!

Offline Tiranas

  • Friends
  • Esquire
  • *
  • Posts: 67
  • Reputation 35
  • Совсем Тёмный.
Re: Utilities from a Tiranas
« Reply #107 on: August 08, 2018, 08:54:50 AM »
Vuvk
Доброго времени суток.

Поддержка воксельной технологии планируется?
Я просто недавно хотел, как раз замутить несколько воксельных уровней.
Людям с более широким кругозором ведомо, что четкой границы между реальным, действительным и ирреальным воображаемым не существует, что каждый из нас, благодаря тонким физиологическим и психологическим различиям, воспринимает все явления по-своему. (Говард Филлипс Лавкрафт)

Offline Nikolas - WS3D Developer

  • Programmer
  • Global Moderator
  • Marquess
  • *
  • Posts: 880
  • Reputation 61
Re: Utilities from a Tiranas
« Reply #108 on: August 08, 2018, 09:17:53 AM »
Привет, Vuvk!
Quote
разделив общее количество вершин на мешбуфферы....
Интересно, а как ты будешь определять, какие индексы (Indices) принадлежат каким вертексам (Vertices)?
Мы, кажется, уже толковали об этом....

Привет, Тiranas!
Quote
Поддержка воксельной технологии планируется?
Уже давно готово.

Вот, можешь в новой версии обкатать. Создай файл *.bas, сохрани в папку с примерами и скопируй туда:
Code: [Select]
'----------------------------------------------------------------------------
'' Пример сделал Антон Щербатых (aka Vuvk)
'' Адаптировал Nikolas (WorldSim3D developer)
'' ----------------------------------------------------------------------------
'' Пример 131: Пример демонстрирует работу загрузчика Voxel-моделей (формат программы Magica Voxel)
'' Автор загрузчика- Vuvk, подробности здесь:
'' http://worldsim3d.com/Forum/index.php?topic=324.0
'' ----------------------------------------------------------------------------

'#define __STATIC__

#Include "../Include/WorldSim3D.bi"
#include "../Include/SampleFunctions.bi"

'///Defines
#define GUI_CHECK_BOX_LIGHT     1
#define GUI_CHECK_BOX_WIREFRAME 2
#define GUI_CHECK_BOX_GOURAUD   3
#define GUI_CHECK_BOX_CULLING   4
#define GUI_BUTTON_LOAD         5
#define GUI_DIALOG_LOAD         6

'///Declare custom function
declare function VoxModelLoad(byval fileName as ZString ptr)as Boolean

'///Variables
Dim shared as Boolean lightning = true
Dim shared as Boolean wireframe = false
Dim shared as Boolean gouraudShading = true
Dim shared as Boolean backCulling = false

Dim as wFont MyFont=0

Dim as wGuiEvent ptr GUIEvent = 0
Dim as wKeyEvent ptr keyEvent = 0

Dim shared as wMesh mesh = 0
Dim shared as wNode node = 0

Dim shared as wNode Camera = 0
Dim as wMaterial material = 0

Dim shared as wNode LightBlobe1 = 0
Dim shared as wNode Light1 = 0
Dim shared as wAnimator anim1 = 0

Dim shared as wNode LightBlobe2 = 0
Dim shared as wNode Light2 = 0
Dim shared as wAnimator anim2 = 0

Dim shared as wNode LightBlobe3 = 0
Dim shared as wNode Light3 = 0
Dim shared as wAnimator anim3 = 0

Dim shared as wNode LightBlobe4 = 0
Dim shared as wNode Light4 = 0
Dim shared as wAnimator anim4 = 0

Dim shared as Int32 lightSize=100
Dim shared as wVector3f minBox
Dim shared as wVector3f maxBox
Dim as Boolean isControl=false

Dim as string voxelMediaPath="../../Assets/Models/Voxel/"
Dim as string currentMediaPath

Dim as wVector2i fromPos,toPos

Dim as string wndCaption = "Example 131: Load VOX models (Magica Voxel)"

Dim as Int32 prevFPS = 0

'///Start engine
Dim as Boolean init=wEngineStart(wDRT_OPENGL,wDEFAULT_SCREENSIZE,32,false,true,true,false)

if Not init then
PrintWithColor("wEngineStart() failed!")
end
endif

Dim as string fontPath="../../Assets/Fonts/Cyr.xml"

'///Check resources
CheckFilePath(fontPath)

'///Show logo WS3D
wEngineShowLogo(true)

'///Load resources
MyFont=wFontLoad(fontPath)

'///Create camera
Camera=wFpsCameraCreate(100,0.1f,@wKeyMapDefault(1),8)

'///Add ambient light
Dim as wColor4f ambientColor=(0.1f,0.1f,0.1f)
wSceneSetAmbientLight(ambientColor)

'///Save current working directory
currentMediaPath=*wFileGetWorkingDirectory()

'///Create light blobes
LightBlobe1=wNodeCreateSphere(1,8)
material=wNodeGetMaterial(LightBlobe1,0)
wMaterialSetTexture(material,0,CreateColorTexture(wCOLOR4s_DARKRED))
wMaterialSetFlag(material,wMF_LIGHTING,false)

LightBlobe2=wNodeCreateSphere(1,8)
material=wNodeGetMaterial(LightBlobe2,0)
wMaterialSetTexture(material,0,CreateColorTexture(wCOLOR4s_DARKGREEN))
wMaterialSetFlag(material,wMF_LIGHTING,false)

LightBlobe3=wNodeCreateSphere(1,8)
material=wNodeGetMaterial(LightBlobe3,0)
wMaterialSetTexture(material,0,CreateColorTexture(wCOLOR4s_DARKBLUE))
wMaterialSetFlag(material,wMF_LIGHTING,false)

LightBlobe4=wNodeCreateSphere(1,8)
material=wNodeGetMaterial(LightBlobe4,0)
wMaterialSetTexture(material,0,CreateColorTexture(wCOLOR4s_WHITE))
wMaterialSetFlag(material,wMF_LIGHTING,false)

'///Create lights
Dim as wColor4f lightColor=(1.0f,1.0f,0.1f,0.1f)

Light1=wLightCreate(wVECTOR3f_ZERO,wCOLOR4f_WHITE,lightSize)
wLightSetType(Light1,wLT_POINT)
wLightSetDiffuseColor(Light1,lightColor)'///red
wNodeSetParent(Light1,LightBlobe1)

Light2=wLightCreate(wVECTOR3f_ZERO,wCOLOR4f_WHITE,lightSize)
wLightSetType(Light2,wLT_POINT)
lightColor.red=0.1f : lightColor.green=1.0f : lightColor.blue=0.1f
wLightSetDiffuseColor(Light2,lightColor)'///green
wNodeSetParent(Light2,LightBlobe2)

Light3=wLightCreate(wVECTOR3f_ZERO,wCOLOR4f_WHITE,lightSize)
wLightSetType(Light3,wLT_POINT)
lightColor.red=0.1f : lightColor.green=0.1f : lightColor.blue=1.0f
wLightSetDiffuseColor(Light3,lightColor)'///blue
wNodeSetParent(Light3,LightBlobe3)

Light4=wLightCreate(wVECTOR3f_ZERO,wCOLOR4f_WHITE,lightSize)
wLightSetType(Light4,wLT_POINT)
lightColor.red=1.0f : lightColor.green=1.0f : lightColor.blue=1.0f
wLightSetDiffuseColor(Light4,lightColor)'///white
wNodeSetParent(Light4,LightBlobe4)

'///Create Gui environment
Dim as wGuiObject guiSkin=wGuiGetSkin()
wGuiSkinSetFont(guiSkin,MyFont)

fromPos.x=800-200 : fromPos.y=600-200: toPos.x=800 : toPos.y=600
Dim as wGuiObject guiWindow=wGuiWindowCreate("Menu",fromPos,toPos,false)

fromPos.x=20 : fromPos.y=30: toPos.x=150 : toPos.y=55
Dim as wGuiObject btnLoad=wGuiButtonCreate(fromPos,toPos,"Select VOX File","Select a model for loading")
wGuiObjectSetId(btnLoad,GUI_BUTTON_LOAD)
wGuiObjectSetParent(btnLoad,guiWindow)

fromPos.x=20 : fromPos.y=60: toPos.x=200 : toPos.y=90
Dim as wGuiObject checkLighting=wGuiCheckBoxCreate("Use lighting",fromPos,toPos,true)
wGuiObjectSetId(checkLighting,GUI_CHECK_BOX_LIGHT)
wGuiObjectSetParent(checkLighting,guiWindow)

fromPos.x=20 : fromPos.y=90: toPos.x=200 : toPos.y=120
Dim as wGuiObject checkWireframe=wGuiCheckBoxCreate("Wireframe mode",fromPos,toPos,false)
wGuiObjectSetId(checkWireframe,GUI_CHECK_BOX_WIREFRAME)
wGuiObjectSetParent(checkWireframe,guiWindow)

fromPos.x=20 : fromPos.y=120: toPos.x=200 : toPos.y=150
Dim as wGuiObject checkGouraud=wGuiCheckBoxCreate("Gouraud Shading",fromPos,toPos,true)
wGuiObjectSetId(checkGouraud,GUI_CHECK_BOX_GOURAUD)
wGuiObjectSetParent(checkGouraud,guiWindow)

fromPos.x=20 : fromPos.y=150: toPos.x=200 : toPos.y=180
Dim as wGuiObject checkCulling=wGuiCheckBoxCreate("Back face culling",fromPos,toPos,false)
wGuiObjectSetId(checkCulling,GUI_CHECK_BOX_CULLING)
wGuiObjectSetParent(checkCulling,guiWindow)

'///Load first model
VoxModelLoad("../../Assets/Models/Voxel/mike/scene_orgy.vox")

while wEngineRunning()
'///Begin the scene, erasing the canvas with dark grey color before rendering
    wSceneBegin(wCOLOR4s_DARKGREY)

    '///Draw the scene
    wSceneDrawAll()

    '///Draw the Graphical User Interface
    wGuiDrawAll()

    while wInputIsKeyEventAvailable()
         keyEvent=wInputReadKeyEvent()
         if keyEvent->key=wKC_SPACE then
             wGuiObjectRemoveFocus(guiWindow)
             if keyEvent->direction=wKD_UP then isControl= Not isControl
             Dim as wVector2f temp=(0.5f,0.5f)
             if Not isControl then wInputSetMouseLogicalPosition(@temp)
         endif
    wend

    wInputSetCursorVisible(isControl)
    wCameraSetInputEnabled(Camera, Not isControl)

    '///If there are GUI events available
    if wGuiIsEventAvailable() then
      '///Read the GUI event out
      GUIEvent=wGuiReadEvent()
      select case GUIEvent->id     
         case GUI_BUTTON_LOAD
if GUIEvent->event=wGCT_BUTTON_CLICKED then
               wFileSetWorkingDirectory(voxelMediaPath)
               Dim as wGuiObject fileOpenDialog=wGuiFileOpenDialogCreate("Select a model fo loading",true)
               wGuiObjectSetId(fileOpenDialog,GUI_DIALOG_LOAD)
endif
         case GUI_DIALOG_LOAD
            if GUIEvent->event=wGCT_FILE_SELECTED then
Dim as string temp=*wGuiGetLastSelectedFile()
                VoxModelLoad(temp)
                wInputSetCursorVisible(false)
                isControl=false
                wCameraSetInputEnabled(Camera,true)
                wFileSetWorkingDirectory(currentMediaPath)
            endif
         case GUI_CHECK_BOX_LIGHT
            if GUIEvent->event=wGCT_CHECKBOX_CHANGED then
               lightning= Not lightning
               for i as Int32=0 to wNodeGetMaterialsCount(node)-1
                   material=wNodeGetMaterial(node,i)
                   wMaterialSetFlag(material,wMF_LIGHTING,lightning)
               next i
            endif
         case GUI_CHECK_BOX_GOURAUD
             if GUIEvent->event=wGCT_CHECKBOX_CHANGED then
                gouraudShading= Not gouraudShading
                for i as Int32 =0 to wNodeGetMaterialsCount(node)-1
                    material=wNodeGetMaterial(node,i)
                    wMaterialSetFlag(material,wMF_GOURAUD_SHADING,gouraudShading)
                next i
              endif
         case GUI_CHECK_BOX_WIREFRAME
              if GUIEvent->event=wGCT_CHECKBOX_CHANGED then
                 wireframe= Not wireframe
                 for i as Int32 =0 to wNodeGetMaterialsCount(node)-1
                     material=wNodeGetMaterial(node,i)
                     wMaterialSetFlag(material,wMF_WIREFRAME,wireframe)
                 next i
               endif
         case GUI_CHECK_BOX_CULLING
              if GUIEvent->event=wGCT_CHECKBOX_CHANGED then
                 backCulling= Not backCulling
                 for i as Int32 =0 to wNodeGetMaterialsCount(node)-1
                     material=wNodeGetMaterial(node,i)
                     wMaterialSetFlag(material,wMF_BACK_FACE_CULLING,backCulling)
                 next
               endif
        end select
       
    endif

     '///Draw text info
     fromPos.x=12 : fromPos.y=570 : toPos.x=250 : toPos.y=600
     wFontDraw(MyFont,"Press SPACE to control scene",fromPos,toPos)

     wSceneEnd()

     '///Close by ESC
     wEngineCloseByEsc()

     '/// update FPS
     if prevFPS <> wEngineGetFPS() then
        prevFPS = wEngineGetFPS()
        wWindowSetCaption(wndCaption+str(prevFPS))
     endif
wend

'///Stop engine
wEngineStop()

end

Function VoxModelLoad(byval fileName as ZString ptr)as Boolean

    if node<>0 then
        wNodeDestroy(node)
        node=0
    endif

    if mesh<>0 then
        wMeshDestroy(mesh)
        mesh=0
    endif
    mesh=wMeshLoadEx(fileName)
    if mesh<>0 then
        Dim as wVector3f delta
        wMeshFit(mesh,wVECTOR3f_ZERO,@delta)
        node=wNodeCreateFromMesh(mesh)
    else
return false
    endif



    if node<>0 then
        for i as Int32 =0 to wNodeGetMaterialsCount(node)-1
            Dim as wMaterial mat=wNodeGetMaterial(node,i)
            wMaterialSetFlag(mat,wMF_LIGHTING,lightning)
            wMaterialSetFlag(mat,wMF_GOURAUD_SHADING,gouraudShading)
            wMaterialSetFlag(mat,wMF_WIREFRAME,wireframe)
        next i

        wNodeSetPosition(node,wVECTOR3f_ZERO)

        wNodeGetBoundingBox(node,@minBox,@maxBox)

        lightSize=(maxBox.x-minBox.x)+(maxBox.y-minBox.y)+(maxBox.z-minBox.z)
        lightSize/=3

        wLightSetRadius(Light1,lightSize/2)
        wLightSetRadius(Light2,lightSize/2)
        wLightSetRadius(Light3,lightSize/2)
        wLightSetRadius(Light4,lightSize/2)

        if anim1<>0 then
            wAnimatorDestroy(LightBlobe1,anim1)
        endif

        anim1=wAnimatorFlyingCircleCreate(LightBlobe1,wVECTOR3f_ZERO,lightSize,0.0002,wVECTOR3f_UP,0)

        if anim2<>0 then
            wAnimatorDestroy(LightBlobe2,anim2)
        endif
           
        anim2=wAnimatorFlyingCircleCreate(LightBlobe2,wVECTOR3f_ZERO,lightSize,0.0002,wVECTOR3f_UP,0.25f)

        if anim3<>0 then
            wAnimatorDestroy(LightBlobe3,anim3)
        endif   
           
        anim3=wAnimatorFlyingCircleCreate(LightBlobe3,wVECTOR3f_ZERO,lightSize,0.0002,wVECTOR3f_UP,0.5f)

        if anim4<>0 then
            wAnimatorDestroy(LightBlobe4,anim4)
        endif   
           
        anim4=wAnimatorFlyingCircleCreate(LightBlobe4,wVECTOR3f_ZERO,lightSize,0.0002,wVECTOR3f_UP,0.75f)

        Dim as wVector3f position=(maxBox.x-minBox.x,(maxBox.y-minBox.y)/2,maxBox.z-minBox.z)
        wNodeSetPosition(Camera,position)

        wCameraSetTarget(Camera,wVECTOR3f_ZERO)
return true
else
return false
    endif
end function
Под лежачий камень мы всегда успеем...

Offline Nikolas - WS3D Developer

  • Programmer
  • Global Moderator
  • Marquess
  • *
  • Posts: 880
  • Reputation 61
Re: Utilities from a Tiranas
« Reply #109 on: August 08, 2018, 09:20:15 AM »
Да, Vox-модели скачай с этой страницы, если что.
Под лежачий камень мы всегда успеем...

Offline Tiranas

  • Friends
  • Esquire
  • *
  • Posts: 67
  • Reputation 35
  • Совсем Тёмный.
Re: Utilities from a Tiranas
« Reply #110 on: August 08, 2018, 09:49:48 AM »
Nikolas - WS3D Developer
Огромное спасибо!
Людям с более широким кругозором ведомо, что четкой границы между реальным, действительным и ирреальным воображаемым не существует, что каждый из нас, благодаря тонким физиологическим и психологическим различиям, воспринимает все явления по-своему. (Говард Филлипс Лавкрафт)

Offline Nikolas - WS3D Developer

  • Programmer
  • Global Moderator
  • Marquess
  • *
  • Posts: 880
  • Reputation 61
Re: Utilities from a Tiranas
« Reply #111 on: August 08, 2018, 03:23:27 PM »
wPhysGetBodiesCount-возвращает число физ. тел в сцене

wPhysGetJointsCount-возвращает число физ. соединений в сцене

wPhysGetBodyByName-ищет физ. нод по имени и в случае успеха возвращает указатель на него.

wPhysGetBodyById-ищет физ. нод по id и в случае успеха возвращает указатель на него

wPhysGetJointByName-ищет физ. соединение  по имени и в случае успеха возвращает указатель на него

wPhysGetJointById-то же самое по id

wPhysBodyCreateNull-создает пустой физ. объект. Аналогия с wNodeCreateEmpty

wPhysBodyCreateCube-создает физ. куб
С параметрами, думаю ясно.

wPhysBodyCreateSphere-создает физ. сферу

wPhysBodyCreateCone-создает физ. конус.

wPhysBodyCreateCylinder-создает физ. цилиндр

wPhysBodyCreateCapsule-создает физ. капсулу. Идеальный вариант для создания физ. персонажа вместе с wPhysJointCreateUpVector

wPhysBodyCreateHull-создает из нода с прикрепленным к нему мешем физ. выпуклый объект (на языке физ. движка Ньютон- Hull)

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

wPhysBodyCreateTreeBsp-то же самое, но на основе bsp-уровней (от Quake3)

wPhysBodyCreateTerrain-создает физ. ландшафт из нода ландшафта (wTerrainCreate). При создании можно указать требуемый lod-уровень.

wPhysBodyCreateHeightField-результат тот же, но для создания используется карта высот.

Во время написания этого текста родилась идея сделать демку или пример со сферическим  физ. террайном: путешествие по астероиду, например. Сферическая гравитация, вращающаяся камера. Позже, конечно.
Может, кто-то меня опередит... Не уверен, что функции физ. террайна способны справиться со сферической поверхностью.


wPhysBodyCreateWaterSurface-создает физичекскую воду. Объекты, попадающие в нее, испытывают силу Архимеда.

wPhysBodyCreateCompound-создает составное (Compound) физ. тело (нод) на основе массива нод. Реализовано в примере 128_Physics_Compound. Таким образом сделаны столы: 5 параллелепипедов в роли крышки и ног.

wPhysBodySetName-задает имя физ. объекту (аналогия с wNodeSetName).

wPhysBodyGetName-возвращает имя физ. объекта (аналогия с wNodeGetName)

wPhysBodySetFreeze-устанавливает "замороженное" состояние физ. объекта. Выдержка из вики по Ньютону:
Quote
When a body is set to freeze state, the body and all the other bodies associated with that body are also set to same freeze state, so the entire "island" of objects is frozen in space.

Each body still gets Force and Torque callback, which makes is easy to inspect the body and to see if it has to be unfrozen.

If some other body collide or is connected to a frozen body, the entire island become dynamic again, but only while they are connected to an non-frozen body. When they lose the contact they become frozen again.

wPhysBodySetMaterial-устанавливает физ. материал для физ. объекта по id материала. Влияет на трение, упругость, проверку столкновений и пр.

wPhysBodyGetMaterial-возвращает id физического материала, применяемого к данному физ. телу.
Примечание: один материал может быть применен к любому кол-ву физ. объектов.

wPhysBodySetGravity-устанавливает вектор индивидуальной гравитации физ. телу

wPhysBodyGetGravity-возвращает вектор индивидуальной гравитации физ. тела.

wPhysBodySetMass-устанавливает массу для физ тела. Не применяется для тримешей и физ. террайна. При установке нулевого значения объект становится статичным.

wPhysBodyGetMass-возвращает текущую массу физ. объекта

wPhysBodySetCenterOfMass-устанавливает центр масс физ. тела (читай, центр тяжести).
При создании физ. авто или игрушки-неваляшки может пригодиться.

wPhysBodyGetCenterOfMass-возвращает положение центра масс физ. объекта.

wPhysBodySetMomentOfInertia-устанавливает момент инерции физ. тела

wPhysBodyGetMomentOfInertia-возвращает момент инерции.

wPhysBodySetLinearVelocity-устанавливает вектор линейной скорости тела.
Следует аккуратно использовать данную функцию, т.к. при опр. стечении обстоятельств (режим неточного просчета физики, низкий фпс, слишком большая скорость и еще х.з.) объект может "пролететь" через препятствие.
Еще где-то давненько читал, что Ньютон может адекватно обрабатывать тела с соотношением масс до 1:400.   Это для тех, кто захочет сделать "физическую" пулю....


wPhysBodyGetLinearVelocity-возвращает вектор текущей линейной скорости физ. тела.


Под лежачий камень мы всегда успеем...

Offline Nikolas - WS3D Developer

  • Programmer
  • Global Moderator
  • Marquess
  • *
  • Posts: 880
  • Reputation 61
Re: Utilities from a Tiranas
« Reply #112 on: August 08, 2018, 04:20:07 PM »
wPhysBodySetAngularVelocity-устанавливает вектор угловой скорости физ. тела.

wPhysBodySetLinearDamping-нечто вроде установки коэффициента сопротивления движению. Хотя, это больше похоже на инерцию. А лучше вот:
Quote
Apply the linear viscous damping coefficient to the body

wPhysBodySetAngularDamping
Quote
Apply the angular viscous damping coefficient to the body.


wPhysBodyAddImpulse
-задает телу вектор импульса (velosity) в положении position.

wPhysBodyAddForce-задает действие силы для  физ. тела
Более предпочтительно для использования, чем wPhysBodySetVelocity
Применяется внутри игрового цикла.

wPhysBodyAddTorque-добавляет физ. телу момент вращения

wPhysBodiesIsCollide-проверяет столкновение двух физ. тел.

wPhysBodyDraw-рисует контур физ. тела в виде полигональной сетки. Удобно для отладки. Использовать ПОСЛЕ wSceneDrawAll

wPhysJointCreateBall-создает физ. сочленение (соединение) типа Ball and socket
в позиции position. pinDir-вектор, описывающий "степени свободы" соединения.

wPhysJointCreateHinge-создает физ. соединение типа Hinge joint

wPhysJointCreateSlider-создает соединение типа Slider

wPhysJointCreateCorkScrew-создает соединение типа ШТОПОР

wPhysJointCreateUpVector-создает соединение АПВЕКТОР. Используется для ограничения  физ. телу числа степеней свободы, что идеально подходит для создания управляемого физ. персонажа.
Для этого создается апвектор c pinDir=(0,1,0), после чего объект может вращаться только около вертикальной оси.

wPhysJointSetName-задает имя физ. сочленению. Может пригодиться для поиска нужного.

wPhysJointGetName-возвращает имя физ. соединения

wPhysJointSetCollisionState-флаг определяет, будут ли физ. тела, соединенные данным joint-ом, испытывать коллизию между собой

wPhysJointSetBallLimits-установка ограничений для соотв. соединения: углы "закручивания" twistAngles.x-минимальный, twistAngles.y-максимальный, MaxConeAngle - наибольший угол "конуса вращения".

wPhysJointSetHingeLimits, wPhysJointSetSliderLimits-примерно по аналогии

wPhysJointSetCorkScrewLinearLimits-установка ограничений по линейному перемещению для "штопора".


wPhysJointSetCorkScrewAngularLimits
-установка ограничений в поворотах для "штопора".


wPhysPlayerControllerCreate-создает физ. контроллер управления персонажем.
(maxStairStepFactor-некий коэффициент, влияющий на способность преодолевать препятствия, cushion-нечто вроде коэффициента амортизации)
wPhysPlayerControllerSetVelocity-установка скорости физ. контроллера персонажа (вперед, вбок и вверх?)
(Этот раздел- wPhysPlayerController -пока не разработан в деталях)


wPhysVehicleCreate-создает физ. автомобиль.
tiresCount-число колес
rayCastType-тип физ. рейкастинга, применяемого движком для проверки столкновений.
carBody- физический "кузов" автомобиля

wPhysVehicleAddTire
Добавляет колесо к физ. автомобилю Car, UserData-нод-визуализатор колеса,
tireType-тип колеса (ведущее или нет, способно ли к поворотам или нет),
position-позиция в локальных координатах отн. автомобиля,
Mass-масса, Radius-радиус, Width-ширина колеса, SLenght-длина "свободного хода" подвески колеса (как то так),
SConst и SDamper-коэффициенты, влияющие на жесткость подвески и "прыгучесть" машины.

wPhysVehicleGetSpeed-возвращает текущую скорость автомобиля. Даже не знаю, в каких единицах.


wPhysVehicleGetTiresCount
-если требуется узнать число колес авто.

wPhysVehicleSetBrake-процедура торможения авто. Применять в цикле.

wPhysVehicleGetBody-возвращает физ. тело- кузов автомобиля. 

Следует помнить, что сам физ. автомобиль- это не body, а joint.

--------------------------------
wGuiLabelIsOverrideColor-возвращает истину, если доступна  установка цвета контрола "вручную".

--------------------------
wGuiButtonSetPressedImageFromRect
-устанавливает текстуру для кнопки в нажатом состоянии, но в отличии от wGuiButtonSetPressedImage можно задать область видимости.

---------------------
wGuiTextAreaCreate-создает многострочное текстовое поле с максимально допустимым числом строк maxLines.

wGuiTextAreaSetBorderSize-устанавливает толщину рамки-контура многострочного текстового поля

wGuiTextAreaSetAutoScroll-включает/отключает автопрокрутку вертикального скроллбара при добавлении новых строк.

wGuiTextAreaSetPadding-устанавливает размер зоны заполнения для многострочного текстового поля.

wGuiTextAreaSetBackTexture-установка фоновой текстуры в окне многострочного текстового поля

wGuiTextAreaSetWrapping-разрешает/запрещает перенос слов в многострочном текстовом поле

wGuiTextAreaSetFont-установка шрифта для М.Т.П.

wGuiTextAreaAddLine-добавляет новую строку к существующим в М.Т.П.

wGuiTextAreaRemoveAll-очищает весь текст в М.Т.П.


wGuiTextAreaSetBackgroundColor
-установка фонового цвета для М.Т.П.

wGuiTextAreaSetBorderColor-устанавливает цвет рамки (или бордюра) для М. Т. П.

------------------------------------
wGuiContextMenuIsAutoChecked
Quote
does the element change the checked status on clicking

---------------------------------
wGuiTreeNodeHasChildren-возвращает истину, если у данного узла древа есть дочерние узлы.

---------------------
wGuiCheckBoxIsChecked-возвращает статус чекбокса: выбрано/не выбрано

--------------------------------
wGuiProgressBarCreate-создает ГУИ-контрол: индикатор выполнения операции.

wGuiProgressBarSetPercentage-устанавливает величину текущего процента выполнения: 0....100

wGuiProgressBarGetPercentage-возвращает величину текущего процента выполнения в диапазоне: 0....100


wGuiProgressBarSetDirection
-устанавливает "направление" прогресс-бара: true-горизонтально, false-вертикально

wGuiProgressBarIsHorizontal-если прогресс-бар горизонтальный- возвращает true, в противном случае- false

wGuiProgressBarSetBorderSize-устанавливает толщину рамки (контура/бордюра) для прогресс-бара.

wGuiProgressBarSetSize-устанавливает новый размер прогресс-бара (ширину и высоту).

wGuiProgressBarShowText-разрешает/запрещает рисование текста с информацией (процент выполнения).

wGuiProgressBarIsShowText-возвращает флаг: разрешено ли рисование текста для прогресс-бара.

wGuiProgressBarSetFillTexture-устанавливает текстуру, рисуемую на зоне заполнения прогресс-бара.

wGuiProgressBarSetBackTexture-устанавливает фоновую текстуру прогресс-бара (на незаполненной области).

wGuiProgressBarSetFont-устанавливает шрифт, которым будет выводится текст у прогресс-бара (если это разрешено).

wGuiProgressBarSetBackgroundColor-устанавливает фоновый цвет прогресс-бара.

wGuiProgressBarSetBorderColor-устанавливает цвет контура (рамки/бордюра) для прогресс-бара.
« Last Edit: August 08, 2018, 08:05:40 PM by Nikolas - WS3D Developer »
Под лежачий камень мы всегда успеем...

Offline Tiranas

  • Friends
  • Esquire
  • *
  • Posts: 67
  • Reputation 35
  • Совсем Тёмный.
Re: Utilities from a Tiranas
« Reply #113 on: August 11, 2018, 03:53:24 PM »
Так, основное готово.
А именно, справка по функциям WorldSim3D на русском, для версии 1.04.
Огромная благодарность - Nikolas!
Всего вписано функций: 1548.
Нет статей, над ними ещё надо шаманить.
Нет раздела "Справка по примерам". У меня примеров пока нет.
Справка уже кликабельна, можно пользоваться.
Об ошибках сообщайте сюда.

Ссылка тут:
Тык
« Last Edit: August 18, 2018, 04:03:48 PM by Tiranas »
Людям с более широким кругозором ведомо, что четкой границы между реальным, действительным и ирреальным воображаемым не существует, что каждый из нас, благодаря тонким физиологическим и психологическим различиям, воспринимает все явления по-своему. (Говард Филлипс Лавкрафт)

Offline Alec - WS3D Developer

  • Producer
  • Administrator
  • Marquess
  • *
  • Posts: 897
  • Reputation 36
  • Game making is my hobby for life!
Re: Utilities from a Tiranas
« Reply #114 on: August 11, 2018, 08:03:10 PM »
Хорошо!  :) Качаю и посмотрим, что получилось...
WorldSim3D = 3D + FreeBasic. Программируй в удовольствие, а не "в тягость"! Make your project with pleasure, not with strain!

Offline Nikolas - WS3D Developer

  • Programmer
  • Global Moderator
  • Marquess
  • *
  • Posts: 880
  • Reputation 61
Re: Utilities from a Tiranas
« Reply #115 on: August 11, 2018, 09:15:03 PM »
Привет всем.
Tiranas, придется кое-что исправить и добавить. Это из-за изменений у меня, у тебя все ОК!

1) Изменено:
declare function wEngineStop(byval closeDevice as Boolean=true) as Boolean
Параметр closeDevice:
Если выставлен в true- повторный вызов wEngineStart
иногда может не помочь. Движок может запускается, главный игровой  цикл может не работать. Дело в том, что после closeDevice=true условие wEngineRunning() всегда возвращает false. Так было по умолчанию, но теперь появится возможность перезапускать движок "на лету", например, после изменения размеров экрана или еще чего нибудь.

2) Добавлено:
declare function wEngineStartWithGui(byval captionText as const wstring ptr,_
                           byval fontPath as zstring ptr=0,_
                           byval logo as wTexture=0,_
                           byval language as wLanguage=wL_EN) as Boolean

Запуск даижка с ГУИ-окном выбора настроек (еще пилю)
captionText- текст в заголовке окна (будет отображаться в виде: <<Настройка запуска (на языке выбранной локали): (captionText)>>)
fontPath-путь к файлу шрифта для отображения текста (если 0- дефолтный шрифт движка- без поддержки кириллицы)
logo-логотип-текстура, будет отображаться в верхней части окна
language-язык, на котором будет текст. Пока два варианта:
Code: [Select]
type wLanguage as UInt32
enum
    wL_RU=0
    wL_EN=1
end enum

3) Изменено:
declare function wEngineStartAdvanced(byval params as wEngineCreationParameters) as Boolean

Теперь настройки запуска хранятся в структуре:
Quote
type wEngineCreationParameters

   /' Type of the device.
   /** This setting decides the windowing system used by the device, most device types are native
   to a specific operating system and so may not be available.
   wDT_WIN32 is only available on Windows desktops,
   wDT_WINCE is only available on Windows mobile devices,
   wDT_COCOA is only available on Mac OSX,
   wDT_X11 is available on Linux, Solaris, BSD and other operating systems which use X11,
   wDT_SDL is available on most systems if compiled in,
   wDT_CONSOLE is usually available but can only render to text,
   wDT_BEST will select the best available device for your operating system.
   Default: wDT_BEST. '/
   DeviceType as wDeviceTypes = wDT_BEST

   /' Type of video driver used to render graphics.
   /** This can currently be wDT_NULL, wDT_SOFTWARE,
   wDT_BURNINGSVIDEO, wDT_DIRECT3D9, and wDT_OPENGL.'/
   DriverType as wDriverTypes = wDRT_BURNINGS_VIDEO

   /' Size of the window or the video mode in fullscreen mode. Default: 800x600 '/
   WindowSize as wVector2u = wDEFAULT_SCREENSIZE

   /'Position of the window on-screen. Default: (-1, -1) or centered.'/
   WindowPosition as wVector2i = (-1,-1)

   /'Minimum Bits per pixel of the color buffer in fullscreen mode. Ignored if windowed mode. Default: 32.'/
   Bits as UInt8 = 32

   /'Minimum Bits per pixel of the depth buffer. Default: 24.'/
   ZBufferBits as UInt8 = 24

   /'Should be set to true if the device should run in fullscreen.
   /** Otherwise the device runs in windowed mode. Default: false.'/
   Fullscreen as Boolean=false

   /'Specifies if the stencil buffer should be enabled.
   /** Set this to true, if you want the engine be able to draw
   stencil buffer shadows. Note that not all drivers are able to
   use the stencil buffer, hence it can be ignored during device
   creation. Without the stencil buffer no shadows will be drawn.
   Default: true.'/
   Stencilbuffer as Boolean = true

   /' Specifies vertical synchronization.
   /** If set to true, the driver will wait for the vertical
   retrace period, otherwise not. May be silently ignored.
   Default: false '/
   Vsync as Boolean = false

   /' Specifies if the device should use fullscreen anti aliasing
   /** Makes sharp/pixelated edges softer, but requires more
   performance. Also, 2D elements might look blurred with this
   switched on. The resulting rendering quality also depends on
   the hardware and driver you are using, your program might look
   different on different hardware with this. So if you are
   writing a game/application with AntiAlias switched on, it would
   be a good idea to make it possible to switch this option off
   again by the user.
   The value is the maximal antialiasing factor requested for
   the device. The creation method will automatically try smaller
   values if no window can be created with the given value.
   Value one is usually the same as 0 (disabled), but might be a
   special value on some platforms. On D3D devices it maps to
   NONMASKABLE.
   Default value: 0 - disabled '/
    AntiAlias as wAntiAliasingMode = wAAM_OFF

   /'Flag to enable proper sRGB and linear color handling
   /** In most situations, it is desirable to have the color handling in
   non-linear sRGB color space, and only do the intermediate color
   calculations in linear RGB space. If this flag is enabled, the device and
   driver try to assure that all color input and output are color corrected
   and only the internal color representation is linear. This means, that
   the color output is properly gamma-adjusted to provide the brighter
   colors for monitor display. And that blending and lighting give a more
   natural look, due to proper conversion from non-linear colors into linear
   color space for blend operations. If this flag is enabled, all texture colors
   (which are usually in sRGB space) are correctly displayed. However vertex colors
   and other explicitly set values have to be manually encoded in linear color space.
   Default value: false. '/
   HandleSRGB as Boolean = false

   /'Whether the main framebuffer uses an alpha channel.
   /** In some situations it might be desirable to get a color
   buffer with an alpha channel, e.g. when rendering into a
   transparent window or overlay. If this flag is set the device
   tries to create a framebuffer with alpha channel.
   If this flag is set, only color buffers with alpha channel
   are considered. Otherwise, it depends on the actual hardware
   if the colorbuffer has an alpha channel or not.
   Default value: false '/
   WithAlphaChannel as Boolean = false

   /'Whether the main framebuffer uses doublebuffering.
   /** This should be usually enabled, in order to avoid render
   artifacts on the visible framebuffer. However, it might be
   useful to use only one buffer on very small devices. If no
   doublebuffering is available, the drivers will fall back to
   single buffers. Default value: true'/
   Doublebuffer as Boolean = true

   /'Specifies if the device should ignore input events
   /** This is only relevant when using external I/O handlers.
   External windows need to take care of this themselves.
   Currently only supported by X11.
   Default value: false '/
   IgnoreInput as Boolean = false

   /'Specifies if the device should use stereo buffers
   /** Some high-end gfx cards support two framebuffers for direct
   support of stereoscopic output devices. If this flag is set the
   device tries to create a stereo context.
   Currently only supported by OpenGL.
   Default value: false '/
   Stereobuffer as Boolean = false

   /'Specifies if the device should use high precision FPU setting
   /** This is only relevant for DirectX Devices, which switch to
   low FPU precision by default for performance reasons. However,
   this may lead to problems with the other computations of the
   application. In this case setting this flag to true should help
   - on the expense of performance loss, though.
   Default value: false '/
   HighPrecisionFPU as Boolean = false

   /'Window Id.
   /** If this is set to a value other than 0, the WorldSim3D Engine
   will be created in an already existing window.
   For Windows, set this to the HWND of the window you want.
   For iOS, assign UIView to this variable.
   The windowSize and FullScreen options will be ignored when using
   the WindowId parameter. Default this is set to 0.
   To make WorldSim3D run inside the custom window, you still will
   have to draw WorldSim3D on your own.

   Instead of this, you can also simply use your own message loop
   using GetMessage, DispatchMessage and whatever. Calling
   wEngineRunning() will cause WorldSim3D to dispatch messages
   internally too.  You need not call wEngineRunning() if you want to
   do your own message dispatching loop, but WorldSim3D will not be
   able to fetch user input then and you have to do it on your own
   using the window messages, DirectInput, or whatever. Also,
   you'll have to increment the WorldSim3D timer.
   However, there is no need to draw the picture this often. Just
   do it how you like. '/
   WindowId as any ptr = 0

   /'Specifies the logging level used in the logging interface.
   /** The default value is wLL_INFORMATION. You can access the logger interface
   later on from the WorldSim3D and set another level.
   But if you need more or less logging information already from device creation,
   then you have to change it here.'/
   LoggingLevel as wLoggingLevel =wLL_INFORMATION

   /'Allows to select which graphic card is used for rendering when more than one card is in the system.
   /** So far only supported on D3D '/
   DisplayAdapter as UInt32 = 0

   /'Create the driver multithreaded.
   /** Default is false. Enabling this can slow down your application.
   Note that this does _not_ make WorldSim3D threadsafe, but only the underlying driver-API for the graphiccard.
   So far only supported on D3D. '/
   DriverMultithreaded as Boolean=false

   /'Enables use of high performance timers on Windows platform.
   /** When performance timers are not used, standard GetTickCount()
   is used instead which usually has worse resolution, but also less
   problems with speed stepping and other techniques.'/
   UsePerformanceTimer as Boolean = true

   /'Define some private data storage.
   /** Used when platform devices need access to OS specific data structures etc.
   This is only used for Android at th emoment in order to access the native   Java RE. '/
   PrivateData as any ptr = 0
   
   /'Set the path where default-shaders to simulate the fixed-function pipeline can be found.
   /** This is about the shaders which can be found in media/Shaders by default. It's only necessary
   to set when using OGL-ES 2.0 '/
   OGLES2ShaderPath as const zstring ptr = @"../../Assets/Shaders"
end type

Как видим, настроек стало больше.
Можно, например, указать положение окна движка при запуске.
« Last Edit: August 11, 2018, 10:57:00 PM by Nikolas - WS3D Developer »
Под лежачий камень мы всегда успеем...

Offline Nikolas - WS3D Developer

  • Programmer
  • Global Moderator
  • Marquess
  • *
  • Posts: 880
  • Reputation 61
Re: Utilities from a Tiranas
« Reply #116 on: August 11, 2018, 09:54:16 PM »
Справка стала, на мой взгляд, не хуже романа.
Читать приятно, слов нет.
Зачётная работа.
Под лежачий камень мы всегда успеем...

Offline Tiranas

  • Friends
  • Esquire
  • *
  • Posts: 67
  • Reputation 35
  • Совсем Тёмный.
Re: Utilities from a Tiranas
« Reply #117 on: August 12, 2018, 05:00:05 AM »
Обновил, с учётом изменений.
Ссылка та же
« Last Edit: August 12, 2018, 05:43:22 AM by Tiranas »
Людям с более широким кругозором ведомо, что четкой границы между реальным, действительным и ирреальным воображаемым не существует, что каждый из нас, благодаря тонким физиологическим и психологическим различиям, воспринимает все явления по-своему. (Говард Филлипс Лавкрафт)

Offline Nikolas - WS3D Developer

  • Programmer
  • Global Moderator
  • Marquess
  • *
  • Posts: 880
  • Reputation 61
Re: Utilities from a Tiranas
« Reply #118 on: August 12, 2018, 12:50:49 PM »
Лично я очень доволен. Tiranas проделал огромный труд. Респект и уважуха, как говорится.
Надеюсь на дальнейшее сотрудничество.
Но при этом я понимаю, что тебе нужно самому опробовать возможности движка и сделать вывод о его работоспособности. А тебе приходится заниматься рутиной. Хотя, в процессе создания справки ты, видимо, получил представление об основных моментах движка.

Насколько я понял, переход на WS3D у тебя состоялся из-за freebasic-а. Я как-то анализировал этот вопрос и составил некий список всех возможных движков для бейсика. Может, у тебя есть подобный список.

1) Blitz3D (+BlitzMax, +BlitzPlus), only D3DX7
2) Xors3D (D3DX9)
3) DarkBasic Professional
4) Ninfa3D (irrlicht)
5) Clady3D (по сути вариация Ninfa3D или наоборот, irrlicht).
6) NX3D (irrlicht , only D3DX9)
7) Irrlicht Wrapper ( наше прошлое, я считаю, но уже НЕ МЫ).
8) Truevision3D (VB6+)-неплохой движок, сам использовал.
9) Apocalyx 3D Engine
10) RiBox3D
11) RealBas Tehno (VB6+ D3DX7)
12) iRender3D (VB6+ D3DX8), пользовал где-то в 2005, сейчас не найдешь днем с огнем, где-то валяется
13) Revolution 3D (если правильно вспомнил), (VB6+D3DX8)
14) 3DState (или Morfit3D), почти голый D3DX7 или D3DX8

Как видим, все очень старое. 
Интересно, есть ли на сегодняшний день более-менее развитый движок для бейсика? Конкурент для нас или мы для него....
« Last Edit: August 12, 2018, 12:53:30 PM by Nikolas - WS3D Developer »
Под лежачий камень мы всегда успеем...

Offline Tiranas

  • Friends
  • Esquire
  • *
  • Posts: 67
  • Reputation 35
  • Совсем Тёмный.
Re: Utilities from a Tiranas
« Reply #119 on: August 12, 2018, 01:06:09 PM »
Nikolas - WS3D Developer
Доброго времени суток.

О некоторых движках из этого списка я вообще слышу впервые.
Писал программы на:
Blitz3D
BlitzMax
Xors3D
Ninfa3D
Clady3D
Везде свои проблемы
Blitz3D только для DX7
BlitzMax глючит на виндовсах новее хрюши
Xors3D вообще тормозной, хотя обладает хорошим функционалом
Ninfa3D сырая много проблем в том числе с позиционированием камеры и так далее
Clady3D написал несколько заготовок, но мало функционала, код движка закрытый, в общем, забросил.
Людям с более широким кругозором ведомо, что четкой границы между реальным, действительным и ирреальным воображаемым не существует, что каждый из нас, благодаря тонким физиологическим и психологическим различиям, воспринимает все явления по-своему. (Говард Филлипс Лавкрафт)