Autor Wątek: Błąd podczas uruchamiania przykładowej aplikacji w Ogre  (Przeczytany 2443 razy)

Offline Pawel1503

  • Użytkownik
    • DevBlog Pawel1503

# Sierpień 16, 2010, 18:19:46
Witam!

Mam taki mały problem. Otóż zainstalowałem sobie SDK OGRE 1.7.1. Dodałem wszystkie include, libki i dll'e. Według tutoriala dodałem taki kod:

Kod: (cpp) [Zaznacz]
#include "Ogre.h"     /* Wszystkie nagłówki OGRE */
#include "ExampleApplication.h"
#include <windows.h>  /* Umożliwia wypisywanie błędów */

// Dziedziczymy ExampleApplication
class MyApp : public ExampleApplication
{
  protected:
  public:
    MyApp()
    {
    }

    ~MyApp()
    {
    }
  protected:
    /** createScene jest funkcją czysto wirtualną w ExampleApplication,
     *  nadpisujemy ją, aby nic nie robiła.
     *  Na początku tworzy ona pustą scenę.
     **/
    void createScene(void)
    {
    }
};
 
INT WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,INT)
{
   MyApp App;     // Tworzymy instancję naszej klasy
   try
   {
     App.go();       // ExampleApplication dostarcza metodę go, która rozpoczyna rendering
     return 0;   // Zwraca 0 w przypadku powodzenia
   }
   catch (Ogre::Exception& e)  // Przechwytuje wyjątki (błędy)
   {
     MessageBox( NULL, e.getFullDescription().c_str(), "Wyjątek!",
           MB_OK | MB_ICONERROR | MB_TASKMODAL);
     return 1;   // Zwrócenie liczby różnej od zera oznacza niepowodzenie
   }
}

Wywala się przy linijce:

Kod: (cpp) [Zaznacz]
App.go();       // ExampleApplication dostarcza metodę go, która rozpoczyna rendering
Link: http://pl.wikibooks.org/wiki/OGRE/Zal%C4%85%C5%BCek_programu_OGRE#Wsp.C3.B3lny

Kompilacja przebiega bezproblemowo, ale podczas uruchamiania programu program się wywala: (załącznik).
Oprócz tego błędu, po kliknięciu break, odsyła mnie do tego:

Kod: (cpp) [Zaznacz]
/***
*new.cxx - defines C++ new routine
*
*       Copyright (c) Microsoft Corporation.  All rights reserved.
*
*Purpose:
*       Defines C++ new routine.
*
*******************************************************************************/


#ifdef _SYSCRT
#include <cruntime.h>
#include <crtdbg.h>
#include <malloc.h>
#include <new.h>
#include <stdlib.h>
#include <winheap.h>
#include <rtcsup.h>
#include <internal.h>

void * operator new( size_t cb )
{
    void *res;

    for (;;) {

        //  allocate memory block
        res = _heap_alloc(cb);

        //  if successful allocation, return pointer to memory

        if (res)
            break;

        //  call installed new handler
        if (!_callnewh(cb))
            break;

        //  new handler was successful -- try to allocate again
    }

    RTCCALLBACK(_RTC_Allocate_hook, (res, cb, 0));

    return res;
}
#else  /* _SYSCRT */

#include <cstdlib>
#include <new>

_C_LIB_DECL
int __cdecl _callnewh(size_t size) _THROW1(_STD bad_alloc);
_END_C_LIB_DECL

void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
        {       // try to allocate size bytes
        void *p;
        while ((p = malloc(size)) == 0)
                if (_callnewh(size) == 0)
                {       // report no memory
                static const std::bad_alloc nomem;
                _RAISE(nomem);
                }

        return (p);
        }

/*
 * Copyright (c) 1992-2002 by P.J. Plauger.  ALL RIGHTS RESERVED.
 * Consult your license regarding permissions and restrictions.
 V3.13:0009 */
#endif  /* _SYSCRT */

A konkretnie do tego:

         
Kod: (cpp) [Zaznacz]
      _RAISE(nomem);
