Untitled

 avatar
unknown
plain_text
5 months ago
3.5 kB
5
Indexable
#include "SceneManager.h"
#include "lineSegs.h"
#include "cardMaker.h"
#include "texturePool.h"
#include "textureStage.h"
#include "material.h"
#include "transparencyAttrib.h"
#include "directionalLight.h"
#include "clockObject.h"
#include "pandaFramework.h"
#include "oceangenerator.h"
#include "ambientLight.h"
#include <QDebug>
#include <cmath>

SceneManager::SceneManager(WindowFramework* window) : window(window) {}

void SceneManager::initializeScene()
{
    createGrid();
    createPlatform();
    addDirectionalLight();
    setupAnimationTask();
}

void SceneManager::createGrid()
{
    LineSegs lines;
    lines.set_color(1, 1, 1, 1);
    float size = 10.0f;
    float spacing = 1.0f;
    float height = -1.5f;

    for (float x = -size; x <= size; x += spacing)
    {
        lines.move_to(x, -size, height);
        lines.draw_to(x, size, height);
    }
    for (float y = -size; y <= size; y += spacing)
    {
        lines.move_to(-size, y, height);
        lines.draw_to(size, y, height);
    }

    NodePath grid = NodePath(lines.create());
    grid.reparent_to(window->get_render());

    OceanGenerator oceanGen(window);
    NodePath ocean = oceanGen.generate(20, 1.0f, "models/ocean_texture.jpg", "models/ocean_normal_map.jpg");PIPP PA
    ocean.set_pos(-10.0f, -10.0f, 0.0f);
    ocean.reparent_to(window->get_render());
}

void SceneManager::addDirectionalLight()
{
    PT(DirectionalLight) dlight = new DirectionalLight("directional_light");
    NodePath dlight_path = window->get_render().attach_new_node(dlight);
    dlight_path.set_hpr(45, 45, 0);
    window->get_render().set_light(dlight_path);
}

void SceneManager::createPlatform()
{
    platform = window->load_model(window->get_panda_framework()->get_models(), "models/oil_rig.bam");
    platform.set_scale(0.05);
    platform.set_pos(0, 0, 1);
    platform.set_name("oil_rig");
    platform.reparent_to(window->get_render());
}

void SceneManager::setupAnimationTask()
{
    AsyncTaskManager::get_global_ptr()->add(new GenericAsyncTask("animate_platform", animatePlataformTastk, &platform));
}

AsyncTask::DoneStatus SceneManager::animatePlataformTastk(GenericAsyncTask* task, void* data)
{
    NodePath* platform = static_cast<NodePath*>(data);
    float time = ClockObject::get_global_clock()->get_frame_time();

    float new_z = 1.0f + 0.2f * std::sin(time * 0.5f);
    platform->set_z(new_z);

    return AsyncTask::DS_cont;
}

AsyncTask::DoneStatus SceneManager::animateWaterTask(GenericAsyncTask* task, void* data)
{
    NodePath* water = static_cast<NodePath*>(data);
    static float offset = 0;
    offset += ClockObject::get_global_clock()->get_dt() * 0.03f;
    water->set_tex_offset(TextureStage::get_default(), offset, offset);
    return AsyncTask::DS_cont;
}



#ifndef SCENEMANAGER_H
#define SCENEMANAGER_H

#include "pandaFramework.h"
#include "nodePath.h"
#include "genericAsyncTask.h"

class SceneManager {
public:
    SceneManager(WindowFramework* window);
    void initializeScene();

private:
    WindowFramework* window;
    NodePath platform;

    void createGrid();
    void createPlatform();
    void addDirectionalLight();
    void setupAnimationTask();

    static AsyncTask::DoneStatus animatePlataformTastk(GenericAsyncTask* task, void* data);
    static AsyncTask::DoneStatus animateWaterTask(GenericAsyncTask* task, void* data);
};

#endif // SCENEMANAGER_H
Editor is loading...
Leave a Comment