adding texture to plants
This commit is contained in:
parent
00471a1b93
commit
d28c6eecb9
@ -66,6 +66,8 @@
|
|||||||
<None Include="shaders\shader_5_sun.vert" />
|
<None Include="shaders\shader_5_sun.vert" />
|
||||||
<None Include="shaders\shader_biomes.frag" />
|
<None Include="shaders\shader_biomes.frag" />
|
||||||
<None Include="shaders\shader_biomes.vert" />
|
<None Include="shaders\shader_biomes.vert" />
|
||||||
|
<None Include="shaders\shader_pbr.frag" />
|
||||||
|
<None Include="shaders\shader_pbr.vert" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<PropertyGroup Label="Globals">
|
<PropertyGroup Label="Globals">
|
||||||
<ProjectGuid>{3952C396-B1C6-44CD-96DD-C1AC15D32978}</ProjectGuid>
|
<ProjectGuid>{3952C396-B1C6-44CD-96DD-C1AC15D32978}</ProjectGuid>
|
||||||
|
@ -51,6 +51,27 @@
|
|||||||
<ClCompile Include="src\SOIL\image_helper.c">
|
<ClCompile Include="src\SOIL\image_helper.c">
|
||||||
<Filter>Source Files\SOIL</Filter>
|
<Filter>Source Files\SOIL</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="src\imgui.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="src\imgui_demo.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="src\imgui_draw.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="src\imgui_impl_glfw.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="src\imgui_impl_opengl3.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="src\imgui_tables.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="src\imgui_widgets.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="src\objload.h">
|
<ClInclude Include="src\objload.h">
|
||||||
@ -89,6 +110,33 @@
|
|||||||
<ClInclude Include="src\ex_6_1.hpp">
|
<ClInclude Include="src\ex_6_1.hpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="src\imconfig.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="src\imgui.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="src\imgui_impl_glfw.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="src\imgui_impl_opengl3.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="src\imgui_impl_opengl3_loader.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="src\imgui_internal.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="src\imstb_rectpack.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="src\imstb_textedit.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="src\imstb_truetype.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="shaders\shader_5_sun.frag">
|
<None Include="shaders\shader_5_sun.frag">
|
||||||
@ -115,5 +163,12 @@
|
|||||||
<None Include="shaders\shader_biomes.vert">
|
<None Include="shaders\shader_biomes.vert">
|
||||||
<Filter>Shader Files</Filter>
|
<Filter>Shader Files</Filter>
|
||||||
</None>
|
</None>
|
||||||
|
<None Include="packages.config" />
|
||||||
|
<None Include="shaders\shader_pbr.frag">
|
||||||
|
<Filter>Shader Files</Filter>
|
||||||
|
</None>
|
||||||
|
<None Include="shaders\shader_pbr.vert">
|
||||||
|
<Filter>Shader Files</Filter>
|
||||||
|
</None>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
BIN
PlanetCreator/cw 6/models/image_plant_1_1.jpg
Normal file
BIN
PlanetCreator/cw 6/models/image_plant_1_1.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 256 KiB |
12
PlanetCreator/cw 6/models/plant_1_1.mtl
Normal file
12
PlanetCreator/cw 6/models/plant_1_1.mtl
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
# Blender 4.0.2 MTL File: 'None'
|
||||||
|
# www.blender.org
|
||||||
|
|
||||||
|
newmtl Material.001
|
||||||
|
Ns 250.000000
|
||||||
|
Ka 1.000000 1.000000 1.000000
|
||||||
|
Ks 0.500000 0.500000 0.500000
|
||||||
|
Ke 0.000000 0.000000 0.000000
|
||||||
|
Ni 1.450000
|
||||||
|
d 1.000000
|
||||||
|
illum 2
|
||||||
|
map_Kd ./models/image_plant_1_1.jpg
|
97175
PlanetCreator/cw 6/models/plant_1_1.obj
Normal file
97175
PlanetCreator/cw 6/models/plant_1_1.obj
Normal file
File diff suppressed because it is too large
Load Diff
BIN
PlanetCreator/cw 6/models/red.jpg
Normal file
BIN
PlanetCreator/cw 6/models/red.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 123 KiB |
12
PlanetCreator/cw 6/models/test5.mtl
Normal file
12
PlanetCreator/cw 6/models/test5.mtl
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
# Blender 4.0.2 MTL File: 'None'
|
||||||
|
# www.blender.org
|
||||||
|
|
||||||
|
newmtl Material.001
|
||||||
|
Ns 250.000000
|
||||||
|
Ka 1.000000 1.000000 1.000000
|
||||||
|
Ks 0.500000 0.500000 0.500000
|
||||||
|
Ke 0.000000 0.000000 0.000000
|
||||||
|
Ni 1.450000
|
||||||
|
d 1.000000
|
||||||
|
illum 2
|
||||||
|
map_Kd ./models/red.jpg
|
74856
PlanetCreator/cw 6/models/test5.obj
Normal file
74856
PlanetCreator/cw 6/models/test5.obj
Normal file
File diff suppressed because it is too large
Load Diff
51
PlanetCreator/cw 6/shaders/shader_pbr.frag
Normal file
51
PlanetCreator/cw 6/shaders/shader_pbr.frag
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
#version 430 core
|
||||||
|
|
||||||
|
float AMBIENT = 0.1;
|
||||||
|
|
||||||
|
uniform vec3 color;
|
||||||
|
uniform vec3 lightPos;
|
||||||
|
uniform sampler2D colorTexture;
|
||||||
|
|
||||||
|
in vec3 fragNormal;
|
||||||
|
in vec3 fragPosition;
|
||||||
|
in vec2 texCoords;
|
||||||
|
|
||||||
|
out vec4 outColor;
|
||||||
|
|
||||||
|
uniform float shininess;
|
||||||
|
uniform vec3 ambientColor;
|
||||||
|
uniform vec3 specularColor;
|
||||||
|
uniform vec3 emissiveColor;
|
||||||
|
uniform float opticalDensity;
|
||||||
|
uniform float dissolve;
|
||||||
|
uniform int illuminationModel;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
vec3 lightDir = normalize(lightPos - fragPosition);
|
||||||
|
vec3 normal = normalize(fragNormal);
|
||||||
|
float diffuse = max(0.0, dot(normal, lightDir));
|
||||||
|
|
||||||
|
|
||||||
|
vec3 lambertian = texture(colorTexture, texCoords).rgb * diffuse;
|
||||||
|
|
||||||
|
|
||||||
|
vec3 viewDir = normalize(-fragPosition);
|
||||||
|
vec3 halfwayDir = normalize(lightDir + viewDir);
|
||||||
|
float specular = pow(max(0.0, dot(normal, halfwayDir)), shininess);
|
||||||
|
vec3 blinnPhong = specularColor * specular;
|
||||||
|
|
||||||
|
|
||||||
|
vec3 emissive = emissiveColor;
|
||||||
|
|
||||||
|
|
||||||
|
vec3 ambient = ambientColor * AMBIENT;
|
||||||
|
|
||||||
|
|
||||||
|
vec3 finalColor = lambertian + blinnPhong + emissive + ambient;
|
||||||
|
|
||||||
|
|
||||||
|
finalColor *= (1.0 - dissolve);
|
||||||
|
|
||||||
|
outColor = vec4(finalColor, 1.0);
|
||||||
|
}
|
21
PlanetCreator/cw 6/shaders/shader_pbr.vert
Normal file
21
PlanetCreator/cw 6/shaders/shader_pbr.vert
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
#version 430 core
|
||||||
|
|
||||||
|
layout(location = 0) in vec3 inPosition;
|
||||||
|
layout(location = 1) in vec3 inNormal;
|
||||||
|
layout(location = 2) in vec2 inTexCoord;
|
||||||
|
|
||||||
|
|
||||||
|
out vec2 texCoords;
|
||||||
|
out vec3 fragNormal;
|
||||||
|
out vec3 fragPosition;
|
||||||
|
|
||||||
|
uniform mat4 transformation;
|
||||||
|
uniform mat4 modelMatrix;
|
||||||
|
uniform sampler2D colorTexture;
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
gl_Position = transformation * vec4(inPosition, 1.0);
|
||||||
|
fragPosition = (modelMatrix* vec4(inPosition,1)).xyz;
|
||||||
|
texCoords = inTexCoord;
|
||||||
|
fragNormal = (modelMatrix* vec4(inNormal,0)).xyz;
|
||||||
|
}
|
@ -22,6 +22,70 @@
|
|||||||
#include "imgui_impl_glfw.h"
|
#include "imgui_impl_glfw.h"
|
||||||
#include "imgui_impl_opengl3.h"
|
#include "imgui_impl_opengl3.h"
|
||||||
|
|
||||||
|
|
||||||
|
struct Material {
|
||||||
|
float Ns; // shininess
|
||||||
|
glm::vec3 Ka; // ambient color
|
||||||
|
glm::vec3 Ks; // specular color
|
||||||
|
glm::vec3 Ke; // emissive color
|
||||||
|
float Ni; // optical density
|
||||||
|
float d; // dissolve
|
||||||
|
int illum; // illumination model
|
||||||
|
GLuint textureID; // texture ID
|
||||||
|
|
||||||
|
Material() : Ns(0.0f), Ka(0.0f), Ks(0.0f), Ke(0.0f), Ni(0.0f), d(1.0f), illum(0), textureID(0) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
void loadMTLAndGetTextureID(const std::string& filePath, Material& material) {
|
||||||
|
std::ifstream file(filePath);
|
||||||
|
if (!file.is_open()) {
|
||||||
|
std::cerr << "Failed to open MTL file: " << filePath << std::endl;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string line;
|
||||||
|
while (std::getline(file, line)) {
|
||||||
|
std::istringstream iss(line);
|
||||||
|
std::string token;
|
||||||
|
iss >> token;
|
||||||
|
|
||||||
|
if (token == "newmtl") {
|
||||||
|
iss >> token;
|
||||||
|
}
|
||||||
|
else if (token == "map_Kd") {
|
||||||
|
iss >> token;
|
||||||
|
material.textureID = Core::LoadTexture(token.c_str());
|
||||||
|
file.close();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if (token == "Ns") {
|
||||||
|
iss >> material.Ns;
|
||||||
|
}
|
||||||
|
else if (token == "Ka") {
|
||||||
|
iss >> material.Ka.r >> material.Ka.g >> material.Ka.b;
|
||||||
|
}
|
||||||
|
else if (token == "Ks") {
|
||||||
|
iss >> material.Ks.r >> material.Ks.g >> material.Ks.b;
|
||||||
|
}
|
||||||
|
else if (token == "Ke") {
|
||||||
|
iss >> material.Ke.r >> material.Ke.g >> material.Ke.b;
|
||||||
|
}
|
||||||
|
else if (token == "Ni") {
|
||||||
|
iss >> material.Ni;
|
||||||
|
}
|
||||||
|
else if (token == "d") {
|
||||||
|
iss >> material.d;
|
||||||
|
}
|
||||||
|
else if (token == "illum") {
|
||||||
|
iss >> material.illum;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
file.close();
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Глобальные переменные для хранения параметров новой планеты
|
// Глобальные переменные для хранения параметров новой планеты
|
||||||
struct PlanetParams {
|
struct PlanetParams {
|
||||||
glm::vec3 position = glm::vec3(0.0f);
|
glm::vec3 position = glm::vec3(0.0f);
|
||||||
@ -112,7 +176,7 @@ namespace texture {
|
|||||||
GLuint program;
|
GLuint program;
|
||||||
GLuint programSun;
|
GLuint programSun;
|
||||||
GLuint programTex;
|
GLuint programTex;
|
||||||
|
GLuint program_pbr;
|
||||||
GLuint plantProgram;
|
GLuint plantProgram;
|
||||||
Core::Shader_Loader shaderLoader;
|
Core::Shader_Loader shaderLoader;
|
||||||
|
|
||||||
@ -173,7 +237,7 @@ void renderImGui() {
|
|||||||
ImGui::Begin("Dodawanie nowej planety");
|
ImGui::Begin("Dodawanie nowej planety");
|
||||||
|
|
||||||
static PlanetParams newPlanetParams;
|
static PlanetParams newPlanetParams;
|
||||||
ImGui::InputFloat3("Pozicja", &newPlanetParams.position[0]);
|
ImGui::InputFloat3("Pozycja", &newPlanetParams.position[0]);
|
||||||
ImGui::SliderFloat("Rozmiar", &newPlanetParams.size, 0.1f, 10.0f);
|
ImGui::SliderFloat("Rozmiar", &newPlanetParams.size, 0.1f, 10.0f);
|
||||||
ImGui::SliderFloat("Wilgotnosc", &newPlanetParams.humidity, 0.0f, 10.0f); // Слайдер для влажности
|
ImGui::SliderFloat("Wilgotnosc", &newPlanetParams.humidity, 0.0f, 10.0f); // Слайдер для влажности
|
||||||
ImGui::SliderFloat("Temperatura", &newPlanetParams.temperature, 0.0f, 10.0f); // Слайдер для осадков
|
ImGui::SliderFloat("Temperatura", &newPlanetParams.temperature, 0.0f, 10.0f); // Слайдер для осадков
|
||||||
@ -258,6 +322,29 @@ void drawObjectTexture(Core::RenderContext& context, glm::mat4 modelMatrix, GLui
|
|||||||
glUseProgram(0);
|
glUseProgram(0);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void drawObjectTexture_plant(Core::RenderContext& context, glm::mat4 modelMatrix, Material& material, GLuint program) {
|
||||||
|
glUseProgram(program);
|
||||||
|
Core::SetActiveTexture(material.textureID, "colorTexture", program, 0);
|
||||||
|
glm::mat4 viewProjectionMatrix = createPerspectiveMatrix() * createCameraMatrix();
|
||||||
|
glm::mat4 transformation = viewProjectionMatrix * modelMatrix;
|
||||||
|
glUniformMatrix4fv(glGetUniformLocation(program, "transformation"), 1, GL_FALSE, (float*)&transformation);
|
||||||
|
glUniformMatrix4fv(glGetUniformLocation(program, "modelMatrix"), 1, GL_FALSE, (float*)&modelMatrix);
|
||||||
|
glUniform3f(glGetUniformLocation(program, "lightPos"), 0, 0, 0);
|
||||||
|
|
||||||
|
//Material
|
||||||
|
glUniform1f(glGetUniformLocation(program, "shininess"), material.Ns);
|
||||||
|
glUniform3f(glGetUniformLocation(program, "ambientColor"), material.Ka.r, material.Ka.g, material.Ka.b);
|
||||||
|
glUniform3f(glGetUniformLocation(program, "specularColor"), material.Ks.r, material.Ks.g, material.Ks.b);
|
||||||
|
glUniform3f(glGetUniformLocation(program, "emissiveColor"), material.Ke.r, material.Ke.g, material.Ke.b);
|
||||||
|
glUniform1f(glGetUniformLocation(program, "opticalDensity"), material.Ni);
|
||||||
|
//glUniform1f(glGetUniformLocation(program, "dissolve"), material.d);
|
||||||
|
glUniform1i(glGetUniformLocation(program, "illuminationModel"), material.illum);
|
||||||
|
|
||||||
|
Core::DrawContext(context);
|
||||||
|
glUseProgram(0);
|
||||||
|
}
|
||||||
|
|
||||||
void placeObjectOnPlanet(Core::RenderContext& objectContext, glm::mat4 objectMatrix,glm::vec3 placePoint, Core::RenderContext& planetContext, glm::mat4 planetMatrix) {
|
void placeObjectOnPlanet(Core::RenderContext& objectContext, glm::mat4 objectMatrix,glm::vec3 placePoint, Core::RenderContext& planetContext, glm::mat4 planetMatrix) {
|
||||||
//placePoint is described by normalized vector that points to a point on a sphere from inside of itself
|
//placePoint is described by normalized vector that points to a point on a sphere from inside of itself
|
||||||
placePoint = glm::normalize(placePoint);
|
placePoint = glm::normalize(placePoint);
|
||||||
@ -293,6 +380,7 @@ void placeObjectOnPlanet(Core::RenderContext& objectContext, glm::mat4 objectMat
|
|||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Material plant3Material;
|
||||||
void renderScene(GLFWwindow* window)
|
void renderScene(GLFWwindow* window)
|
||||||
{
|
{
|
||||||
glClearColor(0.0f, 0.3f, 0.3f, 1.0f);
|
glClearColor(0.0f, 0.3f, 0.3f, 1.0f);
|
||||||
@ -328,8 +416,12 @@ void renderScene(GLFWwindow* window)
|
|||||||
float scaleFactor = 0.1f;
|
float scaleFactor = 0.1f;
|
||||||
glm::mat4 plantModelMatrix = glm::translate(plantPosition) * glm::scale(glm::vec3(scaleFactor));
|
glm::mat4 plantModelMatrix = glm::translate(plantPosition) * glm::scale(glm::vec3(scaleFactor));
|
||||||
|
|
||||||
drawObjectColor(plant2Context, plantModelMatrix, glm::vec3(1,1,1), program);
|
//drawObjectColor(plant2Context, plantModelMatrix, glm::vec3(1,1,1), program);
|
||||||
drawObjectColor(plant3Context,glm::translate(glm::vec3(1.0f, 0.5f, 3.0f)) *glm::scale(glm::vec3(0.03f)) *glm::rotate(glm::mat4(1.0f), glm::radians(-90.0f), glm::vec3(1.0f, 0.0f, 0.0f)),glm::vec3(1, 1, 1), program);
|
// drawObjectColor(plant3Context,glm::translate(glm::vec3(1.0f, 0.5f, 3.0f)) *glm::scale(glm::vec3(0.03f)) *glm::rotate(glm::mat4(1.0f), glm::radians(-90.0f), glm::vec3(1.0f, 0.0f, 0.0f)),glm::vec3(1, 1, 1), program);
|
||||||
|
|
||||||
|
loadMTLAndGetTextureID("./models/plant_1_1.mtl", plant3Material);
|
||||||
|
drawObjectTexture_plant(plant2Context, plantModelMatrix, plant3Material, program_pbr);
|
||||||
|
//drawObjectColor(plant2Context, plantModelMatrix, glm::vec3(1, 1, 1), program);
|
||||||
|
|
||||||
//glfwSwapBuffers(window);
|
//glfwSwapBuffers(window);
|
||||||
}
|
}
|
||||||
@ -358,6 +450,9 @@ void loadModelToContext(std::string path, Core::RenderContext& context)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void init(GLFWwindow* window)
|
void init(GLFWwindow* window)
|
||||||
{
|
{
|
||||||
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
|
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
|
||||||
@ -367,12 +462,12 @@ void init(GLFWwindow* window)
|
|||||||
programTex = shaderLoader.CreateProgram("shaders/shader_5_1_tex.vert", "shaders/shader_5_1_tex.frag");
|
programTex = shaderLoader.CreateProgram("shaders/shader_5_1_tex.vert", "shaders/shader_5_1_tex.frag");
|
||||||
programSun = shaderLoader.CreateProgram("shaders/shader_5_sun.vert", "shaders/shader_5_sun.frag");
|
programSun = shaderLoader.CreateProgram("shaders/shader_5_sun.vert", "shaders/shader_5_sun.frag");
|
||||||
programBiomes = shaderLoader.CreateProgram("shaders/shader_biomes.vert", "shaders/shader_biomes.frag");
|
programBiomes = shaderLoader.CreateProgram("shaders/shader_biomes.vert", "shaders/shader_biomes.frag");
|
||||||
|
program_pbr = shaderLoader.CreateProgram("shaders/shader_pbr.vert", "shaders/shader_pbr.frag");
|
||||||
loadModelToContext2("./models/plants/polygon.obj", plantContext);
|
loadModelToContext2("./models/plants/polygon.obj", plantContext);
|
||||||
|
|
||||||
loadModelToContext("./models/sphere.obj", sphereContext);
|
loadModelToContext("./models/sphere.obj", sphereContext);
|
||||||
loadModelToContext2("models/plant_2.ply", plant2Context);
|
loadModelToContext("./models/plant_1_1.obj", plant2Context);
|
||||||
loadModelToContext2("models/plant_4.ply", plant3Context);
|
loadModelToContext2("./models/plant_4.ply", plant3Context);
|
||||||
|
|
||||||
texture::earth=Core::LoadTexture("textures/earth2.png");
|
texture::earth=Core::LoadTexture("textures/earth2.png");
|
||||||
texture::clouds = Core::LoadTexture("textures/clouds.jpg");
|
texture::clouds = Core::LoadTexture("textures/clouds.jpg");
|
||||||
|
Loading…
Reference in New Issue
Block a user