Co z tym zrobić ? Pozdrawiam !
« Ostatnia zmiana: Sierpień 16, 2010, 18:56:39 wysłana przez Pawel1503 »

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Bevier

  • Użytkownik

# Sierpień 16, 2010, 18:42:59
"Błąd podczas kompilacji kodu w Ogre"

...

Cytuj
Kompilacja przebiega bezproblemowo

lol

Wywal to go() i sprawdź czy działa. Jeśli będzie działać to możliwe, że coś jest nie tak w tej funkcji :P

Offline Pawel1503

  • Użytkownik
    • DevBlog Pawel1503

# Sierpień 16, 2010, 18:56:10
"Błąd podczas kompilacji kodu w Ogre"

...

Cytuj
Kompilacja przebiega bezproblemowo

lol

Wywal to go() i sprawdź czy działa. Jeśli będzie działać to możliwe, że coś jest nie tak w tej funkcji :P

Qurde ale zrobiłem bałagan. Już zmieniam temat :P
Wywalenie App.go() uruchamia i zamyka aplikacje.

Offline aod

  • Użytkownik

  • Zbanowany
# Sierpień 16, 2010, 19:10:35
Spróbuj dodać #define _STLP_DEBUG.
Kompilujesz w release czy debug?
Masz odpowiednie do trybu kompilacji DLLki?

Offline hfjh

  • Użytkownik

# Sierpień 16, 2010, 20:55:00
Sprawdzasz wyjątki? Ciężko coś wymyślić, jak nie dajesz jakiś bardziej szczegółowych informacji - jeśli to kod tutorialowy, App::go() to cała aplikacja, kod nie ma gdzie się wywalić poza nią :)

Offline BrutalComputer

  • Użytkownik

# Sierpień 16, 2010, 21:47:22
Olej zalążki programu i zacznij od uruchomienia przykładów bezpośrednio z SDK. Te będą działały na 100%.

Offline Pawel1503

  • Użytkownik
    • DevBlog Pawel1503

# Sierpień 17, 2010, 18:21:04
No dobra, więc postanowiłem uruchomić przykładową aplikacje. Wybrałem sobie jakąś z nazwą Grass czy coś takiego. Skopiowałem i wkleiłem do mojego projektu Grass.cpp i Grass.h. I co się okazało. Linker nie chce zjeść kodu i mi wyrzuca:

1>------ Build started: Project: OGRE, Configuration: Debug Win32 ------
1>     Creating library C:\Users\Dzieci\Documents\Visual Studio 2010\Projects\OGRE\Debug\OGRE.lib and object C:\Users\Dzieci\Documents\Visual Studio 2010\Projects\OGRE\Debug\OGRE.exp
1>LINK : fatal error LNK1561: entry point must be defined
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Grass.h
Kod: (cpp) [Zaznacz]
#ifndef __Grass_H__
#define __Grass_H__

#include <SdkSample.h>

using namespace Ogre;
using namespace OgreBites;

class _OgreSampleClassExport Sample_Grass : public SdkSample
{
public:

Sample_Grass() : GRASS_WIDTH(40), GRASS_HEIGHT(40)
{
mInfo["Title"] = "Grass";
mInfo["Description"] = "Demonstrates how to use the StaticGeometry class to create 'baked' "
"instances of many meshes, to create effects like grass efficiently.";
mInfo["Thumbnail"] = "thumb_grass.png";
mInfo["Category"] = "Environment";
mInfo["Help"] = "Press B to toggle bounding boxes.";
}

