forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Модули для BlitzMax (http://forum.boolean.name/forumdisplay.php?f=105)
-   -   Модуль Magic Particles (http://forum.boolean.name/showthread.php?t=8211)

SBJoker 25.04.2009 13:36

Модуль Magic Particles
 
Описание: http://www.astralax.ru/projects/particles
Цитата:

Magic Particles — это специализированный редактор спецэффектов. Пылающий текст, летящая комета, танец осенних листьев под порывами ветра, снежная вьюга и разноцветный туман, извивающиеся щупальца диковинных тварей, причудливые силуэты растений — все эти (и многие другие!) образы могут быть не только созданы в этой программе, но и вставлены в ваши фотографии и видеозаписи.
Скачать: http://www.astralax.ru/forum/viewtopic.php?f=5&t=58

Черный крыс 25.04.2009 15:47

Ответ: Модуль Magic Particles
 
Ага. Сейчас занимаемся документацией этого модуля, хотя она будет дублироваться хелпом с самой либой.

Скоро выложу обновленный модуль, с поддержкой траекторий.

ЗЫ. Огромное спасибо Dimanche13. За большой вклад в создании модуля.

PSS О найденых багах и пожеланиях отписывайтесь сюда или же diablo190[@]rambler.ru

moka 26.04.2009 11:05

Ответ: Модуль Magic Particles
 
Только вот самого файла модуля там нету, это так и предусмотренно?
Просто думал скомпилю под Mac, и обломался. Если нужен ходячий компилятор под MacOS X (PPC/Intel), то обращайтесь!

maxturbo 19.05.2011 14:32

Ответ: Модуль Magic Particles
 
А на Blitz3D можно написать заголовочный файл для Magic Particles 3D??? Или если есть то киньте ссылку :) Если же нет, то печально :)

maxturbo 20.05.2011 21:50

Ответ: Модуль Magic Particles
 
Сток программистов знающих и ни чего ответить не могут :)

Черный крыс 20.05.2011 22:27

Ответ: Модуль Magic Particles
 
Можно. Тока этого делать, скорее всего делать никто не будет. Да еще и гемора много чтобы его заврапить по Б3Д.

maxturbo 20.05.2011 22:49

Ответ: Модуль Magic Particles
 
Цитата:

Сообщение от Diablo1909 (Сообщение 189028)
Можно. Тока этого делать, скорее всего делать никто не будет. Да еще и гемора много чтобы его заврапить по Б3Д.

И в чем заключается геморой написания заголовочного файла под B3D ?? ))

SBJoker 20.05.2011 23:02

Ответ: Модуль Magic Particles
 
А ты попробуй напиши, потом расскажешь.

maxturbo 20.05.2011 23:22

Ответ: Модуль Magic Particles
 
Цитата:

Сообщение от SBJoker (Сообщение 189032)
А ты попробуй напиши, потом расскажешь.

Ну так я и спрашиваю в чем заключается и стоит ли вообще писать?

Черный крыс 21.05.2011 00:26

Ответ: Модуль Magic Particles
 
Так ответ тебе написали в 6-м посте. Номальные партиклы для Б3Д уже давно есть.

Ну а если тебе так интересно то Магик-партикл это всего лишь считалка, а все остальное будь добр пиши сам, в том числе и оббертку, на Б3Д это будет выглядеть ОЧЕНЬ невыразительно, для примера привожу код из модуля под БМакс :

Код:


rem
 Copyright (c) 2011 Al'bert Gaskarov
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
 in the Software without restriction, including without limitation the rights
 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 copies of the Software, and to permit persons to whom the Software is
 furnished to do so, subject to the following conditions:
 
 The above copyright notice and this permission notice shall be included in
 all copies or substantial portions of the Software.
 
 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 THE SOFTWARE.
 
endrem
SuperStrict
Module api.effectmagic
ModuleInfo "Проект : Magic particles (c) враппер для BlitzMAX."
ModuleInfo "Версия : 1.05"
ModuleInfo "Сервер : API"
ModuleInfo "Автор : Альберт Гаскаров -> aka [G-man] aka [Diablo] -> [email protected]"
ModuleInfo "Спасибо : Дмитрий Волокитин aka [dimanche13] и команде Astralax."
ModuleInfo "Права : Dynamic bytes limited (c) 2010."
ModuleInfo "Права : Astralax team (c) 2010."
ModuleInfo "Права : Blitz Reseach limited (c) 2010."
ModuleInfo "История : 1.05"
ModuleInfo "История : Бага была у автора. Обновлена библиотека .dll"
ModuleInfo "История : 1.05 beta"
ModuleInfo "История : Полностью переписан алгоритм отрисовки эмиттера, для 100% совместимости теперь используются возможности только интерфейсного модуля 'Max2D'."
ModuleInfo "История : Но появилась одна бага. Почему то некорректно считывается информация о положении центра вращения текстуры."
ModuleInfo "История : Официальная справка гласит на этот счет однозначно. Попытаюсь связатся с автором для прояснения ситуации. А пока эта версия носит префикс 'beta'"
ModuleInfo "История : Удалено -> Vector2 класс за ненадобностью."
ModuleInfo "История : 1.02"
ModuleInfo "История : Теперь отрисовка эмиттера происходит с учетом мировой матрицы трансформации."
ModuleInfo "История : Переделано -> Установка цвета\прозрачности"
ModuleInfo "История : Добавлено -> Vector2 класс для трансформации."
ModuleInfo "История : 1.01"
ModuleInfo "История : Добавлено -> Энумератор TMagic, возращающий данные о всех файлах в текущей папке (TMagicData)."
ModuleInfo "История : Добавлено -> Префиксы совместного компилирования."
ModuleInfo "История : Добавлено -> Внутренняя справка."
ModuleInfo "История : 1.0"
ModuleInfo "История : Первый официальный выпуск."
Import api.effect
Import brl.ramstream
Import "magic.lib"
Include "magicdriver.bmx"
Private
Const MAGIC_SUCCESS:Int = -1
Const MAGIC_ERROR:Int = -2
Const MAGIC_UNKNOWN:Int = -3
Const MAGIC_FOLDER:Int = 1
Const MAGIC_EMITTER:Int = 2
Const MAGIC_NOLOOP:Int = 0
Const MAGIC_LOOP:Int = 1
Const MAGIC_FOREVER:Int = 2
Const MAGIC_COLOR_STANDARD:Int = 0
Const MAGIC_COLOR_TINT:Int = 1
Const MAGIC_COLOR_USER:Int = 2
Const MAGIC_EMITTER_POINT:Int = 0
Const MAGIC_EMITTER_LINE:Int = 1
Const MAGIC_EMITTER_CIRCLE:Int = 2
Const MAGIC_EMITTER_ELLIPSE:Int = 3
Const MAGIC_EMITTER_SQUARE:Int = 4
Const MAGIC_EMITTER_RECTANGLE:Int = 5
Const MAGIC_EMITTER_IMAGE:Int = 6
Const MAGIC_EMITTER_TEXT:Int = 7
Const MAGIC_DIAGRAM_LIFE:Int = 0
Const MAGIC_DIAGRAM_NUMBER:Int = 1
Const MAGIC_DIAGRAM_SIZE:Int = 2
Const MAGIC_DIAGRAM_VELOCITY:Int = 3
Const MAGIC_DIAGRAM_WEIGHT:Int = 4
Const MAGIC_DIAGRAM_SPIN:Int = 5
Const MAGIC_DIAGRAM_ANGULAR_VELOCITY:Int = 6
Const MAGIC_DIAGRAM_MOTION_RAND:Int = 7
Const MAGIC_DIAGRAM_VISIBILITY:Int = 8
Const MAGIC_DIAGRAM_DIRECTION:Int = 9
' Структура, хранящая информацию о текстуре
Type MAGIC_TEXTURE
 Field length:Int ' количество байт в файле
 Field data:Byte Ptr  ' образ файла
 Field crc:Int  ' контрольная сумма образа файла
 Field file:Byte Ptr  ' имя файла
 Field path:Byte Ptr  ' путь к файлу (возможен относительный путь)
 Field Left:Float,top:Float,Right:Float,bottom:Float; ' положение кадра текстуры на суммарной текстуре
 Field frame_width:Int;  ' длина текущего кадра на текстуре
 Field frame_height:Int;  ' высота текущего кадра на текстуре
 Field texture_width:Int;  ' длина суммарной текстуры
 Field texture_height:Int;  ' высота суммарной текстуры
 Field pivot_x:Float;  ' координаты центральной точки отностительно центра текстуры
 Field pivot_y:Float;  ' по умолчанию равен 0,0
 Field scale:Float;  ' масштаб частиц
End Type
Extern
 'Function Magic_OpenFile:Int(file_name$z, hmFile:Int Var) ' deprecated. Ненужная функция, все данные враппер грузит из ОЗУ см.след.ф-ю...
 Function Magic_OpenFileInMemory:Int(buffer:Byte Ptr, hmFile:Int Var)
 Function Magic_CloseFile:Int(hmFile:Int)
 Function Magic_CloseAllFiles()
 Function Magic_GetCurrentFolder$z(hmFile:Int) ' внутренняя файловая система файлов .ptc {
 Function Magic_SetCurrentFolder:Int(hmFile:Int, path$z)
 Function Magic_FindFirst$z(hmFile:Int, data:Byte Ptr, mode:Int)
 Function Magic_FindNext$z(hmFile:Int, data:Byte Ptr) ' }
 'Function Magic_GetFileName$z(hmFile:Int) ' deprecated. Малополезно
 
 Function Magic_LoadEmitter:Int(hmFile:Int, name$z, hmEmitter:Int Var) ' Все, что связано с эмиттером {
 Function Magic_DuplicateEmitter:Int(hmEmitterFrom:Int, hmEmitterTo:Int Var)
 Function Magic_UnloadEmitter:Int(hmEitter:Int)
 Function Magic_Update:Byte(hmEmitter:Int, time:Double)
 Function Magic_Stop:Int(hmEmitter:Int)
 Function Magic_Restart:Int(hmEmitter:Int)
 Function Magic_SetInterrupt:Int(hmEmitter:Int, interrupt:Byte)
 Function Magic_IsInterrupt:Byte(hmEmitter:Int)
 Function Magic_GetPosition:Double(hmEmitter:Int)
 Function Magic_SetPosition:Int(hmEmitter:Int, position:Double)
 Function Magic_GetDuration:Double(hmEmitter:Int)
 Function Magic_GetUpdateTime:Double(hmEmitter:Int)
 Function Magic_GetLoopMode:Int(hmEmitter:Int)
 Function Magic_SetLoopMode:Int(hmEmitter:Int, mode:Int)
 Function Magic_GetColorMode:Int(hmEmitter:Int)
 Function Magic_SetColorMode:Int(hmEmitter:Int, mode:Int)
 Function Magic_GetTint:Int(hmEmitter:Int)
 Function Magic_SetTint:Int(hmEmitter:Int, tint:Int)
 Function Magic_GetTintStrength:Float(hmEmitter:Int)
 Function Magic_SetTintStrength:Int(hmEmitter:Int, tint_strength:Float)
 Function Magic_GetEmitterPosition:Int(hmEmitter:Int, x:Float Var, y:Float Var)
 Function Magic_SetEmitterPosition:Int(hmEmitter:Int, x:Float, y:Float)
 Function Magic_GetEmitterPositionMode:Byte(hmEmitter:Int)
 Function Magic_SetEmitterPositionMode:Int(hmEmitter:Int, mode:Byte)
 Function Magic_GetEmitterDirection:Int(hmEmitter:Int, angle:Float Var)
 Function Magic_SetEmitterDirection:Int(hmEmitter:Int, angle:Float)
 Function Magic_GetEmitterDirectionMode:Byte(hmEmitter:Int)
 Function Magic_SetEmitterDirectionMode:Int(hmEmitter:Int, mode:Byte)
 Function Magic_MoveEmitterParticles:Int(hmEmitter:Int, offset_x:Float, offset_y:Float)
 Function Magic_RotateEmitterParticles:Int(hmEmitter:Int, offset:Float)
 Function Magic_GetEmitterType:Int(hmEmitter:Int, index:Int)
 Function Magic_IsIntensive:Byte()
 Function Magic_GetInterval1:Double(hmEmitter:Int)
 Function Magic_SetInterval1:Int(hmEmitter:Int, position:Double)
 Function Magic_GetInterval2:Double(hmEmitter:Int)
 Function Magic_SetInterval2:Int(hmEmitter:Int, position:Double)
 Function Magic_InInterval:Byte(hmEmitter:Int)
 Function Magic_GetParticlesTypeCount:Int(hmEmitter:Int)
 Function Magic_IsRect:Byte(hmEmitter:Int)
 Function Magic_GetRect:Int(hmEmitter:Int, left_:Int Var, top_:Int Var, right_:Int Var, bottom_:Int Var)
 Function Magic_GetScale:Float(hmEmitter:Int)
 Function Magic_SetScale:Int(hmEmitter:Int, scale:Float)
 Function Magic_IsInterpolationMode:Byte(hmEmitter:Int)
 Function Magic_SetInterpolationMode:Int(hmEmitter:Int, mode:Byte)
 Function Magic_IsRandomMode:Byte(hmEmitter:Int)
 Function Magic_SetRandomMode:Int(hmEmitter:Int, mode:Byte)
 Function Magic_LoadArrayFromFile:Int(hmEmitter:Int, file$z)
 Function Magic_SaveArrayToFile:Int(hmEmitter:Int, file$z)
 Function Magic_SetData:Int(hmEmitter:Int, data:Int)
 Function Magic_GetData:Int(hmEmitter:Int)
 Function Magic_GetEmitterName$z(hmEmitter:Int)
 Function Magic_IsFolder:Byte(hmEmitter:Int)
 Function Magic_GetEmitterCount:Int(hmEmitter:Int)
 Function Magic_GetEmitter:Byte Ptr(hmEmitter:Int, index:Int)
 Function Magic_EmitterToInterval1:Int(hmEmitter:Int, file:Byte Ptr)
 Function Magic_IsInterval1:Byte(hmEmitter:Int)
 
 Function Magic_GetParticlesTypeName$z(hmEmitter:Int, index:Int)
 Function Magic_LockParticlesType:Int(hmEmitter:Int, index:Int)
 Function Magic_UnlockParticlesType:Int()
 Function Magic_GetTextureID:Int()
 Function Magic_SetTextureID:Int(id:Int)
 Function Magic_GetTextureCount:Int()
 Function Magic_GetTexture:Byte Ptr(index:Int)
 Function Magic_GetNextParticle:Byte Ptr()
 Function Magic_GetParticleRectangle:Byte Ptr(particle:Byte Ptr, texture:Byte Ptr)
 
 Function Magic_MoveParticle(x:Float, y:Float)
 Function Magic_RotateParticle(angle:Float)
 
 Function Magic_CreateAtlases:Float(width:Int, height:Int, steps:Int, scale_step:Float)
 Function Magic_GetAtlasCount:Int()
 Function Magic_GetAtlas:Byte Ptr(index:Int)
 
 Function Magic_GetPivot:Int(x:Int Var, y:Int Var)
 Function Magic_IsFlipX:Byte()
 Function Magic_IsFlipY:Byte()
 
 Function Magic_GetDiagramFactor:Float(hmEmitter:Int, type_index:Int, diagram_index:Int)
 Function Magic_SetDiagramFactor:Int(hmEmitter:Int, type_index:Int, diagram_index:Int, factor:Float)
 Function Magic_GetDiagramAddition:Float(hmEmitter:Int, type_index:Int, diagram_index:Int)
 Function Magic_SetDiagramAddition:Int(hmEmitter:Int, type_index:Int, diagram_index:Int, addition:Float)
 Function Magic_IsDiagramEnabled:Byte(hmEmitter:Int, type_index:Int, diagram_index:Int)
