Author Topic: Полезные полезности  (Read 252 times)

0 Members and 1 Guest are viewing this topic.

Offline Nikolas - WS3D Developer

  • Programmer
  • Global Moderator
  • Viscount
  • *
  • Posts: 683
  • Reputation 45
Полезные полезности
« on: October 13, 2016, 11:00:41 PM »
Привет всем. Сюда предлагаю складывать все интересные фрагменты кода, свои наработки по работе с движком WorldSim3D в частности и ЯП в целом (basic, теперь и pascal).

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

Offline Nikolas - WS3D Developer

  • Programmer
  • Global Moderator
  • Viscount
  • *
  • Posts: 683
  • Reputation 45
Re: Полезные полезности
« Reply #1 on: October 13, 2016, 11:04:54 PM »
Вот функция, созданная по мотивам примера 15_Mesh_Custom_Create. Она позволяет создавать меш-параллелепипед с заданными линейными размерами. Бывают случаи, когда нам нужен именно такой меш, а не нод, создаваемый через wAddCubeSceneNode() или wAddTestSceneNode().
Code: [Select]
Function CreateBoxMesh(ByVal sizeX As Single,ByVal sizeY As Single, ByVal sizeZ As single) As wMesh
Dim mesh As wMesh
DIM verts(0 to 11) as wVERT
Dim indices(0 to 35) as UShort

sizeX/=2
sizeY/=2
sizeZ/=2

'запоняем массив индексов
indices(0)=0:indices(1)=2:indices(2)=1:indices(3)=0
indices(4)=3:indices(5)=2:indices(6)=1:indices(7)=5
indices(8)=4:indices(9)=1:indices(10)=2:indices(11)=5
indices(12)=4:indices(13)=6:indices(14)=7:indices(15)=4
indices(16)=5:indices(17)=6:indices(18)=7:indices(19)=3
indices(20)=0:indices(21)=7:indices(22)=6:indices(23)=3
indices(24)=9:indices(25)=5:indices(26)=2:indices(27)=9
indices(28)=8:indices(29)=5:indices(30)=0:indices(31)=11
indices(32)=10:indices(33)=0:indices(34)=10:indices(35)=7

'заполняем массив вершин
verts(0).x = 0*sizeX : verts(0).y = 0*sizeY : verts(0).z = 0*sizeZ
verts(1).x = 1*sizeX : verts(1).y = 0*sizeY : verts(1).z = 0*sizeZ
verts(2).x = 1*sizeX : verts(2).y = 1*sizeY : verts(2).z = 0*sizeZ
verts(3).x = 0*sizeX : verts(3).y = 1*sizeY : verts(3).z =0*sizeZ

verts(4).x = 1*sizeX : verts(4).y = 0*sizeY : verts(4).z = 1*sizeZ
verts(5).x = 1*sizeX : verts(5).y = 1*sizeY : verts(5).z =1*sizeZ
verts(6).x = 0*sizeX : verts(6).y = 1*sizeY : verts(6).z = 1*sizeZ
verts(7).x = 0*sizeX : verts(7).y = 0*sizeY : verts(7).z = 1*sizeZ

verts(8).x = 0*sizeX : verts(8).y = 1*sizeY : verts(8).z =1*sizeZ
verts(9).x = 0*sizeX : verts(9).y = 1*sizeY : verts(9).z = 0*sizeZ
verts(10).x = 1*sizeX : verts(10).y = 0*sizeY : verts(10).z = 1*sizeZ
verts(11).x = 1*sizeX : verts(11).y = 0*sizeY : verts(11).z = 0*sizeZ

'устанавливаем вектора нормали
verts(0).normal_x = -1 : verts(0).normal_y = -1 : verts(0).normal_z = -1
verts(1).normal_x = 1 : verts(1).normal_y = -1 : verts(1).normal_z = -1
verts(2).normal_x = 1 : verts(2).normal_y = 1 : verts(2).normal_z = -1
verts(3).normal_x = -1 : verts(3).normal_y = 1 : verts(3).normal_z =-1

verts(4).normal_x = 1 : verts(4).normal_y = -1 : verts(4).normal_z = 1
verts(5).normal_x = 1 : verts(5).normal_y = 1 : verts(5).normal_z =1
verts(6).normal_x = -1 : verts(6).normal_y = 1 : verts(6).normal_z = 1
verts(7).normal_x = -1 : verts(7).normal_y = -1 : verts(7).normal_z = 1

verts(8).normal_x = -1 : verts(8).normal_y = 1 : verts(8).normal_z =1
verts(9).normal_x = -1 : verts(9).normal_y = 1 : verts(9).normal_z = -1
verts(10).normal_x = 1 : verts(10).normal_y = -1 : verts(10).normal_z = 1
verts(11).normal_x = 1 : verts(11).normal_y = -1 : verts(11).normal_z = -1

'устнавливаем цвет вершин- белый
Dim As UInteger clr=wMakeARGB(255,255,255,255)
For i As Integer=0 To 11
verts(i).vcolor=clr
Next

'устанавливаем текстурные координаты будущего меша
verts(0).texture_x = 0 : verts(0).texture_y = 1
verts(1).texture_x = 1 : verts(1).texture_y = 1
verts(2).texture_x = 1 : verts(2).texture_y = 0
verts(3).texture_x = 0 : verts(3).texture_y = 0

verts(4).texture_x = 0 : verts(4).texture_y = 1
verts(5).texture_x = 0 : verts(5).texture_y = 0
verts(6).texture_x = 1 : verts(6).texture_y = 0
verts(7).texture_x = 1 : verts(7).texture_y = 1