    bool frameRenderingQueued(const FrameEvent& evt)
    {
mLightAnimState->addTime(evt.timeSinceLastFrame);   // move the light around
waveGrass(evt.timeSinceLastFrame);                  // wave the grass around slowly to simulate wind
return SdkSample::frameRenderingQueued(evt);        // don't forget the parent class updates!
    }

bool keyPressed(const OIS::KeyEvent& evt)
{
// toggle bounding boxes with B key unless the help dialog is visible
if (evt.key == OIS::KC_B && !mTrayMgr->isDialogVisible())
mSceneMgr->showBoundingBoxes(!mSceneMgr->getShowBoundingBoxes());
return SdkSample::keyPressed(evt);
}

protected:

/*=============================================================================
// This class will be used to pulsate the light and billboard.
=============================================================================*/
class LightPulse : public ControllerValue<Real>
{
public:

LightPulse(Light* light, Billboard* billboard, const ColourValue& maxColour, Real maxSize)
{
mLight = light;
mBillboard = billboard;
mMaxColour = maxColour;
mMaxSize = maxSize;
}

Real getValue () const
{
return mIntensity;
}

void setValue (Real value)
{
mIntensity = value;

// calculate new colour and apply it to the light and billboard
ColourValue newColour = mMaxColour * mIntensity;
mLight->setDiffuseColour(newColour);
mBillboard->setColour(newColour);

// calculate new billboard size and apply it
Real newSize = mMaxSize * mIntensity;
mBillboard->setDimensions(newSize, newSize);
}

protected:

Light* mLight;
Billboard* mBillboard;
ColourValue mMaxColour;
Real mMaxSize;
Real mIntensity;
};

#if OGRE_COMPILER == OGRE_COMPILER_MSVC
# pragma pack(push, 1)
#endif
    struct GrassVertex
{
        float x, y, z;
        float nx, ny, nz;
        float u, v;
    };
#if OGRE_COMPILER == OGRE_COMPILER_MSVC
# pragma pack(pop)
#endif

void setupContent()
{
mSceneMgr->setSkyBox(true, "Examples/SpaceSkyBox");

// create a mesh for our ground
MeshManager::getSingleton().createPlane("ground", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
Plane(Vector3::UNIT_Y, 0), 1000, 1000, 20, 20, true, 1, 6, 6, Vector3::UNIT_Z);

// create a ground entity from our mesh and attach it to the origin
Entity* ground = mSceneMgr->createEntity("Ground", "ground");
ground->setMaterialName("Examples/GrassFloor");
ground->setCastShadows(false);
mSceneMgr->getRootSceneNode()->attachObject(ground);

// create our grass mesh, and create a grass entity from it
createGrassMesh();
Entity* grass = mSceneMgr->createEntity("Grass", "grass");

// create a static geometry field, which we will populate with grass
mField = mSceneMgr->createStaticGeometry("Field");
mField->setRegionDimensions(Vector3(140, 140, 140));
mField->setOrigin(Vector3(70, 70, 70));

// add grass uniformly throughout the field, with some random variations
for (int x = -280; x < 280; x += 20)
{
for (int z = -280; z < 280; z += 20)
{
Vector3 pos(x + Math::RangeRandom(-7, 7), 0, z + Math::RangeRandom(-7, 7));
Quaternion ori(Degree(Math::RangeRandom(0, 359)), Vector3::UNIT_Y);
Vector3 scale(1, Math::RangeRandom(0.85, 1.15), 1);

mField->addEntity(grass, pos, ori, scale);
}
}

mField->build();  // build our static geometry (bake the grass into it)

// build tangent vectors for the ogre head mesh
MeshPtr headMesh = MeshManager::getSingleton().load("ogrehead.mesh", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
unsigned short src, dest;
if (!headMesh->suggestTangentVectorBuildParams(VES_TANGENT, src, dest))
headMesh->buildTangentVectors(VES_TANGENT, src, dest);

// put an ogre head in the middle of the field
Entity* head = mSceneMgr->createEntity("Head", "ogrehead.mesh");
head->setMaterialName("Examples/OffsetMapping/Specular");
mSceneMgr->getRootSceneNode()->createChildSceneNode(Vector3(0, 30, 0))->attachObject(head);

setupLighting();

// set initial camera position and speed
mCamera->setPosition(0, 50, 100);
}

void createGrassMesh()
{
MeshPtr mesh = MeshManager::getSingleton().createManual("grass", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);

// create a submesh with the grass material
SubMesh* sm = mesh->createSubMesh();
sm->setMaterialName("Examples/GrassBlades");
sm->useSharedVertices = false;
sm->vertexData = OGRE_NEW VertexData();
sm->vertexData->vertexStart = 0;
sm->vertexData->vertexCount = 12;
sm->indexData->indexCount = 18;

// specify a vertex format declaration for our mesh: 3 floats for position, 3 floats for normal, 2 floats for UV
VertexDeclaration* decl = sm->vertexData->vertexDeclaration;
        decl->addElement(0, 0, VET_FLOAT3, VES_POSITION);
        decl->addElement(0, sizeof(float) * 3, VET_FLOAT3, VES_NORMAL);
        decl->addElement(0, sizeof(float) * 6, VET_FLOAT2, VES_TEXTURE_COORDINATES, 0);

// create a vertex buffer
HardwareVertexBufferSharedPtr vb = HardwareBufferManager::getSingleton().createVertexBuffer
(decl->getVertexSize(0), sm->vertexData->vertexCount, HardwareBuffer::HBU_STATIC_WRITE_ONLY);

GrassVertex* verts = (GrassVertex*)vb->lock(HardwareBuffer::HBL_DISCARD);  // start filling in vertex data

for (unsigned int i = 0; i < 3; i++)  // each grass mesh consists of 3 planes
{
// planes intersect along the Y axis with 60 degrees between them
Real x = Math::Cos(Degree(i * 60)) * GRASS_WIDTH / 2;
Real z = Math::Sin(Degree(i * 60)) * GRASS_WIDTH / 2;

for (unsigned int j = 0; j < 4; j++)  // each plane has 4 vertices
{
GrassVertex& vert = verts[i * 4 + j];

vert.x = j < 2 ? -x : x;
vert.y = j % 2 ? 0 : GRASS_HEIGHT;
vert.z = j < 2 ? -z : z;

// all normals point straight up
vert.nx = 0;
vert.ny = 1;
vert.nz = 0;

vert.u = j < 2 ? 0 : 1;
vert.v = j % 2;
}
}

vb->unlock();  // commit vertex changes

sm->vertexData->vertexBufferBinding->setBinding(0, vb);  // bind vertex buffer to our submesh

// create an index buffer
sm->indexData->indexBuffer = HardwareBufferManager::getSingleton().createIndexBuffer
(HardwareIndexBuffer::IT_16BIT, sm->indexData->indexCount, HardwareBuffer::HBU_STATIC_WRITE_ONLY);

// start filling in index data
Ogre::uint16* indices = (Ogre::uint16*)sm->indexData->indexBuffer->lock(HardwareBuffer::HBL_DISCARD);

for (unsigned int i = 0; i < 3; i++)  // each grass mesh consists of 3 planes
{
unsigned int off = i * 4;  // each plane consists of 2 triangles

*indices++ = 0 + off;
*indices++ = 3 + off;
*indices++ = 1 + off;

*indices++ = 0 + off;
*indices++ = 2 + off;
*indices++ = 3 + off;
}

sm->indexData->indexBuffer->unlock();  // commit index changes
}

void setupLighting()
{
mSceneMgr->setAmbientLight(ColourValue::Black);  // turn off ambient light

ColourValue lightColour(1, 1, 0.3);

// create a light
Light* light = mSceneMgr->createLight();
light->setDiffuseColour(lightColour);
light->setSpecularColour(1, 1, 0.3);
light->setAttenuation(1500, 1, 0.0005, 0);

// create a flare
BillboardSet* bbs = mSceneMgr->createBillboardSet(1);
bbs->setMaterialName("Examples/Flare");
Billboard* bb = bbs->createBillboard(0, 0, 0, lightColour);

// create a controller for the light intensity, using our LightPulsator class
ControllerFunctionRealPtr func(OGRE_NEW WaveformControllerFunction(Ogre::WFT_SINE, 0.5, 0.5, 0, 0.5));
ControllerValueRealPtr dest(OGRE_NEW LightPulse(light, bb, lightColour, 15));
ControllerManager& cm = ControllerManager::getSingleton();
mLightController = cm.createController(cm.getFrameTimeSource(), dest, func);

// create a light node and attach the light and flare to it
SceneNode* lightNode = mSceneMgr->getRootSceneNode()->createChildSceneNode();
lightNode->attachObject(light);
lightNode->attachObject(bbs);

// set up a 20 second animation for our light, using spline interpolation for nice curves
        Animation* anim = mSceneMgr->createAnimation("LightTrack", 20);
        anim->setInterpolationMode(Animation::IM_SPLINE);

// create a track to animate the camera's node
        NodeAnimationTrack* track = anim->createNodeTrack(0, lightNode);

        // create keyframes for our track
        track->createNodeKeyFrame(0)->setTranslate(Vector3(42, 77, -42));
        track->createNodeKeyFrame(2)->setTranslate(Vector3(21, 84, -35));
        track->createNodeKeyFrame(4)->setTranslate(Vector3(-21, 91, -14));
        track->createNodeKeyFrame(6)->setTranslate(Vector3(-56, 70, -28));
        track->createNodeKeyFrame(8)->setTranslate(Vector3(-28, 70, -56));
        track->createNodeKeyFrame(10)->setTranslate(Vector3(-14, 63, -28));
        track->createNodeKeyFrame(12)->setTranslate(Vector3(-14, 56, 28));
        track->createNodeKeyFrame(14)->setTranslate(Vector3(0, 35, 84));
        track->createNodeKeyFrame(16)->setTranslate(Vector3(14, 35, 14));
        track->createNodeKeyFrame(18)->setTranslate(Vector3(35, 84, 0));
        track->createNodeKeyFrame(20)->setTranslate(Vector3(42, 77, -42));

lightNode->setPosition(track->getNodeKeyFrame(0)->getTranslate());

// create a new animation state to track this
mLightAnimState = mSceneMgr->createAnimationState("LightTrack");
mLightAnimState->setEnabled(true);
}

void waveGrass(Real timeElapsed)
{
static Real xinc = Math::PI * 0.3;
static Real zinc = Math::PI * 0.44;
static Real xpos = Math::RangeRandom(-Math::PI, Math::PI);
static Real zpos = Math::RangeRandom(-Math::PI, Math::PI);
static Vector4 offset(0, 0, 0, 0);

xpos += xinc * timeElapsed;
zpos += zinc * timeElapsed;

// update vertex program parameters by binding a value to each renderable
StaticGeometry::RegionIterator regs =  mField->getRegionIterator();
while (regs.hasMoreElements())
{
StaticGeometry::Region* reg = regs.getNext();

// a little randomness
xpos += reg->getCentre().x * 0.001;
zpos += reg->getCentre().z * 0.001;
offset.x = Math::Sin(xpos) * 4;
offset.z = Math::Sin(zpos) * 4;

StaticGeometry::Region::LODIterator lods = reg->getLODIterator();
while (lods.hasMoreElements())
{
StaticGeometry::LODBucket::MaterialIterator mats = lods.getNext()->getMaterialIterator();
while (mats.hasMoreElements())
{
StaticGeometry::MaterialBucket::GeometryIterator geoms = mats.getNext()->getGeometryIterator();
while (geoms.hasMoreElements()) geoms.getNext()->setCustomParameter(999, offset);
}
}
}
}

void cleanupContent()
{
ControllerManager::getSingleton().destroyController(mLightController);
MeshManager::getSingleton().remove("ground");
MeshManager::getSingleton().remove("grass");
}

const Real GRASS_WIDTH;
const Real GRASS_HEIGHT;
StaticGeometry* mField;
AnimationState* mLightAnimState;
Controller<Real>* mLightController;
};

#endif

Grass.cpp
Kod: (cpp) [Zaznacz]
#include <SamplePlugin.h>
#include "Grass.h"

using namespace Ogre;
using namespace OgreBites;

#ifndef OGRE_STATIC_LIB

SamplePlugin* sp;
Sample* s;

extern "C" _OgreSampleExport void dllStartPlugin()
{
s = new Sample_Grass;
sp = OGRE_NEW SamplePlugin(s->getInfo()["Title"] + " Sample");
sp->addSample(s);
Root::getSingleton().installPlugin(sp);
}

extern "C" _OgreSampleExport void dllStopPlugin()
{
Root::getSingleton().uninstallPlugin(sp);
OGRE_DELETE sp;
delete s;
}

#endif

Co tu jest nie tak ? Pozdrawiam !

Offline Struś

