컴퓨터 그래픽스/OpenGL

#11 Tinylender 개발일지 : color 기능 추가

san10 2024. 9. 5. 17:26

이번에는 만든 메시의 색을 바꿀 수 있는 기능을 추가했다.

더 정확히 말하자면 쉐이더의 설정을 변경하는 기능이기는 하다.

 

원래는 colorpicker를 만드려고 했는데..

최대한 빨리 마무리하는 걸 목표로 잡아서

버튼으로 때웠다.

 

 

구현

void InspectorCanvas::SetColor(glm::vec3 color)
{
    if (mSelectedLayer->layerType != eLayerType::SHAPE)
        return;

    static_cast<ShapeLayer *>(mSelectedLayer)->SetColor(color);
}

우선 인스펙터에서 

선택된 레이어의 종류를 검사하고

선택된 레이어의 SetColor()를 호출한다.

 

void ShapeLayer::SetColor(glm::vec3 color)
{
    mShader.use();
    glUniform3f(glGetUniformLocation(mShader.ID, "inColor"), color.x, color.y, color.z);
}

레이어의 SetColor()는

쉐이더의 color 유니폼을 찾아 값을 변경해주는 함수이다.

 

그리고...

이 함수들을 실행시켜줄 버튼을 만들면 된다.

mButtons[0] = new Button(glm::vec3(0.72588f, 0.4585f, 0.0f), 0.02395f, 0.04390f, "resource/Color/Color1.png", eImageType::PNG);
auto BtnCallback = [this](double xpos, double ypos)
{
    this->SetColor(glm::vec3(0.9764f, 0.2549f, 0.4862f));
};
mButtons[0]->SetbuttonCallback(std::function<void(double, double)>(BtnCallback));
AddWidget(mButtons[0]);

 

실행시키면..

 

참쉽죠??

 

사실 이게 어려운게 아니고..

문제는 저 버튼이 20개 더 필요하다는 것이다..

 

튜플

물론 ctrl+c ctrl+v 하면 되지만..

코드가 너무 길어지는게 보기 싫었다.

 

그래서 튜플 배열을 만들어서 데이터를 묶고

for문으로 반복해서 버튼을 만들었다.

왜 구조체를 만들지 않고 튜플을 선택했냐면

버튼을 선언할 때 한번만 쓰기 때문에 굳이 구조체를 선언하기 싫었다.

 

