Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2005.12.04;
Скачать: [xml.tar.bz2];

Вниз

Фатальная ошибка при вызове CollisionManager.CheckCollisions   Найти похожие ветки 

 
Fosgen   (2005-07-20 09:06) [0]

Вопрос:
Никто не сталкивался с появлением ошибки Access Violation при вызове CollisionManager.CheckCollisions после перехода на более "свежие" версии GLScene? Ошибка возникает даже если обработчик CheckCollisions - "пустой" - т.е. кроме комментарием между begin ... end; ничего нет.

Подробности:
В столкновениях участвуют FreeForms с построенным Octree (BuildOctree). Для определения конкретной точки соприкосновения объектов. При рассчитанных Octree отладчик стопорится в модуле VectorLists.
При отключении расчета Octree отладчик вообще не указывает какое-либо место. Просто возникает Access Violation.

В обоих случаях:
Обработчик CheckCollision - пустой.
Если даже по счастливому совпадению программа запустилась - идут страшные тормоза (видюха - GF6800GT PCI-Ex, P-3000, 1Gb RAM) - порядка 2 FPS!!! При выходе из программы корректным способом - возникает все тот же Access Violation.
Помогите, кто чем может! Заранее - спасибо!


 
Fosgen   (2005-07-20 09:55) [1]