End Extern

Код:


Include "shared.bmx"
Private
Function Find:TMagicData(magic:TMagic, name:String)
 For Local _data:TMagicData = EachIn magic
  If _data._name = name Then Return _data
 Next
End Function
Function FindFirst:TMagicData(magic:TMagic)
 Local _data:TMagicData
 For _data = EachIn magic
  If _data._type = MAGIC_FOLDER
  If _data._animate = False Then Continue
  Exit
  Else
  Exit
  End If
 Next
 If _data._name = "" Then Return Null
 Return _data
End Function
Type TMagicEffectDriver Extends TEffectDriver
 Const Debug:Byte = False
 
 Method Init:Byte()
  Return True
 End Method
 
 Method Free()
  data = Null
  rdata = Null
  enum = Null
  Magic_CloseAllFiles()
 End Method
 
 Method Name:String()
  Return "Magic"
 End Method
 
 Method Load:TMagicEffect(url:Object, flags:Int)
  Local tab:String = "~t"
  Local tab2:String = tab + tab
  Local tab3:String = tab + tab + tab
  Try
  Local magic:TMagic = LoadMagic(url)
  Local _data:TMagicData
  _data = FindFirst(magic)
  Assert _data, "ERROR : effect not load."
  Local effect:TMagicEffect = New TMagicEffect
  Select Magic_LoadEmitter(magic._handle, _data._name, effect._handle)
    Case MAGIC_SUCCESS
    effect._images = New TImage[Magic_GetParticlesTypeCount(effect._handle)]
    For Local i:Int = Magic_GetParticlesTypeCount(effect._handle) - 1 To 0 Step - 1
      Magic_LockParticlesType(effect._handle, i)
      For Local ctex:Int = 0 Until Magic_GetTextureCount()
 
      Local m_t:MAGIC_TEXTURE = New MAGIC_TEXTURE
      Local bptr:Byte Ptr = MemAlloc(SizeOf(MAGIC_TEXTURE))
 
      bptr = Magic_GetTexture(ctex)
      MemCopy(m_t, bptr, SizeOf(MAGIC_TEXTURE))
    If Debug
      ' количество байт в файле
      DebugLog tab3 + "length : " + m_t.length
      ' образ файла
      'Print "~t~tdata : " + String.FromCString(m_t.data)
      'DebugLog tab3 + "data : " + "0x" + Hex(Int(m_t.data))
      ' контрольная сумма образа файла
      DebugLog tab3 + "crc : " + m_t.crc
      ' имя файла
      Local file_name:String = String.FromCString(m_t.file)
      DebugLog tab3 + "file : " + file_name
      ' путь к файлу (возможен относительный путь) 
      DebugLog tab3 + "path : " + String.FromCString(m_t.path)
      ' положение кадра текстуры на суммарной текстуре
      DebugLog tab3 + "left : " + m_t.Left + " top : " + m_t.top
      DebugLog tab3 + "right : " + m_t.Right + " bottom : " + m_t.bottom
      ' длина текущего кадра на текстуре
      DebugLog tab3 + "frame_width : " + m_t.frame_width
      ' высота текущего кадра на текстуре
      DebugLog tab3 + "frame_height : " + m_t.frame_height
      ' длина суммарной текстуры
      DebugLog tab3 + "texture_width : " + m_t.texture_width
      ' высота суммарной текстуры
      DebugLog tab3 + "texture_height : " + m_t.texture_height
      ' координаты центральной точки отностительно центра текстуры
      ' по умолчанию равен 0,0
      DebugLog tab3 + "pivot_x : " + m_t.pivot_x
      DebugLog tab3 + "pivot_y : " + m_t.pivot_y
      ' масштаб частиц
      DebugLog tab3 + "scale : " + m_t.scale
    EndIf
      If ctex = 0 Then effect._images[i] = CreateImage(m_t.frame_width, m_t.frame_height, Magic_GetTextureCount(), flags)
      effect._images[i].SetPixmap(ctex, LoadPixmap(CreateRamStream(m_t.data, m_t.length, True, False)))
      SetImageHandle(effect._images[i], (m_t.frame_width Shr 1) + m_t.pivot_x, (m_t.frame_height Shr 1) + m_t.pivot_y)
      m_t = Null
      Next
      Magic_UnlockParticlesType()
    Next
    magic.Close()
    magic = Null
    Magic_SetLoopMode(effect._handle, MAGIC_LOOP)
    Magic_SetColorMode(effect._handle, MAGIC_COLOR_STANDARD)
    Return effect
    Case MAGIC_ERROR
    magic.Close()
    magic = Null
    Throw("ERROR : effect not load : " + _data._Name)
  End Select
  Catch error:Object
  WriteStdout(error.ToString())
  Return Null
  End Try
 End Method
 
 Method Draw(effect_:TEffect, x:Float, y:Float)
  Local effect:TMagicEffect = TMagicEffect(effect_)
  'If effect._stopped = True Then Return
  'If Magic_InInterval(effect._handle) = False Then Return
  Local effect_sx:Float, effect_sy:Float, effect_angle:Float
  Local rBlend:Int, rR:Int, rG:Int, rB:Int, rA:Float
  rBlend = GetBlend()
  rA = GetAlpha()
  GetColor(rR, rG, rB)
  GetScale(effect_sx, effect_sy)
  effect_angle = GetRotation()
  Magic_SetEmitterDirection(effect._handle, effect_angle)
  Magic_SetEmitterPosition(effect._handle, x / effect_sx, y / effect_sy)
  If Magic_GetColorMode(effect._handle) = MAGIC_COLOR_TINT
  Magic_SetTint(effect._handle, (0 Shl 24) | (rB Shl 16) | (rG Shl 8) | rR)
  End If
  For Local index:Int = Magic_GetParticlesTypeCount(effect._handle) - 1 To 0 Step - 1
  Magic_LockParticlesType(effect._handle, index)
  If Magic_IsIntensive() = True
    SetBlend(LIGHTBLEND)
  Else
    SetBlend(ALPHABLEND)
  End If
  Local particle:Byte Ptr
  Repeat
    particle = Magic_GetNextParticle()
    If particle = Null Then Exit
 
    Local FloatPtr:Float Ptr = Float Ptr(particle)
 
    Local px:Float = Float(floatPtr[0]) * effect_sx
    Local py:Float = Float(floatPtr[1]) * effect_sy
    Local psize:Float = Float(floatPtr[2])
    Local pangle:Float = Float(floatPtr[3])' - effect_angle
 
    Local intPtr:Int Ptr = Int Ptr(particle)
 
    Local color:Byte Ptr = Varptr(intPtr)[4]
    Local A:Byte = color[3]
    Local R:Byte = color[2]
    Local G:Byte = color[1]
    Local B:Byte = color[0]
    SetColor(R, G, B)
    SetAlpha(rA * (Float(A) / 255.0))
 
    Local frame:Int = Int(intPtr[5])
 
    Local pscalex:Float = psize / effect._images[index].width
    Local pscaley:Float = psize / effect._images[index].height
 
    SetTransform(pangle, pscalex * effect_sx, pscaley * effect_sy)
    DrawImage(effect._images[index], px, py, frame)
  Forever
  Magic_UnlockParticlesType()
  Next
  SetTransform(effect_angle, effect_sx, effect_sy) ' restore
  SetBlend(rBlend) ' restore
  SetAlpha(rA) ' restore
  SetColor(rR, rG, rB) ' restore
 End Method
 
 Method Update(effect:TEffect, dt:Float)
  Local eff:TMagicEffect = TMagicEffect(effect)
  If Magic_IsInterrupt(eff._handle) = False
  If eff._stopped Then Return
  eff._stopped = Not Magic_Update(eff._handle, dt * Magic_GetUpdateTime(eff._handle))
  Else
  Magic_Update(eff._handle, dt * Magic_GetUpdateTime(eff._handle))
  eff._stopped = True
  EndIf
 End Method