  • Użytkownik
    • Grupa o charakterze paramilitarnym FIA

# Sierpień 17, 2010, 18:26:18
Nie masz żadnej funkcji main ani WinMain. Ewentualnie masz, a w ustawieniach projektu dałeś budowanie jako DLL'kę.
« Ostatnia zmiana: Sierpień 17, 2010, 18:28:02 wysłana przez Struś »

Offline Pawel1503

  • Użytkownik
    • DevBlog Pawel1503

# Sierpień 17, 2010, 18:31:13
W ustawieniach mam ustawione na *.exe więc chodzi pewnie o brak main\WinMain. To w takim razie co to są za sample ?

Offline aod

  • Użytkownik

  • Zbanowany
# Sierpień 17, 2010, 18:37:33
Jeszcze wracając do tego twojego kiepsko działającego kodu otwierającego temat: pokaż, jakie biblioteki linkujesz ze swoim kodem.

Offline Pawel1503

  • Użytkownik
    • DevBlog Pawel1503

# Sierpień 17, 2010, 18:38:49
Uwaga, nadchodzą:

OGREmain_d.lib
OIS.lib

Wcześniej miałem OGREmain ale to chyba nie zrobiło wrażenia na linkerze.

Offline Struś

  • Użytkownik
    • Grupa o charakterze paramilitarnym FIA

# Sierpień 17, 2010, 19:10:06
Jak kompilujesz Debug to powinieneś dodać OIS_d.dll a nie OSI.dll.

Ogólnie poczytaj wiki Ogre, bo znajdujesz jakieś kody z dupy nie mając pojęcia, jak działa Ogre ani nawet jak zacząć projekt.
http://www.ogre3d.org/tikiwiki/Setting+Up+An+Application

Offline aod