std::array<std::tuple<glm::vec3, glm::vec3, const char *>, 21> buttonDatas = {
    std::make_tuple(glm::vec3(0.72588f, 0.4585f, 0.0f), glm::vec3(0.9764f, 0.2549f, 0.4862f), "resource/Color/Color1.png"),
    std::make_tuple(glm::vec3(0.76447f, 0.4585f, 0.0f), glm::vec3(0.9568f, 0.2313f, 0.2549f), "resource/Color/Color2.png"),
    std::make_tuple(glm::vec3(0.803068f, 0.4585f, 0.0f), glm::vec3(228.0f / 255.0f, 69.0f / 255.0f, 242.0f / 255.0f), "resource/Color/Color3.png"),
    std::make_tuple(glm::vec3(0.8416f, 0.4585f, 0.0f), glm::vec3(134.0f / 255.0f, 67.0f / 255.0f, 242.0f / 255.0f), "resource/Color/Color4.png"),
    std::make_tuple(glm::vec3(0.88023f, 0.4585f, 0.0f), glm::vec3(59.0f / 255.0f, 52.0f / 255.0f, 237.0f / 255.0f), "resource/Color/Color5.png"),
    std::make_tuple(glm::vec3(0.91882f, 0.4585f, 0.0f), glm::vec3(51.0f / 255.0f, 138.0f / 255.0f, 251.0f / 255.0f), "resource/Color/Color6.png"),
    std::make_tuple(glm::vec3(0.95741f, 0.4585f, 0.0f), glm::vec3(86.0f / 255.0f, 198.0f / 255.0f, 235.0f / 255.0f), "resource/Color/Color7.png"),

    std::make_tuple(glm::vec3(0.7258f, 0.3853f, 0.0f), glm::vec3(139.0f / 255.0f, 214.0f / 255.0f, 237.0f / 255.0f), "resource/Color/Color8.png"),
    std::make_tuple(glm::vec3(0.7644f, 0.3853f, 0.0f), glm::vec3(96.0f / 255.0f, 236.0f / 255.0f, 178.0f / 255.0f), "resource/Color/Color9.png"),
    std::make_tuple(glm::vec3(0.80306f, 0.3853f, 0.0f), glm::vec3(166.0f / 255.0f, 243.0f / 255.0f, 95.0f / 255.0f), "resource/Color/Color10.png"),
    std::make_tuple(glm::vec3(0.8416f, 0.3853f, 0.0f), glm::vec3(204.0f / 255.0f, 243.0f / 255.0f, 86.0f / 255.0f), "resource/Color/Color11.png"),
    std::make_tuple(glm::vec3(0.8802f, 0.3853f, 0.0f), glm::vec3(244.0f / 255.0f, 215.0f / 255.0f, 69.0f / 255.0f), "resource/Color/Color12.png"),
    std::make_tuple(glm::vec3(0.9188f, 0.3853f, 0.0f), glm::vec3(240.0f / 255.0f, 127.0f / 255.0f, 62.0f / 255.0f), "resource/Color/Color13.png"),
    std::make_tuple(glm::vec3(0.9574f, 0.3853f, 0.0f), glm::vec3(250.0f / 255.0f, 122.0f / 255.0f, 156.0f / 255.0f), "resource/Color/Color14.png"),

    std::make_tuple(glm::vec3(0.7258f, 0.3119f, 0.0f), glm::vec3(0.0f / 255.0f, 0.0f / 255.0f, 0.0f / 255.0f), "resource/Color/Color15.png"),
    std::make_tuple(glm::vec3(0.7644f, 0.3119f, 0.0f), glm::vec3(32.0f / 255.0f, 32.0f / 255.0f, 32.0f / 255.0f), "resource/Color/Color16.png"),
    std::make_tuple(glm::vec3(0.80306f, 0.3119f, 0.0f), glm::vec3(77.0f / 255.0f, 77.0f / 255.0f, 77.0f / 255.0f), "resource/Color/Color17.png"),
    std::make_tuple(glm::vec3(0.8416f, 0.3119f, 0.0f), glm::vec3(126.0f / 255.0f, 126.0f / 255.0f, 126.0f / 255.0f), "resource/Color/Color18.png"),
    std::make_tuple(glm::vec3(0.8802f, 0.3119f, 0.0f), glm::vec3(182.0f / 255.0f, 182.0f / 255.0f, 182.0f / 255.0f), "resource/Color/Color19.png"),
    std::make_tuple(glm::vec3(0.9188f, 0.3119f, 0.0f), glm::vec3(238.0f / 255.0f, 238.0f / 255.0f, 238.0f / 255.0f), "resource/Color/Color20.png"),
    std::make_tuple(glm::vec3(0.9574f, 0.3119f, 0.0f), glm::vec3(255.0f / 255.0f, 255.0f / 255.0f, 255.0f / 255.0f), "resource/Color/Color21.png"),
};

이렇게 튜플을 원소로 가지는 배열을 선언해서 필요한 데이터를 채워줬다.

 

for (int i = 0; i < 21; i++)
{
    mButtons[i] = new Button(std::get<0>(buttonDatas[i]), 0.02395f, 0.04390f, std::get<2>(buttonDatas[i]), eImageType::PNG);
    glm::vec3 color = std::get<1>(buttonDatas[i]);
    auto BtnCallback = [this,color](double xpos, double ypos)
    {
        this->SetColor(color);
    };
    mButtons[i]->SetbuttonCallback(std::function<void(double, double)>(BtnCallback));
    AddWidget(mButtons[i]);
}

 

실행 결과