End Type
New TMagicEffectDriver
SetEffectDriver("Magic")
Type TMagicEffect Extends TEffect
 Field _handle:Int
 Field _images:TImage[0]
 Field _stopped:Byte = True
 
 Method Delete()
  Free()
 End Method
 
 Method Free()
  If _handle <> 0
  Magic_UnloadEmitter(_handle)
  _handle = 0
  End If
  _images = Null
  _stopped = Null
 End Method
 
 Method Copy:TMagicEffect()
  Try
  Local effect:TMagicEffect = New TMagicEffect
  If Magic_DuplicateEmitter(_handle, effect._handle) = MAGIC_ERROR Then Throw("ERROR : can't copy effect")
  effect._images = _images
  effect._stopped = _stopped
  Return effect
  Catch error:Object
  WriteStdout(error.ToString())
  Return Null
  End Try
 End Method
 
 Method Play(Loop:Byte = False)
  Select Loop
  Case EFFECT_LOOP Magic_SetLoopMode(_handle, MAGIC_LOOP)
  Case EFFECT_CLIP Magic_SetLoopMode(_handle, MAGIC_FOREVER)
  Default Magic_SetLoopMode(_handle, MAGIC_NOLOOP)
  End Select
  If _stopped Then Magic_Restart(_handle)
  _stopped = False
 End Method
 
 Method Playing:Byte()
  Return _stopped = False
 End Method
 
 Method Stop()
  _stopped = True
  Magic_Stop(_handle)
 End Method
 
 Method SetPaused(paused:Byte)
  Select paused
  Case True
    If _stopped Then Return
    Magic_SetInterrupt(_handle, True)
    _stopped = True
  Case False
    If _stopped = False Then Return
    If Magic_IsInterrupt(_handle) = True
    Magic_SetInterrupt(_handle, False)
    _stopped = False
    Return
    End If
    'Magic_Restart(_handle)
    _stopped = False
  End Select
 End Method
 
 Method SetMode(mode:Byte)
  If (mode & EFFECT_MODE_POSITION)
  Magic_SetEmitterPositionMode(_handle, False)
  Else
  Magic_SetEmitterPositionMode(_handle, True)
  End If
  If (mode & EFFECT_MODE_ROTATION)
  Magic_SetEmitterDirectionMode(_handle, False)
  Else
  Magic_SetEmitterDirectionMode(_handle, True)
  End If
 End Method
 
 Method GetMode:Byte()
  Local pos:Byte = Not Magic_GetEmitterPositionMode(_handle)
  Local rot:Byte = (Not Magic_GetEmitterDirectionMode(_handle)) * EFFECT_MODE_ROTATION
  Return pos | rot
 End Method
 
 Method MoveParticles(speedAngle:Float = 0.0, speedx:Float = 0.0, speedy:Float = 0.0)
  If speedAngle <> 0.0
  Magic_RotateEmitterParticles(_handle, speedAngle)
  End If
  If (speedx <> 0.0) | (speedy <> 0.0)
  Magic_MoveEmitterParticles(_handle, speedx, speedy)
  End If
 End Method
 
 Method ColorMode(mode:Byte = False, power:Float = 1.0)
  power = Max(Min(power, 1.0) , 0.0)
  Magic_SetTintStrength(_handle, power * 100.0)
  Select mode
  Case False Magic_SetColorMode(_handle, MAGIC_COLOR_STANDARD)
  Case True Magic_SetColorMode(_handle, MAGIC_COLOR_TINT)
  Default Magic_SetColorMode(_handle, MAGIC_COLOR_USER)
  End Select
 End Method
 
 Method SetParam(param:Int, data:Object)
 
 End Method
 
 Method GetParam:Object(param:Int)
 
 End Method