  • Użytkownik

  • Zbanowany
# Sierpień 17, 2010, 19:15:10
Uwaga, nadchodzą:

OGREmain_d.lib
OIS.lib

Wcześniej miałem OGREmain ale to chyba nie zrobiło wrażenia na linkerze.
No i pewnie jak zmienisz OIS.lib na OIS_d.lib, to bad_alloc zniknie. Sprawdź.

Offline Bevier

  • Użytkownik

# Sierpień 17, 2010, 21:05:58
Cytuj
1>------ Build started: Project: OGRE, Configuration: Debug Win32 ------
1>     Creating library C:\Users\Dzieci\Documents\Visual Studio 2010\Projects\OGRE\Debug\OGRE.lib and object C:\Users\Dzieci\Documents\Visual Studio 2010\Projects\OGRE\Debug\OGRE.exp
1>LINK : fatal error LNK1561: entry point must be defined
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Weź ty się naucz w końcu analizować co kompilator/linker chce od ciebie. Jak nie rozumiesz po angielsku to wystarczy to wpisać w google, skoro uważasz iż jesteś na tyle dobry by się zajmować OGRE'm, a nie umiesz tak podstawowej rzeczy jak analiza błędu kompilacji/linkowania no to gdzie ja jestem!

Offline mosowski

  • Użytkownik

# Sierpień 17, 2010, 21:13:06
Cytując Strusia:
Cytuj
Ogólnie poczytaj wiki Ogre, bo znajdujesz jakieś kody z dupy nie mając pojęcia, jak działa Ogre ani nawet jak zacząć projekt.

Kod, który tu podajesz do kod sampla kompilowanego do pliku .dll, który z kolei może zosatać załadowany przez Sample Browser. Innymi słowy - chybiłeś, jeżeli chciałeś sensownie  zacząć przygodę z Ogre.
Jak chcesz, spróbuj tego tutoriala dla C#: http://www.informatyka.wroc.pl/node/742 ;)