verts(8).texture_x = 0 : verts(8).texture_y = 1
verts(9).texture_x = 1 : verts(9).texture_y = 1
verts(10).texture_x = 1 : verts(10).texture_y =0
verts(11).texture_x = 0 : verts(11).texture_y =0

mesh = wCreateMesh( "TestMesh", 12, verts(0), 36, indices(0))

Return mesh
End Function
Если возникнет интерес к такому подходу, можно добавить аналогичные функции для создания сферы, цилиндра, конуса, где-то попадался даже teapot. Данный пример адаптирован с кода для Irrlicht.
« Last Edit: October 13, 2016, 11:08:04 PM by Nikolas - WS3D Developer »
Под лежачий камень мы всегда успеем...

Offline Nikolas - WS3D Developer

  • Programmer
  • Global Moderator
  • Viscount
  • *
  • Posts: 683
  • Reputation 45
Re: Полезные полезности
« Reply #2 on: October 13, 2016, 11:33:16 PM »
Вот простой способ, как сделать невидимый нод, пусть будет кубик. Вариант с флагом wSetNodeVisibility() не рассматриваем, так как в таком случае нельзя, например, реализовать проверку столкновений. Достаточно одеть на меш пустую текстурку и установить флаг для материала.
Code: [Select]
Dim As wNode temp=wAddCubeSceneNode(10)
Dim As wTexture tex=wCreateTexture("test",1,1,wCF_A8R8G8B8)
wSetNodeMaterialTexture(temp,tex,0)
wSetNodeMaterialType(temp,wMT_TRANSPARENT_ALPHA_CHANNEL)
Готово.
Под лежачий камень мы всегда успеем...

Offline Alec - WS3D Developer

  • Producer
  • Administrator
  • Marquess
  • *
  • Posts: 830
  • Reputation 31
  • Game making is my hobby for life!
Re: Полезные полезности
« Reply #3 on: October 25, 2016, 06:01:07 PM »
Ровный/угловатый берег 'Real water'.

Возможно вы заметили, что в WS3D 1.0.0 в новом примере 121_RealWater берега местами угловатые (первый скрин). Дело тут не в воде, т.е. не в ноде воды, а настройках нода Террейна.

Дело в том, что у террейна с десяток параметров, в т.ч. такой как smoothing, который по умолчанию равен 0. Он отвечает за сглаживание поверхности террейна. Если он равен 0, то поверхность террейна имеет наименьшее сглаживание, или его отсутствие, вода же просто огибает треугольники меша террейна, вот и получается угловатость. Если же этот параметр поставить на 10, то угловатости не будет (ну или совсем чуток, что можно закрыть дополнительными текстурами или растительностью по берегам). Смотрите 2-й скрин.
Code: [Select]
wTerrain = wAddTerrain ( _
       path as zstring ptr, _
       xPosition as single = 0.0, _
       yPosition as single = 0.0, _
       zPosition as single = 0.0, _
       xRotation as single = 0.0, _
       yRotation as single = 0.0, _
       zRotation as single = 0.0, _
       xScale as single = 1.0, _
       yScale as single = 1.0, _
       zScale as single = 1.0, _
       vertexAlpha as integer = 255, _
       vertexRed as integer = 255, _
       vertexGreen as integer = 255, _
       vertexBlue as integer = 255, _
       smoothing as integer = 10, _
       maxLOD as integer = 5, _
       patchSize as wTERRAIN_PATCH_SIZE = wTPS_17
« Last Edit: October 25, 2016, 06:02:40 PM by Alec - WS3D Developer »
WorldSim3D = 3D + FreeBasic. Программируй в удовольствие, а не "в тягость"! Make your project with pleasure, not with strain!

Offline Alec - WS3D Developer

  • Producer
  • Administrator
  • Marquess
  • *
  • Posts: 830
  • Reputation 31
  • Game making is my hobby for life!
Re: Полезные полезности
« Reply #4 on: October 10, 2017, 04:12:27 PM »
Пример работы 4 новых функций для режимов видео wGetVideoMode... для WS3D 1.03 Ext. Пример сделал Nikolas.

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

Это режимы видео, которые поддерживаются монитором пользователя. Это можно использовать в ваших проектах, чтобы узнать какие режимы видео доступны пользователю на его системе, чтобы дать ему выбор.

Пример сделан для консоли, но вы без проблем приспособите его к оконному режиму.
Этот пример выводит все доступные для системы режимы видео. Он показывает сколько всего режимов доступно и какие именно. В какждом режиме отображается разрешение экрана (например 1024х768) и глубина цвета (напр, 32).

Code: [Select]
#include "WorldSim3D.bi"

wStart( wDT_NULL, 1, 1,16,FALSE, FALSE, FALSE,FALSE )

dim as Int32 count=wGetVideoModeCount()
print "Video modes count: "+str(count)
for i as int32=0 to count-1
print "-----------------------------"
print "Video mode num: "+str(i)
print "Video mode: "+str(wGetVideoModeResolutionWidth(i))+" x "+str(wGetVideoModeResolutionHeight(i))+" : "+str(wGetVideoModeDepth(i))
next
sleep
« Last Edit: October 10, 2017, 04:14:47 PM by Alec - WS3D Developer »
WorldSim3D = 3D + FreeBasic. Программируй в удовольствие, а не "в тягость"! Make your project with pleasure, not with strain!