End Type

Код:


Private
Type MagicData
 Field _type:Int
 Field _name:Byte Ptr
 Field _animate:Int
 Method ToString:String()
  Return String.FromCString(_name)
 End Method
End Type
Global data:MagicData = New MagicData
Global rdata:TMagicData = New TMagicData
Global enum:TMagicEnum = New TMagicEnum
Global _start:Byte = False
Type TMagicEnum
 Field _handle:Int
 
 Method HasNext:Int()
  If _start
  _start = False
  If Magic_FindFirst(_handle, data, 0) <> "" Then Return True
  End If
  If Magic_FindNext(_handle, data) <> "" Then Return True
 End Method
 
 Method NextObject:Object()
  rdata._animate = data._animate
  rdata._name = data.ToString()
  rdata._type = data._type
  Return rdata
 End Method
End Type
Rem'
 bbdoc: Данные ресурсного файла.
EndRem
Type TMagicData
 Rem'
 bbdoc: Тип файла (папка \ эмиттер).
 EndRem
 Field _type:Int
 
 Rem'
 bbdoc: Имя файла.
 EndRem
 Field _name:String
 
 Rem'
 bbdoc: Признак анимированности.
 EndRem
 Field _animate:Int
End Type
Rem'
 bbdoc: Ресурсный файл.