Еще хотелось бы добавить - под старой версией GLScene (в которой еще не было GLLensFlare, GLTrail и PerlinGFX) весь имеющийся алгоритм совершенно корректно работал и давал порядка 170 FPS. Проблемы начались именно после перехода на более "совершенную" версию. :(((


 
DeadMeat ©   (2005-07-20 10:17) [2]

Код..? И если можно цели.. Может есть другой способ..


 
Fosgen   (2005-07-20 11:01) [3]


procedure TForm1.GLCadencer1Progress(Sender: TObject; DeltaTime,
 NewTime: Double);
begin
  MissileCollision.CheckCollision;
end;

procedure TForm1.MisCollision(Sender: TObject; object1,
 object2: TGLBaseSceneObject);
var i: Byte;
 Dis1, Dis2: Single;
 rayStart, rayVector, iPoint, iNormal: TVector;
 CurrentObj: TGLFreeForm;
 CurrentShield: TShield;
begin
// GLCadencer1.Enabled:=False;
if Sender=MissileCollision then
begin
//===Missile=================================================================
 if (object2.ClassName = "TMissileForm") and (object1.ClassName <> "TShotForm") and (object1.ClassName <> "TGLPlane") and (Missile[object2.Tag] <> nil) then
 begin
   if (object1.ClassName = "TShield") then
   begin
     CurrentShield := object1 as TShield;
     if (CurrentShield.RaceOwner <> Missile[object2.tag].RaceOwner) then
     begin
       Missile[object2.tag].Detonate := True;
       Missile[object2.tag].HitedObj := object1 as TGLCustomSceneObject;
       //CurrentShield.FlashHit(CurrentShield.ShieldPower - Missile[object2.tag].Power);
       AddHit(iPoint, iNormal, tsPlasma, 40, True);
       CurrentShield.ShieldPower := CurrentShield.ShieldPower - Missile[object2.tag].Power;
       if CurrentShield.ShieldPower <= 0 then
         with TGLBCollision(CurrentShield.Behaviours.GetByClass(TGLBCollision)) do
           GroupIndex := -1;
     end;
   end else
   begin
     Missile[object2.tag].Detonate := True;
     Missile[object2.tag].HitedObj := object1 as TGLCustomSceneObject;
   end;
 end;
 //=====Shot=======================================================================
 if (object2.ClassName = "TShotForm") and (object1.ClassName <> "TShotForm") and (object1.ClassName <> "TMissileForm") and (object1.ClassName <> "TGLPlane") and (Shot[object2.Tag] <> nil) then
 begin
   Shot[object2.Tag].HitedObj := object1 as TGLCustomSceneObject;
   rayStart := object2.AbsolutePosition;
   rayVector := object2.Direction.AsVector;
   NegateVector(rayVector);
   NormalizeVector(rayVector);
   CurrentObj := object1 as TGLFreeForm;
   if CurrentObj.OctreeRayCastIntersect(raystart, rayvector, @iPoint, @iNormal) then
   begin
     NormalizeVector(iNormal);
     if (object1.ClassName = "TShield") then
     begin
       CurrentShield := object1 as TShield;
       if (CurrentShield.RaceOwner <> Shot[object2.tag].RaceOwner) then
       begin
         AddHit(iPoint, iNormal, tsPlasma, 40, True);
         Shot[object2.tag].Detonate := True;
         Shot[object2.tag].fmodel.Visible := False;
           //CurrentShield.FlashHit(CurrentShield.ShieldPower - Shot[object2.tag].Power);
         CurrentShield.ShieldPower := CurrentShield.ShieldPower - Shot[object2.tag].Power;
         if CurrentShield.ShieldPower <= 0 then
           with CurrentShield.Behaviours.Behaviour[0] as TGLBCollision do
             GroupIndex := -1;
       end;
     end else
     begin
       AddHit(iPoint, iNormal, tsPlasma, 40, False);
       Shot[object2.tag].Detonate := True;
       Shot[object2.tag].fmodel.Visible := False;
     end;
   end;
 end;
 //======Beam======================================================================
 if (object1.ClassName = "TBeamForm") and (object2.ClassName <> "TBeamForm") and (object2.ClassName <> "TShotForm") and (object2.ClassName <> "TGLPlane") and (object2.ClassName <> "TGLSprite") then
 begin
   if Beam[object1.tag] <> nil then begin
     SetVector(rayStart, Beam[object1.tag].StartVector);
     SetVector(rayVector, Beam[object1.tag].TrgVector);
       {NormalizeVector(RayVector);
       //ScaleVector(RayVector, 15);
       AddVector(rayVector, rayStart);
       SetVector(rayVector, object1.AbsoluteDirection); }
       //ScaleVector(rayVector,991);

     CurrentObj := object2 as TGLFreeForm;
     if (not Beam[object1.tag].Detonate) and (CurrentObj.OctreeRayCastIntersect(raystart, rayvector, @iPoint, @iNormal)) then
     begin
       NormalizeVector(iNormal);
       with Beam[object1.tag] do begin
         Beam[object1.Tag].HitedObj := object2 as TGLCustomSceneObject;
         tdummy := TGLDummyCube(GLcadencer1.Scene.Objects.AddNewChild(TGLDummyCube));
         tdummy.Position.AsVector := iPoint;
         tdummy.Direction.AsVector := iNormal;
         Detonate := True;
         Hit;
         with Beam[object1.tag].fHitSprite do begin //Creating flare of firing
           Material.BlendingMode := bmAdditive;
           Material.MaterialLibrary := Sfx_Textures;
           Material.LibMaterialName := "beamHit";
           ObjectsSorting := osNone;
         end;
       end;
     end;
   end;
 end;
 if (object2.ClassName = "TBeamForm") and (object1.ClassName <> "TBeamForm") and (object1.ClassName <> "TShotForm") and (object1.ClassName <> "TGLPlane") and (object1.ClassName <> "TGLSprite") then
 begin
   if Beam[object2.tag] <> nil then begin
     SetVector(rayStart, Beam[object2.tag].helper.AbsolutePosition);
     SetVector(rayVector, Beam[object2.tag].TrgVector);
       {NormalizeVector(RayVector);
       ScaleVector(RayVector, 15);
       AddVector(rayVector, rayStart);
       SetVector(rayVector, object2.AbsoluteDirection);
       ScaleVector(rayVector,991);  }

     CurrentObj := object1 as TGLFreeForm;
     if (not Beam[object2.Tag].Detonate) and (CurrentObj.OctreeRayCastIntersect(raystart, rayvector, @iPoint, @iNormal)) then
     begin
       NormalizeVector(iNormal);
       with Beam[object2.tag] do begin
         Beam[object2.Tag].HitedObj := object1 as TGLCustomSceneObject;
         tdummy := TGLDummyCube(GLcadencer1.Scene.Objects.AddNewChild(TGLDummyCube));
         tdummy.Position.AsVector := iPoint;
         tdummy.Direction.AsVector := iNormal;
         Detonate := True;
         Hit;
         with Beam[object2.tag].fHitSprite do begin //Creating flare of firing
           Material.BlendingMode := bmAdditive;
           Material.MaterialLibrary := Sfx_Textures;
           Material.LibMaterialName := "beamHit";
           ObjectsSorting := osNone;
         end;
       end;
     end;
   end;
 end;
// GLCadencer1.Enabled:=True; }
end;
end;


Цели:
Через CollisionManager - определяется факт столкновения и взаимодейстующие объекты. Потом через OctreeRayCastIntersect - точка столкновения и нормаль для создания "спецэффектов".
Повторюсь - под старой версией GLScene все работало. Отлажены были блоки Shot и Missile. После "апгрейда" GLScene престали отрабатывать столкновения и стало безумно тормозить. Работает 1 раз из 10-ти, с указанными проблемами. Я был, мягко говоря, неприятно удивлен. Думаю проблема в "доработке" поздней версии.


 
Fosgen   (2005-07-20 11:03) [4]

Насчет "пустого" обработчика TForm1.MisCollision(Sender: TObject; object1,
object2: TGLBaseSceneObject); - Если закоментировать ВСЕ что есть между begin...end; - ничего в работе кода не меняется.



Страницы: 1 вся ветка

Форум: "Игры";
Текущий архив: 2005.12.04;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.038 c
2-1131877539
Ольга
2005-11-13 13:25
2005.12.04
Загрузка файла в TStringList


2-1132047340
NFM
2005-11-15 12:35
2005.12.04
indy10


2-1131972329
abu
2005-11-14 15:45
2005.12.04
Свойства как элементы массива-записи


14-1131600217
ZeroDivide
2005-11-10 08:23
2005.12.04
Что за контора такая: ОЛДИ (Москва)


1-1131190336
_Sergey_
2005-11-05 14:32
2005.12.04
Удаление выделенных узлов TreeView





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский