Optmi renderer model & renderer shape parameter #38
@ -29,11 +29,11 @@ class ClassicRenderer extends BasicRenderer<IClassicRendererParameter> {
|
||||
|
||||
public override rendererParameterOption = {};
|
||||
public override pointsParameterOption = {
|
||||
color: { type: "color", name: "" },
|
||||
size: { type: "number", name: "Common.Attr.Key.Size" }
|
||||
color: { type: "color", name: "", defaultValue: [0, 0, 0] },
|
||||
size: { type: "number", name: "Common.Attr.Key.Size", defaultValue: 60, numberStep: 10, numberMin: 0 }
|
||||
};
|
||||
public override cubeParameterOption = {
|
||||
color: { type: "color", name: "" },
|
||||
color: { type: "color", name: "", defaultValue: [0, 0, 0] },
|
||||
};
|
||||
|
||||
private basicShader: BasicsShader = undefined as any;
|
||||
|
@ -10,7 +10,7 @@ import { ColorInput } from "@Input/ColorInput/ColorInput";
|
||||
import { ComboInput, IDisplayItem } from "@Input/ComboInput/ComboInput";
|
||||
import {
|
||||
IParameter, IParameterOption, IParameterOptionItem,
|
||||
IParameterValue, IParamValue, isObjectType, isVectorType
|
||||
IParameterValue, IParamValue, isObjectType
|
||||
} from "@Model/Parameter";
|
||||
import "./Parameter.scss";
|
||||
|
||||
@ -20,6 +20,7 @@ interface IParameterProps<P extends IParameter = {}> {
|
||||
key: ObjectID;
|
||||
change: <K extends keyof P>(key: K, val: IParamValue<P[K]>) => any;
|
||||
i18n?: (key: string, language: Language) => string;
|
||||
renderKey?: Array<keyof P>;
|
||||
title?: AllI18nKeys;
|
||||
titleOption?: Record<string, string>;
|
||||
isFirst?: boolean;
|
||||
@ -249,12 +250,18 @@ class Parameter<P extends IParameter> extends Component<IParameterProps<P> & IMi
|
||||
}
|
||||
|
||||
public render(): ReactNode {
|
||||
const allOptionKeys: Array<keyof P> = Object.getOwnPropertyNames(this.props.option);
|
||||
|
||||
let allOptionKeys: Array<keyof P>;
|
||||
if (this.props.renderKey) {
|
||||
allOptionKeys = this.props.renderKey;
|
||||
} else {
|
||||
allOptionKeys = Object.getOwnPropertyNames(this.props.option);
|
||||
}
|
||||
|
||||
return <>
|
||||
|
||||
{
|
||||
allOptionKeys.length <= 0 && this.props.title ?
|
||||
allOptionKeys.length > 0 && this.props.title ?
|
||||
<Message
|
||||
isTitle
|
||||
first={this.props.isFirst}
|
||||
|
@ -76,6 +76,7 @@ const EN_US = {
|
||||
"Common.Attr.Title.Individual.Generation": "Individual generation",
|
||||
"Common.Attr.Title.Behaviors": "Behaviors list",
|
||||
"Common.Attr.Title.Individual.kill": "Individual kill",
|
||||
"Common.Attr.Title.Render.Parameter": "Render parameters",
|
||||
"Common.Attr.Key.Display.Name": "Display name",
|
||||
"Common.Attr.Key.Position.X": "Position X",
|
||||
"Common.Attr.Key.Position.Y": "Position Y",
|
||||
|
@ -76,6 +76,7 @@ const ZH_CN = {
|
||||
"Common.Attr.Title.Individual.Generation": "生成个体",
|
||||
"Common.Attr.Title.Behaviors": "行为列表",
|
||||
"Common.Attr.Title.Individual.kill": "消除个体",
|
||||
"Common.Attr.Title.Render.Parameter": "渲染参数",
|
||||
"Common.Attr.Key.Display.Name": "显示名称",
|
||||
"Common.Attr.Key.Position.X": "X 坐标",
|
||||
"Common.Attr.Key.Position.Y": "Y 坐标",
|
||||
|
@ -1,5 +1,5 @@
|
||||
import { LabelObject } from "@Model/Label"
|
||||
import type { Model } from "@Model/Model";
|
||||
import type { IAnyObject, Model } from "@Model/Model";
|
||||
import type { ObjectID } from "@Model/Model";
|
||||
|
||||
/**
|
||||
@ -37,6 +37,11 @@ class CtrlObject extends LabelObject {
|
||||
*/
|
||||
protected model: Model;
|
||||
|
||||
/**
|
||||
* 渲染数据
|
||||
*/
|
||||
public renderParameter: IAnyObject = {};
|
||||
|
||||
/**
|
||||
* 构造器
|
||||
*/
|
||||
|
@ -3,6 +3,8 @@ import { CtrlObject } from "@Model/CtrlObject";
|
||||
import type { Behavior } from "@Model/Behavior";
|
||||
import { Label } from "@Model/Label";
|
||||
import { Range } from "@Model/Range";
|
||||
import { Model, ObjectID } from "@Model/Model";
|
||||
import { getDefaultValue } from "@Model/Parameter";
|
||||
|
||||
enum GenMod {
|
||||
Point = "p",
|
||||
@ -380,11 +382,15 @@ class Group extends CtrlObject {
|
||||
});
|
||||
return dataBuffer;
|
||||
}
|
||||
|
||||
public constructor(model: Model, id: ObjectID) {
|
||||
|
||||
/**
|
||||
* 绘制大小
|
||||
*/
|
||||
public size: number = 60;
|
||||
super(model, id);
|
||||
|
||||
if (model.renderer) {
|
||||
this.renderParameter = getDefaultValue(model.renderer.pointsParameterOption);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export default Group;
|
||||
|
@ -362,16 +362,12 @@ class Model extends Emitter<ModelEvent> {
|
||||
// 渲染
|
||||
for (let i = 0; i < this.objectPool.length; i++) {
|
||||
let object = this.objectPool[i];
|
||||
object.renderParameter.color = object.color;
|
||||
if (object.display && object instanceof Group) {
|
||||
this.renderer.points(object.id, object.exportPositionData(), {
|
||||
color: object.color,
|
||||
size: object.size
|
||||
} as any);
|
||||
this.renderer.points(object.id, object.exportPositionData(), object.renderParameter);
|
||||
}
|
||||
if (object.display && object instanceof Range) {
|
||||
this.renderer.cube(object.id, object.position, object.radius, {
|
||||
color: object.color
|
||||
} as any);
|
||||
this.renderer.cube(object.id, object.position, object.radius, object.renderParameter);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,4 +1,6 @@
|
||||
import { CtrlObject } from "@Model/CtrlObject";
|
||||
import { Model, ObjectID } from "@Model/Model";
|
||||
import { getDefaultValue } from "@Model/Parameter";
|
||||
|
||||
/**
|
||||
* 范围
|
||||
@ -15,6 +17,15 @@ class Range extends CtrlObject {
|
||||
*/
|
||||
public radius: number[] = [1, 1, 1];
|
||||
|
||||
public constructor(model: Model, id: ObjectID) {
|
||||
|
||||
super(model, id);
|
||||
|
||||
if (model.renderer) {
|
||||
this.renderParameter = getDefaultValue(model.renderer.cubeParameterOption);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
export default Range;
|
||||
|
@ -13,6 +13,7 @@ import { AllI18nKeys } from "@Component/Localization/Localization";
|
||||
import { ObjectPicker } from "@Input/ObjectPicker/ObjectPicker";
|
||||
import { ConfirmPopup } from "@Component/ConfirmPopup/ConfirmPopup";
|
||||
import { BehaviorPicker } from "@Input/BehaviorPicker/BehaviorPicker";
|
||||
import { Parameter } from "@Input/Parameter/Parameter";
|
||||
import "./GroupDetails.scss";
|
||||
|
||||
interface IGroupDetailsProps {}
|
||||
@ -54,14 +55,6 @@ class GroupDetails extends Component<IGroupDetailsProps & IMixinStatusProps & IM
|
||||
}}
|
||||
/>
|
||||
|
||||
<AttrInput
|
||||
id={group.id} isNumber={true} step={10} keyI18n="Common.Attr.Key.Size"
|
||||
value={group.size} min={0}
|
||||
valueChange={(val) => {
|
||||
this.props.status?.changeGroupAttrib(group.id, "size", (val as any) / 1);
|
||||
}}
|
||||
/>
|
||||
|
||||
<LabelPicker
|
||||
keyI18n="Common.Attr.Key.Label"
|
||||
labels={group.allLabels()}
|
||||
@ -114,6 +107,23 @@ class GroupDetails extends Component<IGroupDetailsProps & IMixinStatusProps & IM
|
||||
}
|
||||
}}
|
||||
/>
|
||||
|
||||
<Parameter
|
||||
key={group.id}
|
||||
option={this.props.status?.renderer.pointsParameterOption ?? {}}
|
||||
title={"Common.Attr.Title.Render.Parameter"}
|
||||
value={group.renderParameter}
|
||||
renderKey={
|
||||
Object.getOwnPropertyNames(this.props.status?.renderer.pointsParameterOption ?? {})
|
||||
.filter((key) => key !== "color")
|
||||
}
|
||||
change={(key, value) => {
|
||||
group.renderParameter[key as any] = value;
|
||||
this.props.status?.changeGroupAttrib(
|
||||
group.id, "renderParameter", group.renderParameter
|
||||
);
|
||||
}}
|
||||
/>
|
||||
|
||||
<Message i18nKey="Common.Attr.Title.Behaviors" isTitle/>
|
||||
|
||||
|
@ -8,6 +8,7 @@ import { ColorInput } from "@Input/ColorInput/ColorInput";
|
||||
import { TogglesInput } from "@Input/TogglesInput/TogglesInput";
|
||||
import { LabelPicker } from "@Input/LabelPicker/LabelPicker";
|
||||
import { ConfirmPopup } from "@Component/ConfirmPopup/ConfirmPopup";
|
||||
import { Parameter } from "@Input/Parameter/Parameter";
|
||||
import "./RangeDetails.scss";
|
||||
|
||||
@useStatusWithEvent("rangeAttrChange", "focusObjectChange", "rangeLabelChange")
|
||||
@ -72,6 +73,23 @@ class RangeDetails extends Component<IMixinStatusProps> {
|
||||
}}
|
||||
/>
|
||||
|
||||
<Parameter
|
||||
key={range.id}
|
||||
option={this.props.status?.renderer.cubeParameterOption ?? {}}
|
||||
title={"Common.Attr.Title.Render.Parameter"}
|
||||
value={range.renderParameter}
|
||||
renderKey={
|
||||
Object.getOwnPropertyNames(this.props.status?.renderer.cubeParameterOption ?? {})
|
||||
.filter((key) => key !== "color")
|
||||
}
|
||||
change={(key, value) => {
|
||||
range.renderParameter[key as any] = value;
|
||||
this.props.status?.changeRangeAttrib(
|
||||
range.id, "renderParameter", range.renderParameter
|
||||
);
|
||||
}}
|
||||
/>
|
||||
|
||||
<Message i18nKey="Common.Attr.Title.Spatial" isTitle/>
|
||||
|
||||
<AttrInput
|
||||
|
Loading…
Reference in New Issue
Block a user