EndRem
Type TMagic
 Field _handle:Int
 
 Method Delete()
  Close()
 End Method
 
 Rem'
 bbdoc: Закрывает файл.
 EndRem
 Method Close()
  If _handle <> 0
  Magic_CloseFile(_handle)
  _handle = 0
  End If
 End Method
 
 Rem'
 bbdoc: Загружает ptc-файл по указанному пути.
 EndRem
 Method Load:Int(url:Object)
  Local stream:TStream = TStream(url)
  If Not stream Then stream = ReadStream(url)
  If Not stream Then Throw("Magic -> Error loading .ptc file (" + url.ToString() + ")")
  Local mem:Byte Ptr = MemAlloc(stream.Size())
  stream.Read(mem, stream.Size())
  stream.Close() ; stream = Null
  Return Magic_OpenFileInMemory(mem, _handle)
 End Method
 
 Rem'
 bbdoc: Возвращает полный путь к текущей папке.
 EndRem
 Method GetCurrentFolder:String()
  Return Magic_GetCurrentFolder(_handle)
 End Method
 
 Rem'
 bbdoc: Устанавливает новую текущую папку.
 EndRem
 Method SetCurrentFolder(path:String = "")
  Magic_SetCurrentFolder(_handle, path)
 End Method
 
 'Private
 Method ObjectEnumerator:TMagicEnum()
  enum._handle = _handle
  _start = True
  Return enum
 End Method
End Type
Rem'
 bbdoc: Функция загружает ptc-файл.
EndRem
Function LoadMagic:TMagic(url:Object)
 'Try
  Local magic:TMagic = New TMagic
  If magic.Load(url) <> MAGIC_SUCCESS Then Throw("Magic -> Error loading .ptc file (" + url.ToString() + ")")
  Return magic
 'Catch error:Object
 ' Notify error.ToString()
 ' Return Null
 'End Try
End Function

Ну и как тебе такой заголовок ?

maxturbo 21.05.2011 06:42

Ответ: Модуль Magic Particles
 
Мда )))) Не хило :)
Цитата:

Сообщение от Diablo1909 (Сообщение 189040)
Номальные партиклы для Б3Д уже давно есть.

А где взять эти нормальны Particl'ы для Blitz3D ?? :)

Черный крыс 03.06.2012 18:51

Ответ: Модуль Magic Particles
 
Цитата:

Сообщение от maxturbo (Сообщение 189066)
Мда )))) Не хило :)

А где взять эти нормальны Particl'ы для Blitz3D ?? :)

Спроси у tormoz'а.


Часовой пояс GMT +4, время: 02:51.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot